记一次线上MySQL+keepalive主从切换导致的断联
告警/现象
我们的一个程序在一次MySQL 发生主从切换后直接与MySQL失去连接,且无法自恢复,只能重启程序。
排查
- 我们使用的是Springboot默认的连接池HiKari,经排查所使用的版本没有出现致命bug。
- 导火索是数据库发生主从切换,且随时间推进,没有任何恢复连接的迹象,netstat监控表明程序并没有尝试重新连接数据库。
- 程序日志所报错误没有明显特征,均是业务查询超时报出来的错误。
最终
该问题由数据库发生主从切换后,连接池没有及时丢弃原有连接导致。
数据库连接缺少心跳机制,主从切换后,程序仍认为连接是正常的,没有新建新的连接。
解决的方法是在连接参数上设置connectTimeout和socketTimeout参数。可能会对原本就需要长时间的查询造成影响。
应有更好的方法淘汰这些僵尸连接,目前暂未发现。