记录一个诡异的线上宕机事故,大佬们帮忙排查一下问题呀

2021-09-09 11:48:14 +08:00
 teliang

环境

二三十个微服务 SpringBoot+Dubbo 部署在阿里的 K8S 上,数据库也是买的阿里的 RDS,听领导说配置还挺高的,支持主备自动切换什么的。

事故起因和经过

大版本上线,改了用户的缓存数据结构,凌晨上线时把 Redis 用户缓存全清了,上线当晚验证功能正常,白天运行也十分稳定。

下午 5 点多业务高峰的时候运营反馈系统蹦了,看后台是数据库负载正常、Dubbo 调用全部超时,领导首先怀疑是系统被攻击了,然后在阿里的后台打开了防火墙增强模式(具体叫什么不懂,效果是可以阻拦大部分到 Nginx 的请求),开完观察了好久后台调用还是超时,老板都开始炸锅了跑来了解情况,领导开始尝试万能的重启大法,ZK 的三个节点都重启了,微服务也挨个重启,绝望的是重启依然没有任何效果。

一顿瞎搞时间很快就到了晚上 8 点,这时候已经宕机 2 个多小时了还没找到原因,也不知道怎么恢复。然后我试着用 Arthas 监控了一下调用时间,发现主要业务流量入口 M 服务调用 Cache 服务一直超时,调用 C 主要是 M 从 Redis 获取不到用户缓存,需要 C 构建缓存放 Redis 。监控 C 服务的时候发现所有请求数据库的耗时都要 2000ms 以上,然后我们构建缓存需要读 8~9 次数据库但是 Dubbo 的超时时间设的是 10s 所以一直超时。

诡异事件

首先怀疑是 SQL 写的有问题,但是有一个根据主键 ID 查询单表的居然也要 2000+ms,这就非常离谱了,后面我把参数打出来自己拼接 SQL 用 Navicat 查询只要十几毫秒,领导说可能是工具监控有问题,然后当场给这个查询加调用时间的日志验证,从 master 拉的分支,只加了一行日志!!!

然后,重新发包观察,诡异的是,系统恢复正常了!!!没有调用超时的日志,新加的那行日志打印出来的也是十几毫秒,其他服务也能正常调用了!!!

事故报告

领导给的事故报告是晚上清除用户缓存,没有预先跑脚本构建缓存导致业务高峰期系统宕机。

疑惑

为什么那个时间点 Navicat 和微服务查询同一条 SQL 时间差这么多?然后加了行日志系统又自动恢复了?诡异,太诡异了,说没有鬼我是不信的

大佬们来帮忙排查一下这可能是什么原因呀

10418 次点击
所在节点    Java
81 条回复
towry
2021-09-10 08:41:36 +08:00
阿里云的锅
raptor
2021-09-10 09:17:25 +08:00
有一定概率是阿里云的锅
Xavi1996
2021-09-10 09:19:20 +08:00
插眼看最后定论
jorneyr
2021-09-10 09:22:04 +08:00
K8S 的网络很魔幻的,我遇到过从 Pod 内部访问其他 Pod 很慢,从宿主机访问其他 Pod 就正常,而且不是一直这样。
buster
2021-09-10 09:30:21 +08:00
有个疑问的地方前面有兄弟说是服务连接池被占了,加了日志重新发布链接清掉了,但是前面也重启过啊,感觉对不上。
bsg1992
2021-09-10 09:38:49 +08:00
不可能是连接池满导致查询满 服务器都重启了。正常来说连接肯定都是释放的。我怀疑是内部网络问题
pkoukk
2021-09-10 09:53:39 +08:00
瞎猜有一定概率是 K8s 某个 node 到 db 有问题,重启,调度还在这个 node 上
改代码之后是重新部署,调度到了别的 node 上,然后就正常了
X0ray
2021-09-10 09:54:59 +08:00
有没有看过 redis 连接数,redis 连接泄露的问题需要关注下。
luwill
2021-09-10 10:09:51 +08:00
大概率 mysql 连接池满了,重启连接池清空了。应该还会复发,看出问题前的请求日志,当天的 mysql 慢日志。
securityCoding
2021-09-10 10:11:57 +08:00
1. 调用 cache 为什么会超时呢?是不是 redis 没连接了
securityCoding
2021-09-10 10:15:38 +08:00
@luwill 应该不是,看问题描述先从缓存取数据失败(超时)导致大量请求直接查 db 导致 db 压力过大.直接原因大概率是 redis 获取不到连接
u011631336
2021-09-10 10:17:05 +08:00
大概率是跟数据库有关系,存在锁、事务的原因比较大
joApioVVx4M4X6Rf
2021-09-10 10:23:25 +08:00
求结果
repus911
2021-09-10 10:35:27 +08:00
有没有可能是应用数据库链接池设置的比较小
wineast
2021-09-10 11:00:41 +08:00
大概率是因为重新部署起了作用,而不是那一行代码,至于重新部署部署导致了 node 节点的重新分配还是数据库连接的重新连接,不确定
3kkkk
2021-09-10 11:37:40 +08:00
通过 actuator 看下每个服务线程占用情况。应该是哪里阻塞了。
qq1340691923
2021-09-10 13:58:58 +08:00
我也想说连接池打满了,可作者他们试过了重启啊
superliuliuliu1
2021-09-10 15:33:19 +08:00
是小鹅通吗?听说昨天下午小鹅通崩了
PDX
2021-09-10 15:39:44 +08:00
如果重新构建缓存,很可能打满连接池,这种情况很常见。
aoxiansheng
2021-09-10 15:42:15 +08:00
数据库也是买的阿里的 RDS 。原来我们的业务用 RDS 就卡死。用自建就正常。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/800791

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX