症状
节点挂机一个晚上后会首次请求会 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的配置注意如下:
- 设置maxEvictableIdleTimeMillis(最大生存时间)也要小于数据库连接超时时间1000s
- 配置时,mysql的wait_timeout >nginx的 proxy_connect_timeout > druid的maxEvictableIdleTimeMillis.
- 优化慢查询,将支付平台可能的最长允许sql执行时间设置给proxy_timeout