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

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 时间差这么多?然后加了行日志系统又自动恢复了?诡异,太诡异了,说没有鬼我是不信的

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

10099 次点击
所在节点    Java
81 条回复
twl007
2021-09-09 13:57:44 +08:00
当年阿里云遇到过一个类似的事情 也是数据库没有报警 但是速度变得非常慢 导致我们的 redis 里面大量的数据没有写回到 rds

开工单给阿里云 答复说那台 rds 的硬盘出现了问题 已经帮忙做了主从切换 遂解决 😑
teliang
2021-09-09 14:01:27 +08:00
@liyunyang 阿里的 Arthas
teliang
2021-09-09 14:03:23 +08:00
@zoharSoul #16 窝草,我看了一下,方法没有加事务注解
cking
2021-09-09 14:10:40 +08:00
我们也遇见过打死整个服务的 具体后面来查的时候 就是因为 tomcat 里面的线程(还是其他啥的) 有 200 个请求等待,导致后续的请求进来了之后就开始排队. 实际上 sql 并不慢 是 tomcat 里面的请求线程满了 你增加了日志以后 打包发版本 相当于就是重启了 tomcat 所以就会释放掉当时请求进来的一些 我们当时是 修改了 tomcat 的最大线程是 800(默认是 200) 后续就再也没有出现过这个问题了
fkdtz
2021-09-09 14:35:33 +08:00
用的量子计算机?当你试图监控它时,它就表现出相反的结果。

感觉不是这行代码的事儿,当时 DB 的资源占用怎么样?或者连接池被耗尽?猜测耗时大部分是在等待资源。

代码还原到当时的版本,在模拟环境搞个压测看看能否复现?
Lemeng
2021-09-09 14:44:17 +08:00
@villivateur 真有这种事,离奇
snownarrow
2021-09-09 14:49:12 +08:00
@defunct9 “开 ssh,让我上去看看” 发现这都快成为你的口头禅了
zhoudaiyu
2021-09-09 14:55:14 +08:00
@defunct9 哪都能看到你🐶
defunct9
2021-09-09 15:52:12 +08:00
@zhoudaiyu @snownarrow 是我,是我,还是我
SilenceLL
2021-09-09 16:01:56 +08:00
我们碰到过引用的 mysql 连接池满了, 重启服务以后就好了,,可能应用配置的连接池满了,拿不到连接了,但是 navicat 连接不走应用连接池所以没问题?
redford42
2021-09-09 16:09:11 +08:00
只有做好监控日志静待复现了
proxychains
2021-09-09 16:15:45 +08:00
@villivateur 离谱
Smallsun1231
2021-09-09 16:20:28 +08:00
@defunct9 #10 虽迟但到
patx
2021-09-09 17:07:06 +08:00
很多情况下,sql 执行慢不是 sql 有问题,可能是连接池满了,获取新的连接会等待空闲连接。如果一直拿不到,会等到超时。
lizuoqiang
2021-09-09 17:13:56 +08:00
有没有想过是 K8S 某个 Node 出问题了。
kindjeff
2021-09-09 17:14:43 +08:00
MySQL 监控没问题么
popop1
2021-09-09 17:31:31 +08:00
曾经双 11,阿里聚石塔部分硬盘出现过问题.切换后遂解决
peanutcheeseball
2021-09-09 17:37:59 +08:00
蹲个后续
zhuweiyou
2021-09-09 17:38:32 +08:00
@villivateur 一样遇到过, 然后把注释删了 也正常了.
lei2j
2021-09-09 17:42:46 +08:00
@defunct9 我就服你

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

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

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

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

© 2021 V2EX