MENU

解决MySQL异常Communications link failure

2018 年 07 月 25 日 • 杂乱文章

emmmm,最近线上又新上了一套系统,还没有正式开跑,没什么访问量,都是内部人员在用,然而近日出了一个比较蛋疼的问题,查看系统的监控,会发现DB不定期的会凉。

而且只是个别项目会提示DB凉了,每次DB凉了20~30秒后又会回到up状态,大概看了一下,提示DB凉了的项目大概分布在8台业务服务器上,绝大部分都没事,业务服务器大概在40台左右,然后连接到出问题的业务服务器,看了一眼那个时间段的项目log,重点就是Communications link failure,然后在elk里面检索了一下,显示DB凉了的服务器都是抛的这个错。

确认了不是代码问题,然后我这里开排查,谷歌了一下,解决办法绝大都是修改MySQL的wait_timeout参数,然后我这头也适当的调大了一些,然后看效果,也是偶发性的,没法手动测,晚上下班之前改的,第二天早晨来发现还有报错,最后把wait_timeout参数调到了最大值,也就是1年,但是没什么卵用,还是有抛错,看来是和这个参数没啥太大关系,然后又把该值调回了默认,也就是8小时,下面就得排查系统问题了。

系统的话看上去也木有啥子问题,一切运行正常,直到开发的大哥问我你是不是开防火墙了,我说木有撒,都是用安全组去控制的,然后突然想TCP存活的问题,也就是TCP keepalive,涉及到了一个内核参数,net.ipv4.tcp_keepalive_time,我记得在我的环境部署脚本里面有这个参数,但是设置的是多少我也忘了,打开我的脚本,发现设置的是1200,也就是20分钟,为毛这么低,仔细想了一下特么的那个是针对一套高并发DSP系统去写的,我是拿过来直接用了,然后用ansible批量检索了一下,全部服务器都是1200,那只好批量改了一下试试咯,改成2小时,默认的就好,需要使用ansible的lineinfile模块了,直接用sed命令也阔以。

[root@ansible ~]# ansible server -m lineinfile -a "dest=/etc/sysctl.conf regexp="net.ipv4.tcp_keepalive_time=1200" line="net.ipv4.tcp_keepalive_time=7200""
[root@ansible ~]# ansible server -m shell -a "cat /etc/sysctl.conf | grep net.ipv4.tcp_keepalive_time"
[root@ansible ~]# ansible server -m shell -a "sysctl -p"

改完以后一切恢复正常。

最后编辑于: 2018 年 12 月 10 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码