当前位置: 首页 > 科技观察

一次Mysql改表导致LVS下所有RS机器下线的问题

时间:2023-03-19 23:02:59 科技观察

一天下午,我在代码上苦苦挣扎,突然收到一个告警信息,警告我们某业务电信机房LVS下的所有RS机器都下线了。第一时间查看机器的负载情况,发现CPUIDLE在80%左右,其他指标也都正常;怀疑是LVS的KeepAlive程序有问题。在管理平台点击RS上线,发现服务已经恢复。所以没有深究,只反馈给了OPS的同学。然而仅仅过了半个小时,同样的告警又来了,看来还得找根源了。选择一台机器留在现场,其他机器在管理平台上操作,保证有足够的调查时间。首先查看Nginxallweb.log中lvscheck相关的日志,发现状态码都是499,request_time达到5s:[tabalt@server01~]$tail-100/data/nginx/logs/allweb.log|greplvscheck10.18.42.29205.000[s]--[12/Jul/2017:18:29:18+0800]"GET/status.phpHTTP/1.0"499-"-""KeepAliveClient"lvscheck.domain.com10.20.12.60--10.18.42.29205.000[s]--[12/Jul/2017:18:29:22+0800]"GET/status.phpHTTP/1.0"499-"-""KeepAliveClient"lvscheck.domain.com10。20.12.60--10.18.42.29205.000[s]--[12/Jul/2017:18:29:24+0800]"GET/status.phpHTTP/1.0"499-"-""KeepAliveClient"lvscheck.domain.com10.20.12.60--...原来KeepAlive程序请求http://lvscheck.domain.com/status.php页面检测服务状态时,5秒后没有收到响应,于是主动断开请求并使RS脱机。但是机器很空闲,为什么/status.php进程超过5s?查看PHP-FPM日志,发现有报错/data/www/front/index.php文件executionisveryslow:[tabalt@server01~]$tail/data/php/log/php-fpm.log12-Jul-201718:29:18]警告:[poolwww]child3988,脚本'/data/www/front/index.php'(请求:“GET/index.php”)执行速度慢(11.301960sec),日志记录[12-Jul-201718:29:22]警告:[poolwww]child3945,脚本'/data/www/front/index.php'(请求:“GET/index.php”)执行太低(11.863325sec),记录[2017年7月12日18:29:24]警告:[poolwww]child3887,脚本'/data/www/front/index.php'(请求:“GET/index.php”)执行太低(10.498795sec),logging...但是/data/www/front/index.php只是一个入口文件,从这个日志看不出问题,再查看PHP-FPM的慢日志:[tabalt@server01~]$tail-100/data/php/log/www.log.slow...script_filename=/data/www/front/index.php[0x00007fecbd613f90]execute()/data/www/vendor/andals/vine/src/组件/Mysql/Driver.php:218[0x00007fecbd613ec0]doExecute()/data/www/vendor/andals/vine/src/Component/Mysql/Driver.php:66[0x00007fecbd613df0]query()/data/www/vendor/andals/vine/src/Component/Mysql/Dao/Base.php:206[0x00007fecbd613d80]simpleQuery()/data/www/src/app/Model/Dao/Base.php:65[0x00007fecbd613cc0]selectByParamsForFront()/data/www/src/app/Model/Svc/SqlBase.php:211[0x00007fecbd613c10]selectByParamsForFront()/data/www/src/app/Model/Svc/Category.php:214。..[0x00007fecbd613580]getEsData()/data/www/src/app/Controller/Front/ListController.php:26[0x00007fecbd613400]indexAction()/data/www/vendor/andals/vine/src/Framework/App/Web.php:107[0x00007fecbd613380]call_user_func_array()/data/www/vendor/andals/vine/src/Framework/App/Web.php:107[0x00007fecbd613290]runController()/data/www/vendor/andals/vine/src/Framework/App/Web.php:73[0x00007fecbd6131b0]handleRequest()/data/www/vendor/andals/vine/src/Framework/App/Web.php:48[0x00007fecbd6130f0]run()/data/www/src/run/front/index.php:6可以看到最后SQL的执行很慢。查看管理平台,发现在告警的两个时间点,MySQL从库的QPS突然降为0,而主库的QPS突然大幅下降。抬高了,这么快反馈给DBA同学DBA同学检查后发现当前读写量比较大,并且有一个新字段的relabeling语句正在运行,停止后问题恢复;而主从库QPS的突然变化是由于Proxy运行起来导致从库下线延迟较大。经过梳理,我们发现目前有一个Task程序正在批量导入数据到数据库中,表中有很多数据(***)。在这种情况下,更改表会导致数据库响应缓慢;缓存和SQL语句执行超时设置也有问题,最终导致PHP-FPM进程卡死,没有空闲进程处理LVS健康检查页面,LVS下的RS机器完全下线.之后我们对发现的问题进行修复,在没有大量访问的情况下提交修改表操作,成功完成修改表。