1. 文章背景:
当前客户使用的是私有云厂商提供的负载均衡,在创建负载均衡监控时,有一项配置 连接超时时间,该配置最大值为900秒,该配置的说明: 配置TCP连接超时,连接空闲时间超过该时长后,负载均衡会主动断开该连接。
下图是负载均衡配置页面:
经查询数据库得知,业务通过负载均衡连到数据的连接,超过900秒后连接仍然存在,因此客户需确认TiDB数据库是否会向客户端定时发送探活消息。如下图:
客户使用客户端工具连接数据库,超过900秒以上无操作,连接也不会断开。
客户当前的疑问是上述配置是否会影响数据库的连接,导致数据库的空闲连接在某些情况下因该超时参数而断开?
2. 探索结论:
结论先行:
1 TiDB 通过 tcp-keep-alive参数开启tcp的keep alive,参数默认为true,行为是 每15秒发送一次TCP Keep-Alive 探测包。
2 经负载均衡厂商售后工程师反馈上述探测包会影响负载均衡的连接超时时间。
3. 探索过程:
为了观察TiDB 是否会对数据库连接进行探活,首先我们在本地启动一个TiDB。
go run /Users/xxxxxx/vscode-workspace/tidb/tidb-server/main.go
然后我们在本地启动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秒后连接不会断开。