每当有机会写故障类主题的时候,我都会在开始前静静地望着显示器很久,经过多次煎熬和挣扎之后才敢提起笔来,为什么呢?

因为这样的话题很容易招来吐槽,比如 “说了半天,不就是配置没配好吗?”,或者 “这代码是佩奇写的吗?你们团队有懂性能测试的同学吗?”,这样的评论略带挑衅,而且充满了鄙视之意。

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

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

回顾一下故障过程

这到底是怎么一回事呢?先来回顾一下故障过程。

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 集群崩溃。的确,原因基本猜对了,但消息发送量为什么会成倍的增长呢?

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

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

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

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

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

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

根据设计,在 “本地缓存的工作机制 - Set/Delete 操作” 的工作机制中,当一个 Key 完成服务端缓存操作后,如果没有被加到本地缓存规则列表中的 Key,是不可能被触发消息通知的。

但这里明显存在 Bug,导致把所有的 Key 都发到了 ZK 中。

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

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

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

  • 监控手段的单一,监控的薄弱。

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

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

讲在最后

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

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

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

不过,万一哪天失手,给系统来了个彻底瘫痪,该怎么办呢?祝大家一切顺利吧。

转载自:吃草的罗汉


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

产品推荐

云和恩墨Bethune Pro企业版,集监控,巡检,安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!

没想到,我们的分布式缓存竟这样把注册中心搞垮!相关推荐

  1. Spring Security OAuth2.0_实现分布式认证授权_搭建注册中心_Spring Security OAuth2.0认证授权---springcloud工作笔记150

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 可以看到上面是咱们整个的分布式的授权服务, 1.客户端分3个,第三方接入的时候,可以看到直接请求咱 ...

  2. OPPO三星苹果影像“硬碰硬”,没想到Reno6 Pro+夜拍竟略胜一筹

    众所周知,近两年广大消费者在选购新机的时候,除了关注新机的外观.性能外,影像部分也成为了非常重要的一个参考点,所以各大厂商也争相在相机硬件.拍照功能等方面进行优化升级.那么,在众多手机当中,哪家的产品 ...

  3. 构建dubbo分布式平台-window安装zookeeper注册中心

    2019独角兽企业重金招聘Python工程师标准>>> 1. 简介 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护. ...

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

    作者 | 王晔倞 责编 | 郭   芮 写公众号两年以来,每当有机会写故障类主题的时候,我都会在开始前静静地望着显示器很久,经过多次煎熬和挣扎之后才敢提起笔来. 为什么呢?因为这样的话题很容易招来吐槽 ...

  5. 6月Top 20榜单出炉啦! 万万没想到区块链大佬竟在忙这个...

    6月Top 20榜单出炉啦! 万万没想到区块链大佬竟在忙这个... 一个项目在 GitHub 上的活跃指数,在一定程度上代表了这个项目的开发状态. 频繁更新代码的项目有可能正处于构建和完善中,而停止更 ...

  6. 没想到钱多多的求职之路竟如此艰辛,求大佬指点

    本人情况:2019年从北交大专科毕业,进入互联网行业,到目前有3年软件开发经验,在工作期间自考本,2021年毕业(双证都有),专.本均是计算机专业. 目前在职,正整备换工作,求职"Java软 ...

  7. 多级缓存架构还没听过?分布式多级缓存架构知识大瓶装,25 张图打包拎走

    一谈缓存,内心顿时豁然开朗.迫于key-value的形式,总感觉轻风扶面,杨柳依依,一切都尽在我掌握之中.犹如那一眼相中佳人的冲动,脑子里尽是佳人的容颜. 那缓存如果站在网站架构的角度,你知道它的设计 ...

  8. 科学家们竟用乐高观察细胞,网友:万万没想到啊

    杨净 子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 玩乐高还能玩出个显微镜?! 原本以为是一个普普通通的玩具. 没想到,还真能当成显微镜来用,是能看到细胞的那种. 真·高端新玩法! 比如 ...

  9. down perm什么意思_没想到“羽绒服”竟叫down coat!为啥有个down?

    临近农历新年,天气越来越冷. 我所在的杭州号称今年是个暖冬,但寒风一刮,人还是扛不住,厚外套还是得老老实实穿着. 大街上的俊男靓女们也顾不上苗条身材了,一个个的把自己裹得里三层外三层,活脱脱" ...

最新文章

  1. CentOS6.6+Puppet3.7.3分布式部署Zabbix2.4监控系统
  2. css和js和html代码,网页代码中js和css指的是什么?
  3. sublime配置python3环境_【env】Sublime配置Python3开发环境
  4. Ubuntu关闭anaconda自动进入base虚拟环境
  5. 华硕无线网卡测试软件,家用无线网卡王者 华硕PCE-AC88 双频3100网卡测试
  6. 园林空气净化器永久测试版
  7. Ubuntu 16.04退出anaconda环境
  8. 使用DAO模式开发宠物管理系统---hellokitty
  9. java XML 通过BeanUtils的population为对象赋值 根据用户选择进行dom4j解析
  10. windows10安装nodeJs及环境配置
  11. Linux中fasttext安装
  12. 你朋友圈里原来这些文章最火
  13. html5商品列表页tab,基于vue的tab-list类目切换商品列表组件的示例代码
  14. 垃圾分类小程序,云开发 (附源码)
  15. MAX25————用vray还原模型在Substance Painter的光照以及材质效果
  16. Chrome浏览器打开微信页面
  17. 关于DSP的中断操作
  18. HP电池警告,系统侦测到电池可储存容量过低,为了最佳效能,这颗电池可能需要更换。主电池(601),Enter-继续启动,解决方法
  19. fedora17 安装配置
  20. 【综述】3D智能数字化与3D打印:中国制造向中国智造转变的机遇

热门文章

  1. 区块链组织架构_区块链可以加速开放组织的5种方式
  2. opensource项目_一月份的Opensource.com预览
  3. xcom2.0_发布Xcom 2,Elliot Quest,Mesa图形库以及更多开放式游戏新闻
  4. zappos核心价值_尽管Zappos说了什么,中层管理人员仍然很重要
  5. 代码组织和部署 文件操作 node.js 1
  6. java 怎么链接ndk的库_使用ndk-build链接现有的静态库
  7. Ubuntu开机出现“error: invalid environment block“的解决方法
  8. c语言去掉数组中重复的,C语言删除无序整型数组中的重复元素及时间复杂度
  9. kafka查看broker上主副本_kafka分区及副本在broker的分配
  10. 软考5个高级中哪个好考_请问:计算机软考中、高级,哪个好考些呢?