刚入职公司接触到的第一个项目,应用架构比较简单和无理
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