写点什么

快看,我们的分布式缓存就是这样把注册中心搞崩塌的

  • 2020-04-15
  • 本文字数:2389 字

    阅读完需:约 8 分钟

快看,我们的分布式缓存就是这样把注册中心搞崩塌的

写公众号两年以来,每当有机会写故障类主题的时候,我都会在开始前静静地望着显示器很久,经过多次煎熬和挣扎之后才敢提起笔来,为什么呢?因为这样的话题很容易招来吐槽,比如 “说了半天,不就是配置没配好吗?”,或者 “这代码是猪写的吗?你们团队有懂性能测试的同学吗?”,这样的评论略带挑衅,而且充满了鄙视之意。


不过我觉得,在技术的世界里,多数情况都是客观场景决定了主观结果,而主观结果又反映了客观场景,把场景与结果串起来,用自己的方式写下来,传播出去,与有相同经历的同学聊上一聊,也未尝不是一件好事。


上个月,我们的系统因注册中心崩塌而引发的一场事故,本是一件稀松平常的事件,可我们猜中了开始却没料到原因,始作俑者竟是已在产线运行多年的某分布式缓存系统。


这到底是怎么一回事呢?


先来回顾一下故障过程


11 月,某交易日的上午 10 点左右。


在中间件监控系统没有触发任何报警的情况下,某应用团队负责人突然跑过来说:“怎么缓存响应怎么慢?你们在干什么事吗?”


由于此正在交易盘中,中间件运维团队瞬间炸锅,紧急查看了一系列监控数据,先是通过 Zabbix 查看了如 CPU、内存、网络及磁盘等基础预警,一切正常,再查看服务健康状况,经过一圈折腾之后,也没发现任何疑点。


懵圈了,没道理啊。


10 点 30 分,收到一通报警信息,内容为 “ZK 集群中的某一个节点故障,端口不通,不能获取 node 信息,请迅速处理!”。


这简单,ZK 服务端口不通,重启,立即恢复。


10 点 40 分,ZK 集群全部瘫痪,无法获取 Node 数据,由于应用系统的 Dubbo 服务与分布式缓存使用的是同一套 ZK 集群,而且在此期间应用未重启过,因此应用服务自身暂时未受到影响。


没道理啊,无论应用侧还是缓存侧,近一个月以来都没有发布过版本,而且分布式缓存除了在 ZK 中存一些节点相关信息之外,基本对 ZK 无依赖。


10 点 50 分,ZK 集群全部重启,10 分钟后,再次瘫痪。


神奇了,到底哪里出了问题呢?


10 点 55 分,ZK 集群全部重启,1 分钟后,发现 Node Count 达到近 22W+,再次崩溃。



10 点 58 分,通过增加监控脚本,查明 Node 源头来自分布式缓存系统的本地缓存服务。


11 点 00 分,通过控制台关闭本地缓存服务后,ZK 集群第三次重启,通过脚本删除本地化缓存所产生的大量 node 信息。


11 点 05 分,产线 ZK 集群全部恢复,无异常。


一场风波虽说过去了,但每个人的脸上流露出茫然的表情,邪了门了,这本地缓存为什么能把注册中心搞崩塌?都上线一年多了,之前为什么不出问题?为什么偏偏今天出事?


一堆的问好,充斥着每个人的大脑。

我们本地缓存的工作机制

去年,我曾经在 #好买的分布式缓存中间件 # 的内容中对我们的分布式缓存做过相对详细的说明,所以在这里,我就通过系统流程示意图的方式,简要的说明下我们本地缓存系统的一些核心工作机制。


  • 非本地缓存的工作机制



  • 本地缓存的工作机制 - KEY 预加载/更新



  • 本地缓存的工作机制 - Set/Delete 操作



  • 本地缓存的工作机制 - Get 操作



顺带提一句,由于历史性与资源紧缺的原因,我们部分缓存系统与应用系统的 ZK 集群是混用的,正因如此,给本次事故埋下了隐患。

ZK 集群是怎样被搞挂的呢?

说到这里,相信对中间件有一定了解的人基本能猜出本事件的全貌。


简单来说,就是在上线初期,由于流量小,应用系统接入量小,我们本地缓存的消息通知是利用 ZK 来实现的,而且还用到了广播。但随着流量的增加与应用系统接入量的增多,消息发送量成倍增长,最终达到承载能力的上限,ZK 集群崩溃。


的确,原因基本猜对了,但消息发送量为什么会成倍的增长呢?


根据本地缓存的工作机制,我们一般会在里面存些什么呢?


1.更新频率较低,但访问却很频繁,比如系统参数或业务参数。


2.单个 Key/Value 较大,网络消耗比较大,性能下降明显。


3.服务端资源匮乏或不稳定(如 I/O),但对稳定性要求极高。


懵圈了,就放些参数类信息,而且更新频率极低,这样就把五个节点的 ZK 集群发爆了?


为了找到真相,我们立即进行了代码走读,最终发现了蹊跷。



根据设计,在 “本地缓存的工作机制 - Set/Delete 操作” 的工作机制中,当一个 Key 完成服务端缓存操作后,如果没有被加到本地缓存规则列表中的 KEY,是不可能被触发消息通知的,但这里明显存在 BUG,导致把所有的 KEY 都发到了 ZK 中。


这样就很好理解了,虽然应用系统近期没有发布版本,但却通过缓存控制台,悄悄地把分布式锁加到了这套缓存分片中,所以交易一开盘,只需几十分钟,立马打爆。


