matrixone icon indicating copy to clipboard operation
matrixone copied to clipboard

[Feature Request]: support variable wait_timeout and interactive_timeout

Open xzxiong opened this issue 2 years ago • 3 comments

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_timeoutinteractive_timeout

两者存在覆盖关系的, 需要特别注意的是 interactive_timeout 参数:

  1. interactive_timeout 是用来覆盖 wait_timeout 的, 不直接影响超时行为
  2. 生效的时刻时, 使用 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

需要进一步讨论

  1. 是否需要支持 interactive_timeout ?
  2. 当用户的连接设置了 wait_timeout = 1 (s) 时,云平台如何控制?
  3. 如何控制公有云环境下设置该参数的权限。

xzxiong avatar Nov 24 '23 10:11 xzxiong

整理了这块的内容。

  • 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

daviszhen avatar Nov 24 '23 12:11 daviszhen

@yangj1211 please check with @LiSong0214 with this feature's behavior.

dengn avatar Jan 15 '24 10:01 dengn

还没实现.

Ariznawlll avatar Mar 25 '24 08:03 Ariznawlll

suggest delay to 2.1.0

allengaoo avatar Nov 04 '24 04:11 allengaoo