Communications link failure 问题解决

症状

节点挂机一个晚上后会首次请求会 Communications link failure

原因分析

产生 Communications link failure是由于使用了被关闭的数据库连接导致。

关键配置分析

maxEvictableIdleTimeMillis配置,默认25200000毫秒 deruid连接最大存活时间。

minEvictableIdleTimeMillis 300 秒 druid连接最小存活时间

mysql wait_close 时间 8小时

httpProxy连数据库的 代理 超时时间 1000秒

testWhileidle 空闲时间检测配置300秒。300秒检测一次,如果连接年龄大于300秒,则回收。

minIdle 配置为1 连接池最小少保留一个连接。

几种连接会被关闭的情况:

1:当数据库连接超过8小时,会被mysql关闭。

2:当一次查询大量数据超过1000秒,会被httpProxy关闭。

3:连接存活时间大于300秒,并且是空闲的,会被testWhileidle关闭。druid关闭。

综合分析:

基于以上三种关闭情况是不会产生 communications link failure的。但是由于minIdle配置的是1,在druid进行空闲连接清理的时候总有一个被保留,当这个连接超过了mysql_close的8小时后,会被mysql关闭。
此时如果有请求过来,就会使用这个连接,导致 Communications link failure。至此破案。

我们实际情况,就是隔夜后,第二天早上初次请求发生了这种状况。分析过后以上的情况后,建议使用druid的配置注意如下:

  1. 设置maxEvictableIdleTimeMillis(最大生存时间)也要小于数据库连接超时时间1000s
  2. 配置时,mysql的wait_timeout >nginx的 proxy_connect_timeout > druid的maxEvictableIdleTimeMillis.
  3. 优化慢查询,将支付平台可能的最长允许sql执行时间设置给proxy_timeout