【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

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

评论

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

力扣(LeetCode)刷题,简单+中等题(第32期)

不脱发的程序猿

算法 LeetCode 编程能力 28天写作 3月日更

酷睿i7-10870H对比锐龙7 5800H游戏性能, 英特尔仍是游戏本CPU的更优选

E科讯

中国程序员最容易发错的单词

happlyfox

GitHub 学习 程序人生 3月日更

华山版强势来袭!阿里巴巴Java性能优化2021年3月版(面试必备)

Java架构追梦

Java 阿里巴巴 架构 面试 性能优化

一个简单实用的Linux性能分析工具

运维研习社

Linux 性能分析

【LeetCode】用栈实现队列Java题解

Albert

算法 LeetCode 28天写作

金三银四如何突击面试美团?面试题(含答案)+学习笔记+电子书籍+学习视频

比伯

Java 编程 架构 面试 程序人生

Pano React Native SDK 来了!快速实现移动端音视频和白板

拍乐云Pano

flutter ios android RTC React Native

重磅!Flutter中网络图片加载和缓存源码分析,BAT大厂面试总结

欢喜学安卓

android 程序员 面试 移动开发

程序员之禅(三)

每天读本书

每天读本书

DataPipeline通过华为鲲鹏兼容性认证,以自主科技创新推动中国信息产业进步

DataPipeline数见科技

大数据 数据融合

腾讯T2大牛手把手教你!2021新一波程序员跳槽季,算法太TM重要了

欢喜学安卓

android 程序员 面试 移动开发

2021“金三银四”刷爆朋友圈的“Java核心面试知识手册”这波Offer稳了

Java架构之路

Java 程序员 架构 面试 编程语言

CodeHub#4 启动报名| 荷小鱼:K12 在线教育应用的开发实践

蚂蚁集团移动开发平台 mPaaS

在线教育 mPaaS codehub 离线包

萌新不看会后悔的C++基本类型总结(一)

花狗Fdog

微服务指南

码语者

DevOps

瓦力量化交易系统开发|瓦力炒币机器人软件APP开发

系统开发

报名 | 全球首个小资源音色克隆赛结果出炉,高分队伍线上报告会

爱奇艺技术产品团队

工作中,有哪些SQL是我们必须要掌握的?

xiezhr

oracle sql SQL语法 3月日更

CentOS安装Docker运行环境

wjchenge

Docker Centos 7

农田治理效率低下还赔本?智慧农业力保粮食品质,效率事半功倍

一只数据鲸鱼

物联网 数据可视化 智慧城市 智慧农业 农业管理

当AI开始改造“文房四宝”:腾讯教育的脑洞与逻辑

脑极体

舒畅,阿里大牛终于把困扰我多年的「Spring全家桶」讲明白了!十年IT老兵亲述Spring实战经验

Java架构之路

Java 程序员 架构 面试 编程语言

【得物技术】会议室巡检系统(哮天犬)部署分享

得物技术

分享 部署 巡检 得物技术 会议室

如何解决移动直播下的耳返延迟问题

融云 RongCloud

音视频 移动直播

想看新指标?教你轻松写prober插件

滴滴云

运维 滴滴夜莺 Obsuite prober插件

百亿级流量的百度搜索中台,是怎么做可观测性建设的?

百度Geek说

中台 云原生 #百度#

英特尔:i7-10870H 游戏性能超 R7 5800H,更强的 11 代酷睿 H 在后面

E科讯

大赛报名|首次聚焦口罩场景!第三届 106 点关键点定位大赛开启

京东科技开发者

人工智能 深度学习 计算机视觉

Nginx 模块系统:前篇

soulteary

nginx 动态模块

基于 Wasm 和 ORAS 简化扩展服务网格功能

阿里巴巴云原生

Docker 容器 微服务 云原生 k8s

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