线上的一次MySQL server has gone away报错排查

zmisgod 发布于 2019-1-26 18:29:03 阅读 39 评论 0

原因

在10月份的时候,我做的一个项目上线了,但是上线后,Sentry出现了MySQL server has gone away的报错。

报错信息如下:

image

我们项目是有好几个仓库代码,不同的仓库有不同的服务器。这个项目使用了双数据源,一个是主库,一个是副库。只有我的这个服务的服务器出现了这个错误。其他java服务器还有php的服务器都是正常的。

排查

因为我司使用的是阿里云的RDS,所以我第一个想到的是不是数据库的白名单没有配置。因为之前遇到过数据库白名单没有配置导致数据库连接不上。于是找了DBA,发现数据库的白名单都是正常的。

然后怀疑是不是java的连接池设置过大导致占用mysql的链接,以至于php的执行的过程没有多余的数据库连接,建立不了连接导致出现这个情况,于是我又去看了看java设置的连接池的数据,设置的是500,总共有2台,也就是1000,但是问了下DBA,副表的数据库的最大连接数是5000,所以不是这个问题。

于是我登录到了我写的服务的服务器上,一台一台ping了副表的db host,显示都是可以ping通的,比较诡异的问题。。。

发现问题

此时与我们一起一同排查的java大佬发现了问题。他先登录到了一台服务器中,tenet 这个副表的数据库地址,没问题,然后准备在服务器中安装一个mysql的客户端(我也想安装,可惜权限不够),然后发现这台服务器的mysql客户端无法连接到副表的数据库。。。然后让DBA将这台机器的白名单重新设置下,然后奇迹出现了,过了两天都没有MySQL server has gone away的错误。

结果

原来是因为RDS的白名单有bug导致服务的一台机器虽然能ping通,但是不能连接到mysql里,导致了MySQL server has gone away的错误。

总结

这个故事告诉我们及时是阿里云这种大厂也是会有bug的,所以不要随意相信他们,要动手试试。才能找到结果。