matrixone
matrixone copied to clipboard
[Feature Request]: support variable wait_timeout and interactive_timeout
Is there an existing issue for the same feature request?
- [X] I have checked the existing issues.
Is your feature request related to a problem?
https://github.com/matrixorigin/MO-Cloud/issues/1817 中发现有大量空闲连接,有客户端使用的问题,也有Server段长时间没有断开空闲连接的问题;
对于mysql 又来就有相关的机制,可以断开空闲的长连接,建议对齐 MO与 mysql的相关机制 感谢 @daviszhen 提供Mo相关的细节
Describe the feature you'd like
请支持mysql在 server端关闭空闲连接的timeout参数: wait_timeout 和 interactive_timeout
两者存在覆盖关系的, 需要特别注意的是 interactive_timeout 参数:
- interactive_timeout 是用来覆盖 wait_timeout 的, 不直接影响超时行为
- 生效的时刻时, 使用
mysql_real_connect()c-api, 并指定CLIENT_INTERACTIVE connect option.
已知使用场景, 与 interactive_timeout 关联关系如下
| bin / sdk | 不支持 | 相关参数说明 |
|---|---|---|
| c-api | 支持 | mysql_real_connect() |
| mysql-client | 支持 | - |
| go-sql-driver | 不支持 | https://pkg.go.dev/github.com/go-sql-driver/mysql#readme-connection-pool-and-timeouts |
| jdbc/mysql | 支持 | https://dev.mysql.com/doc/connectors/en/connector-j-connp-props-connection.html#cj-conn-prop_interactiveClient |
Describe implementation you've considered
兼容mysql 语法,控制server 端断开空闲连接的机制。
Documentation, Adoption, Use Case, Migration Strategy
No response
Additional information
需要进一步讨论
- 是否需要支持 interactive_timeout ?
- 当用户的连接设置了 wait_timeout = 1 (s) 时,云平台如何控制?
- 如何控制公有云环境下设置该参数的权限。
整理了这块的内容。
- wait_timeout与interactive_timeout系统变量
- 场景
- wait_timeout 非交互client,类似jdbc
- interactive_timeout 交互client。client设置CLIENT_INTERACTIVE选项。类似mysql client。
- GLOBAL行为禁止
- 语义
- wait_timeout表示server从连接读取数据的最大等待时间。
- 超时。server主动关闭连接
- 非交互client,wait_timeout生效。
- 交互client,wait_timeout被interactive_timeout覆盖。
- 具体行为
- 测试方法
- show variables like '%_timeout';show global variables like '%_timeout';
- set session wait_timeout = 10;
- set session wait_timeout = 10;
- mysql client (交互)
- session级修改
- session.wait_timeout 28800->10
- conn断开
- session.interactive_timeout 28800->10
- conn没断开
- global级修改
- global.wait_timeout 28800->10
- 当前conn,
- session.wait_timeout 28800,session.interactive_timeout 28800
- global.wait_timeout 10,global.interactive_timeout 28800
- 不断开
- 新conn,
- session.wait_timeout 28800,session.interactive_timeout 28800 (session.wait_timeout第一次被覆盖。后续改session.wait_timeout不会覆盖)
- global.wait_timeout 10,global.interactive_timeout 28800
- 不断开
- global.interactive_timeout 28800->10
- 当前conn,
- session.wait_timeout 28800,session.interactive_timeout 28800
- global.wait_timeout 28800,global.interactive_timeout 10
- 不断开
- 新conn,
- session.wait_timeout 10, session.interactive_timeout 10(session.wait_timeout第一次被覆盖。后续改session.wait_timeout不会覆盖)
- global.wait_timeout 28800,global.interactive_timeout 10
- 断开
- jdbc (非交互)
- session级修改
- session.wait_timeout 28800->10
- 断开
- session.interactive_timeout 28800->10
- 不断开
- global级修改
- global.wait_timeout 28800->10
- 当前conn,
- session.wait_timeout 28800,session.interactive_timeout 28800
- global.wait_timeout 10,global.interactive_timeout 28800
- 不断开
- 新conn,
- session.wait_timeout 10,session.interactive_timeout 28800
- global.wait_timeout 10,global.interactive_timeout 28800
- 断开
- global.interactive_timeout 28800->10
- 当前conn
- session.wait_timeout 28800,session.interactive_timeout 28800
- global.wait_timeout 28800,global.interactive_timeout 10
- 不断开
- 新conn,
- session.wait_timeout 28800, session.interactive_timeout 10
- global.wait_timeout 28800,global.interactive_timeout 10
- 不断开
- 方案
- 交互
- session.wait_timeout只会在新连接登录时,第一次被覆盖。后续改session.wait_timeout 立即生效且不会被覆盖。
- show variables 能看到被覆盖wait_timeout值。
- set var session wait_timeout 能及时生效。
- 关闭云上GLOBAL.wait_time和interactive_time的设置。
- 连接建立时,就要取interactive_time。
- 但此时租户还没登录。
- 用代码默认值24小时。
- 租户登录成功后。租户mo_mysql_compatibility_mode中的值。
- 再覆盖session.wait_timeout
@yangj1211 please check with @LiSong0214 with this feature's behavior.
还没实现.
suggest delay to 2.1.0