TiDB 无法维持长连接

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.4
  • 【问题描述】:

最近在做一个把 MySql 数仓往 TiDB 迁移的项目,在迁移跑报表的存储过程代码时遇到一个问题,发送代码到 TiDB 的客户端无法和 TiDB 维持长时间的连接,这导致无法判断已经发送(需要运行很长时间)的代码是否已经完成,不知道能否启动下一步的操作。

目前看来和 TiDB 的连接在无交互的情况下最多只能维持 10几分钟,但复杂报表的一些计算环节,耗时半个小时以上甚至几个小时都是正常的。

有什么办法解决么?

对了,命令行的方式我试过添加 --wait --reconnect --connect-timeout=43200 这些参数,

mysql -u user -px xxxxxxxxxxx --host=172.16.150.113 --port=4000 --wait --reconnect --connect-timeout=43200 testdb -e “xxxx”

但没有达到效果。

TiDB 中有 wait_timeout 和 interactive_timeout 参数用于控制空闲连接保持时长

另外可以检查一下 Linux 服务器内核参数中 tcp 超时时间的设置

嗯,TiDB 里的 wait_timeout 和 interactive_timeout 已经看过,是 2880000,应该不至于造成超时断开。
Linux 里的设置我看一下

Linux 的 keep alive 设置看起来是这样的,

我看网上有介绍说这代表 120 秒后开始发送第一个 keep alive pocket,以后每隔 15秒发送一次,是这个意思么?

p.s. 客户端和服务器端的 linux 都是这个设置。

可以确认一下 TCP 连接的 keepalive 机制是否开了 sysctl -p | grep keepalive

确认一样,

  1. 目前看来和 TiDB 的连接在无交互的情况下最多只能维持 10几分钟,但复杂报表的一些计算环节,耗时半个小时以上甚至几个小时都是正常的— 从您的描述来看,请确认客户端和tidb集群之家是否有防火墙 ; 请问是否使用了HAproxy之类的代理?

嗯,好像经过了 HAProxy,我绕开 HAProxy 直连一下看看。

好的,观察反馈后,我们再继续查看,多谢

直连后维持了挺长一段时间,有一个多小时,最后报这个异常退出了

ERROR 1105 (HY000) at line 2: conn1031317 txn takes too much time, txnStartTS: 415641585459134528, comm: 415642879323275302

从报错信息来看,报错的原因是超过《单个事务允许的最大执行时间:590 秒》,参考这里

这个单个事务允许的最大执行时间参数 max-txn-time-use,为什么要加这个限制

超时是常规的设计,防止单个事务长期占用资源不释放、系统资源耗尽导致系统崩溃

我知道数据库有很多超时的设置,像空闲连接超时,空闲事务连接超时,如果是空闲事务超时很好理解,但你这个是单纯的长事务时间长度设置,并不是专指空闲事务,那如果有很长的分析性的sql执行,需要提前调整这个参数是吗?

另外,有一个地方我不太明白,我用下面这样的查询想测一下它究竟能维持多长时间的连接,

mysql -u xxxxxxx -p******* --host=172.16.150.99 --port=4000 --wait --reconnect --connect-timeout=43200 mongo -e "select sleep(18000); – [long_sleep_test] " >> /d1/log/tmp/long_sleep_test.log 2>&1 &

但是它(客户端)挺快就退出了,(没有报错,服务器端仍在跑),可能最多也就 20~30 分钟,比我跑的那个实际的 insert ... select ... 时间短很多。

select sleep(18000); 这个 SQL 有什么特殊吗?

  1. 这个问题和开始的问题没有什么关系,像这种新的问题,还是建议可以开一个新帖子来继续探讨,多谢.
  2. sleep函数是等待多长时间,这个时候不返回数据,客户端和服务器这边有参数或者防火墙断开了.

嗯,这个问题只是随口一问。不过我后来又做了尝试,这次跑了2个多小时还没断,看起来不错。
多谢支持!! :+1:

:handshake: