一次业务Connection is not available, request timed out after 30000ms线上故障排查记录


刚入职公司接触到的第一个项目,应用架构比较简单和无理

1、业务是推送数据到ldap数据库,应用是java写的

2、架构是两台mysql主主复制,haproxy做两台mysql的负载(ps:由于应用代码的逻辑,导致haproxy只能把流量切换到一台数据库),keepalived做高可用

3、现象是:业务端日志总是提示Connection is not available, request timed out after 30000ms,几率出现的大小为30%~50%之间,线上服务器没有监控

4、由于没有任何的监控系统,所有信息都只有从头收集,第一步检查了应用和vip之间的网络,直接用的ping,查看后均正常,第二步,查看mysql日志,未见任何异常日志,当时操作系统操作非常流畅,完全不卡顿,就没想到查看服务器负载,于是未发现问题,进行再次同步数据,现象依然存在,重复检查网络、日志均正常,iftop查看流量,也能看见流量到达数据库服务器,但是就是应用报连接数据库超时,此时检查服务器负载,居然达到60 58 40,8c16g的服务器,负载居然跑到这么高,当时就惊呆了!于是ps -ef 查看果然是mysql占用的,此时只能查看mysql中的进程,查看高负载时运行的语句:show processlist,查看到有10+的一条语句在select状态,再一查,变成sending data 状态,于是赶紧打开慢日志,一看果然是这条语句,查询时间多达6s,句子很复杂,只有让研发处理,要么优化语句,要么加索引,要么加缓存逻辑

set global slow_query_log='ON';
set global slow_query_log_file='/var/log/mysql/slow.log';
set global long_query_time=1; #超过一秒就记录
配置文件的慢日志配置
  • [mysqld]
  • slow_query_log = ON
  • slow_query_log_file = /var/log/mysql/slow.log
  • long_query_time = 1


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM