当前位置: 首页 > 科技观察

没想到我们的分布式缓存居然就这样把注册中心给搞垮了!

时间:2023-03-17 23:05:32 科技观察

每当有机会写故障题材的时候,我都会静静地盯着显示器看半天再动笔,经过多次的磨难和挣扎才敢提笔。为什么?因为这样的话题很容易被吐槽,比如“我说了半天,不就是配置没配置好吗?”,或者“这段代码是猪写的吗?你们团队有没有懂性能测试的同学?”,这样的评论略带挑衅意味,充满蔑视意味。但是,我认为在技术的世界里,大多数情况下,客观场景决定主观结果,主观结果反映客观场景。把场景和结果联系起来,用自己的方式写下来,传播出去,和有经验的同学聊一聊可能是件好事。上个月,我们的系统因为注册中心崩溃而发生了事故。这是一件很平常的事情,但我们猜到了开头却没想到原因。始作俑者其实是某个分布式缓存系统。查看失败过程。到底是怎么回事?我们先回顾一下失败的过程。11月的一个交易日上午10点左右。就在中间件监控系统没有报警的时候,某应用组的负责人突然跑了过来:“缓存响应怎么这么慢?你在干什么?”弗莱尔紧急查看了一系列的监测数据。首先,他通过Zabbix查看了CPU、内存、网络、磁盘等基础告警。一切正常,再查看服务的健康状态。糊涂了,说不通。10点30分,收到一条告警信息,内容为“ZK集群某节点故障,端口阻塞,无法获取Node信息,请速处理!”。这个简单,ZK服务端口不可达,重启一下,马上恢复。10点40分,ZK集群全部瘫痪,无法获取Node数据。由于应用系统的Dubbo服务和分布式缓存使用的是同一套ZK集群,而且这期间没有重启应用,所以应用服务本身暂时没有受到影响。没有意义,无论是应用端还是缓存端,近一个月都没有发布版本,分布式缓存除了在ZK中存储一些节点相关的信息外,基本没有对ZK的依赖。10点50分,所有ZK集群重启,10分钟后再次瘫痪。太神奇了,怎么了?10点55分,所有ZK集群重启。一分钟后,发现NodeCount达到了将近22W+,又崩溃了。10点58分,通过添加监控脚本,发现Node的源头来自于分布式缓存系统的本地缓存服务。11:00,通过控制台关闭本地缓存服务后,ZK集群第三次重启,通过脚本删除了本地缓存产生的大量Node信息。11时05分,产线上所有ZK集群恢复正常,无异常。风波虽然过去,但所有人的脸上都是一片茫然。疯了,为什么这个本地缓存能把注册中心给崩了?上线一年多了,之前怎么没出问题?为什么今天会出事?一堆问号充斥着所有人的大脑。我们本地缓存的工作机制这里我通过系统流程图来简单说明一下我们本地缓存系统的一些核心工作机制。①非本地缓存的工作机制②本地缓存的工作机制:Key预加载/更新③本地缓存的工作机制:Set/Delete操作④本地缓存的工作机制:Get操作原因是我们的部分缓存系统混入了ZK集群的应用系统。正因为如此,才为这次事故埋下了隐患。ZK集群是如何被黑的?说到这里,相信对中间件有一定了解的人,基本都能猜出这件事的全貌。简单来说,在上线初期,由于流量小,访问应用系统的量也小,所以我们本地缓存的消息通知是使用ZK来实现的,同时也使用了广播。但随着流量的增加和应用系统访问量的增加,消息发送量成倍增加,最终达到承载能力上限,ZK集群崩溃。确实,原因基本猜对了,但是为什么消息发送量呈指数增长呢?根据本地缓存的工作机制,我们通常在里面存放什么?更新频率低,但是访问非常频繁,比如系统参数或者业务参数。单个Key/Value大,网络消耗比较大,性能下降明显。服务器资源稀缺或不稳定(如I/O),但对稳定性要求极高。迷茫,随便放一些参数信息,更新频率极低,以至于五节点的ZK集群炸了?为了一探究竟,我们马上进行了代码阅读,终于发现了蹊跷。根据设计,在“本地缓存-设置/删除操作”的工作机制中,当一个Key完成服务器缓存操作时,如果该Key没有加入到本地缓存规则列表中,是不可能触发消息通知的.但是这里很明显有一个bug,导致所有的key都被发送到ZK。这很容易理解。应用系统虽然最近没有出版本,但是已经悄悄地通过缓存控制台为这组缓存分片添加了分布式锁。因此,交易一旦开启,只需要几十分钟的时间。爆裂。另外,除了发现BUG之外,通过测试后的验证,我们还得出了以下结论:使用ZK进行消息同步,ZK本身的负载能力较弱,是不是应该改用MQ?监控手段单一,监控薄弱。系统部署结构不合理,基础设施的ZK不能和应用的ZK混用。话虽如此,这个故事也该结束了。看完***这个故事,有些喜欢讨厌人的朋友可能会忍不住发问。你自己设计的架构和你自己写的代码你不知道逻辑吗?这么低级的错误还敢说?不一定是这样。对于每一个技术团队来说,核心成员的离职和业务形态的改变,或多或少都会导致技术团队对现有体系形成“知其然,不知其所以然”的局面。虽然每支球队都在极力避免,但想要彻底消灭它绝非易事。事物。作为一名技术经理,最好有一个良好的心态,把每一次失败都看作是一个改变的过程,从中得出结论和经验,并传承下去,以免以后重蹈覆辙。但是,万一哪天失手,系统彻底瘫痪怎么办?祝你一切顺利。作者:王业政编辑:陶家龙、孙淑娟来源:转载自吃草罗汉(ID:kidd_wyl)微信公众号。