写点什么

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

  • 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:40937

评论

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

记一次TIDB开启TLS失败导致PD扩容失败案例

TiDB 社区干货传送门

实践案例 安装 & 部署

总是拿不下大客户 不妨从它的企业全历史行为数据里找找思路

客户在哪儿AI

ToB营销 ToB增长 ToB销售

自动生成PPT的AI助手有哪些?这5款软件值得推荐!

彭宏豪95

人工智能 职场 PPT AIGC AI生成PPT

PDF Checkpoint for mac(PDF自动化批处理工具)v1.9.21激活版

Rose

飞舞在化工企业的AI大模型梦想

脑极体

AI

【堡垒机小知识】农业需要堡垒机吗?为什么?

行云管家

网络安全 数据安全 堡垒机

Python 性能分析的几个方法,找到你代码中的那个她!

我再BUG界嘎嘎乱杀

Python 编程 后端 性能分析 开发语言

C/C++ 集成开发环境(IDE) JetBrains CLion 2023 for Mac v2023.3.2中文激活版

Rose

天水市有等保测评机构吗?在哪里?

行云管家

网络安全 等保 堡垒机 等级保护

JavaScript 判断客户端是手机还是pad

源字节1号

微信小程序 开源 软件开发 前端开发 后端开发

详解 Postman 中 OAuth 2.0 授权的步骤

Liam

Java 后端 Postman 授权

Java 在成本资源控制下, 千万级别数据查询优化

伤感汤姆布利柏

使用coconutBattery Plus, 您始终了解当前的电池健康状况。

Rose

面试前:各方面都匹配 面试后:恐怕是凉了

王中阳Go

Go 数据库 面试 后端 面经

上海梦创双杨数据科技股份有限公司通过电子标准院《低代码开发平台能力要求》测评

电子标准院软工研究室

Cellebrite UFED 4PC 7.69 (Windows) - Android 和 iOS 移动设备取证软件

sysin

UFED 数字取证

可灵重大升级!新增Web端上线、首尾帧控制、单次生成视频时长增加至10s!

快手技术

大模型 视频生成 可灵 企业号2024年7月PK榜

Visio Viewer for Mac(Visio文件查看工具)v3.1.0激活版

Rose

给你安利一个程序员上岸公务员的开源项目

不在线第一只蜗牛

开源 程序员 上岸

Win11镜像下载

Rose

Acrobat Pro DC 2021 for Mac(专业PDF编辑软件)v2021.007.20091中文版

Rose

记录一次版本升级的过程

TiDB 社区干货传送门

版本升级 6.x 实践

中科九洲科技股份有限公司通过电子标准院《低代码开发平台能力要求》测评

电子标准院软工研究室

亚马逊API接口推荐:亚马逊商品详情数据接口(amazon.item_get)

tbapi

亚马逊API 亚马逊商品详情数据接口 亚马逊商品详情API 亚马逊商品数据采集

软工智库|低代码篇(四)——低代码开发平台如何应用?

电子标准院软工研究室

探讨篇(四):分布式数据访问解决方案

京东科技开发者

天底下没有永远免费的GPT-4;AI产品用订阅制就不合理!让用户掏钱的N种定价技巧

蓉蓉

AI GPT-4 Claude

如何通过fomepay自助升级ChatGPT plus

蓉蓉

ChatGPT

解锁AB测试的力量

FunTester

Reallusion Cartoon Animator 2D动画设计制作软件 v4.51.3511.1中文激活版

Rose

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