数据库服务器宕机2小时之"找不出原因"

背景:#

昨天公司网站 19:50 分开始出现访问延迟,20:00 左右的时候 PHP 已经开始吐 too many conections 错误,导致所有网页都是 500 Error。

服务器配置:#

Web 服务器有 8 台,数据库服务器有 3 台(1 master, 2 slave),标准的 LAMP 架构,CentOS6(Apache), PHP5.4, MariaDB

详细情况:#

web 服务器 tcp connection 和 CPU 负载率都很正常,没有超出正常范围,主要是 1 号 slave 数据库服务器出现了 Connection 满载,CPU 飙升到 100%,导致处理速度变慢,从而没有响应的问题,master 和 2 号 slave 数据库虽然负载升高,但 CPU 远没有达到 100%

尝试了的方法:#

  1. 把 slave1 号下架,发现所有负载集中到了 slave2 号,直到 CPU 100% 以后网站挂掉
  2. 把 slave1,2 号全部下架,发现 master 一个服务器足以处理所有请求,网站恢复正常
  3. 重新上架 slave1,2 号,又出现 slave1 号一个服务器 CPU 满载的情况,网站挂掉
  4. 最后没有办法,只好让 master 一个数据库服务器顶着,至少网站可以正常运行

找寻问题:#

因为新年第一天网站就挂掉,上边给的压力非常大,务必要在今天内找出问题原因,但是毫无头绪啊。。
主要是因为两点

  1. 为什么只有 1 号 slave 服务器升高,2 号却没有问题?
  2. 为什么一个 master 可以正常服务,跟两个 slave 一起上就出现问题(3 个服务器都是 24 核 64G 一样的配置)

至今都好好的,也没搞什么特别的活动,为什么突然会挂掉?新年是不是有什么变化?
大家有没有遇到过类似现象呢?多谢了:sob:

后续:#

经过一整天的排查和修改 (主要修改了慢查询),最终解决了负载问题
但是没能精确定位问题,下次还有可能发生,只能督促所有人写 sql 的时候注意在线上环境执行 (因为很多 sql 是用 query builder 连接起来的,不同的情况会出现不同的 sql,从而导致不走 Index 直接查询全表,或者大量的 file sort) 会不会有问题,多 explain 优化一下了

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 9

如果有读写分离的逻辑的话,猜测应该是代码问题,只用 master 的话,没有数据不一致的问题,此时代码逻辑运行正常,加上 slave 之后,由于主从同步,刚写完数据还没有同步,代码里直接查查不到,走了错误逻辑,此时逻辑有问题,导致慢查询或其他什么情况,连接数飙升。

4年前 评论
ikin 4年前
songxue77 (楼主) 4年前
JeffreyBool

连接用完了啊,是不是没有连接池啊。。

4年前 评论
songxue77 (楼主) 4年前

试试看下配置的最大连接数和慢查询日志。

4年前 评论
songxue77 (楼主) 4年前

是不是有啥队列内存泄漏了,没释放 mysql 资源

4年前 评论
songxue77 (楼主) 4年前

mysql 配置都一样吗

4年前 评论
songxue77 (楼主) 4年前
yema

新年第一天 会不会和系统或者代码里关于时间的有关系 总之是连接过多,旧链接没释放,或者是死循环

4年前 评论
songxue77 (楼主) 4年前

如果有读写分离的逻辑的话,猜测应该是代码问题,只用 master 的话,没有数据不一致的问题,此时代码逻辑运行正常,加上 slave 之后,由于主从同步,刚写完数据还没有同步,代码里直接查查不到,走了错误逻辑,此时逻辑有问题,导致慢查询或其他什么情况,连接数飙升。

4年前 评论
ikin 4年前
songxue77 (楼主) 4年前
fatrbaby

有没有考虑不过查看一下 tpc backlog 和 somaxconn

4年前 评论
songxue77 (楼主) 4年前

24 核 64G 这个服务器配置有点 6,应该是哪里代码问题 看看 php 日志

4年前 评论
songxue77 (楼主) 4年前

考虑 redis 数据缓存??

4年前 评论