TiDB 连接的探活功能探索
作者: yangzhj 原文来源:https://tidb.net/blog/3d5563cb
1. 文章背景:
当前客户使用的是私有云厂商提供的负载均衡,在创建负载均衡监控时,有一项配置 连接超时时间,该配置最大值为 900 秒,该配置的说明: 配置 TCP 连接超时,连接空闲时间超过该时长后,负载均衡会主动断开该连接。
下图是负载均衡配置页面:
经查询数据库得知,业务通过负载均衡连到数据的连接,超过 900 秒后连接仍然存在,因此客户需确认 TiDB 数据库是否会向客户端定时发送探活消息。如下图:
客户使用客户端工具连接数据库,超过 900 秒以上无操作,连接也不会断开。
客户当前的疑问是上述配置是否会影响数据库的连接,导致数据库的空闲连接在某些情况下因该超时参数而断开?
2. 探索结论:
结论先行:
1 TiDB 通过 tcp-keep-alive 参数开启 tcp 的 keep alive,参数默认为 true, 行为是 每 15 秒发送一次 TCP Keep-Alive 探测包。
2 经负载均衡厂商售后工程师反馈上述探测包会影响负载均衡的连接超时时间。
3. 探索过程:
为了观察 TiDB 是否会对数据库连接进行探活,首先我们在本地启动一个 TiDB。
然后我们在本地启动 Wireshark 软件开始抓包, 然后通过过滤只显示 tcp4000 端口的数据。见下图:
然后我们通过数据库客户端,连接数据库。见下图:
此时我们发送一个 SQL 命令。见下图:
观察 Wireshark 抓包信息,见下图:
可以看到:第一行红框中,在 time 787 时,数据库向客户端返回了数据。具体数据见右下角红框内数据。
并且可以看到接下来分别在 time 803 818 833 分别发送了 TCP Keep-Alive 探测包。抓包结果说明在当前连接下,TiDB 服务端会每 15s 向客户端连接发送一次 TCP Keep-Alive 探测包。
查询官网得知,Tidb 默认的配置提供 tcp-keep-alive 参数用于 TiDB 在 TCP 层开启 keepalive。该值 默认值:true。
接下来我们看下 TiDB 关于该参数的代码。见下图:
进一步分析得知,TiDB 调用了 go 的 net 包开启 tcp 的 keep alive 。见下图:
进一步查找 golang 的源码可以看到,在 net 包配置了 defaultTCPKeepAlive = 15 * time.Second 。见下图:
至此我们已经确认,默认 TiDB 会对客户端连接每隔 15 秒发送 Keep-Alive 探活包。
下面我们需要咨询下云厂商,咨询该探活是否会影响负载均衡连接超时时间。见下图:
经云厂商售后工程师确认,tcp keep-alive 这种机制就会重新刷新 tcp 的 session,导致超过 900 秒后连接不会断开。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/7a6097a95d0195de145797143】。文章转载请联系作者。
评论