另外,除了发现 BUG 之外,通过事后测试验证,我们还得出了以下几点结论:


1.利用 ZK 进行消息同步,ZK 本身的负载能力较弱,是否切换到 MQ?


2.监控手段的单一,监控的薄弱;


3.系统部署结构不合理,基础架构的 ZK 不应该与应用的 ZK 混用;



说到这里,这个故事也该结束了。

讲在最后

看完这个故事,一些爱好怼人的小伙伴也许会忍不住发问。你们自己设计的架构,你们自己编写的代码,难道不知道其中的逻辑吗?这么低级的错误,居然还有脸拿出来说?


那可未必,对每个技术团队而言,核心成员的离职与业务形态的变化,都或多或少会引发技术团队对现有系统形成 “知其然而,却不知其所以然” 的情况,虽说每个团队都在想方设法进行避免,但想完全杜绝,绝非易事。


作为技术管理者,具备良好的心态,把每次故障都看成是一次蝉变的过程,从中得到总结与经验,并加以传承,今后不再就犯,那就是好样的。


不过,万一哪天失手,给系统来了个彻底瘫痪,该怎么办呢?


祝大家一切顺利吧。


上周在 TOP100 Summit 大会中,分享了从技术到管理转型路上不同阶段的技巧与挑战,现场有不少人提问:“处于技术转管理的初级阶段,该如何平衡技术能力和管理能力?”的问题。


你是否也有相同的困惑呢?从本月起,我将在我的知识星球中对此话题内容逐一进行详细的案例解读、分析,在实战中磨炼,苦练七十二变,笑对八十一难。


本文转载自头哥侃码公众号。


原文链接:https://mp.weixin.qq.com/s/V_57q7__gii_JK0NITOvEg


2020-04-15 16:40722

评论

发布
暂无评论
发现更多内容

设备健康管理平台如何为企业打造五大核心设备管理体系?

PreMaint

企业设备管理 预测性维护 设备健康管理

Docker常用命令原理与实战

Java-fenn

java;

干货 | Web自动化测试中显式等待与隐式等待该怎么用?

霍格沃兹测试开发学社

干货 | web自动化总卡在文件上传和弹框处理上?

霍格沃兹测试开发学社

干货 | 一文搞定 Docker 容器技术与常用命令

霍格沃兹测试开发学社

实战 | 电商业务性能测试(二): Jmeter 参数化功能实现注册登录的数据驱动

霍格沃兹测试开发学社

干货 | JavaScript脚本注入,完成Selenium 无法做到的那些事

霍格沃兹测试开发学社

同事多线程使用不当导致OOM,被我怒怼了

Java-fenn

Java

云对象 - 重新定义前后端交互

Java-fenn

Java

真的强!来自扫地僧总结的39W字上千道Java一线大厂面试题手册,成功助我拿下蚂蚁金服offer!

钟奕礼

Java 编程 架构 后端 java面试

干货 | Docker 还可以搭建Web服务器nginx ?这么宝藏的吗?

霍格沃兹测试开发学社

Chrome已实现对H.265/HEVC的硬解支持

微帧Visionular

用了Fabric.js后突然想到了...

为自己带盐

实时音视频 Fabric.js 9月月更

GitHub永远的神!“阿里爸爸”终于总结出15W字Java源码真题手册

钟奕礼

Java 编程 架构 java面试 技术宅

干货 | REST-assured 获取日志到文件并结合 Allure 报告进行展示

霍格沃兹测试开发学社

耗时半年,堪称奇迹!阿里架构师整合出258W字Java全栈面试题

钟奕礼

Java 编程 程序员 架构 java面试

干货 | APP自动化Android之属性获取与断言

霍格沃兹测试开发学社

HiveServer2 内存泄漏问题定位与优化方案

Java-fenn

Java Java 面试 #java

python 基于aiohttp的异步爬虫实战时间

Java-fenn

Java

干货 | 一改测试步骤代码就全写?为什么不试试用 Yaml实现数据驱动?

霍格沃兹测试开发学社

干货 | Chrome 浏览器+Postman还能这样做接口测试 ?

霍格沃兹测试开发学社

干货 | H5性能分析实战来啦~

霍格沃兹测试开发学社

这份数据安全自查checklist请拿好,帮你补齐安全短板的妙招全在里面!

Java-fenn

java;

【9.2-9.9】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

详谈 MySQL 8.0 原子 DDL 原理

Java-fenn

Java

真的香!这份《Java面试题库大全》在Github一夜爆火后直接被各大厂要求封杀!

钟奕礼

Java 编程 架构 java面试 技术宅

龙蜥开发者说:海纳百川,有容乃大,我在龙蜥社区的升级之旅 | 第 11 期

OpenAnolis小助手

开源 Linux内核 sig 龙蜥开发者说 epbf

一文带你弄懂Kubernetes应用配置管理时间

Java-fenn

java;

Java 进阶 (八)Java 加密技术之对称加密、非对称加密、不可逆加密算法

Java-fenn

Java

让泛型的思维扎根在脑海——深刻理解泛型时间

Java-fenn

Java

Go 语言创始人:复制亿点点代码比用别人轮子好!

Java-fenn

java;

快看,我们的分布式缓存就是这样把注册中心搞崩塌的_语言 & 开发_头哥侃码_InfoQ精选文章