什么!分布式缓存搞崩了注册中心?

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

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

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

这到底是怎么一回事呢?

先来回顾一下故障过程

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混用;

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

讲在最后

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

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

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

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

原文地址:https://www.cnblogs.com/CQqf2019/p/11149634.html

时间: 2024-10-08 12:55:41

什么!分布式缓存搞崩了注册中心?的相关文章

(十四) 构建dubbo分布式平台-window安装zookeeper注册中心

上一篇我们介绍<构建dubbo分布式平台-dubbo管控台的安装>,考虑到我们的开发环境是在window上,为了部署运行方便,今天来简单介绍一下window安装zookeeper注册中心. 简介 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效.功能稳定的系统提供给用户. 安装和配置 在apache的官方网站提供了好

springmvc+mybatis+dubbo分布式平台-window安装zookeeper注册中心

上一篇我们介绍<构建dubbo分布式平台-window安装dubbo管控台>,考虑到我们的开发环境是在window上,为了部署运行方便,今天来简单介绍一下window安装dubbo管控台. dubbo管理控制台开源部分主要包含: 提供者 路由规则 动态配置 访问控制 权重调节 负载均衡 负责人,等管理功能. 下载dubbo管控台war包 解压dubbo.war包 修改dubbo.properties文件 dubbo.registry.address=zookeeper://127.0.0.1:

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

简介 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效.功能稳定的系统提供给用户. 安装和配置 在apache的官方网站提供了好多镜像下载地址,然后找到对应的版本,目前最新的是3.3.6 下载地址: http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.3.6/zoo

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

写公众号两年以来,每当有机会写故障类主题的时候,我都会在开始前静静地望着显示器很久,经过多次煎熬和挣扎之后才敢提起笔来. 为什么呢?因为这样的话题很容易招来吐槽,比如 "说了半天,不就是配置没配好吗?",或者 "这代码是猪写的吗?你们团队有懂性能测试的同学吗?",这样的评论略带挑衅,而且充满了鄙视之意. 不过我觉得,在技术的世界里,多数情况都是客观场景决定了主观结果,而主观结果又反映了客观场景,把场景与结果串起来,用自己的方式写下来,传播出去,与有相同经历的同学聊上

分布式注册中心Overview

转载请注明出处:jiq?钦's technical Blog 版权所有 author by 季义钦 一. 动机 当前我们已经全面进入到分布式应用时代,后端已经开始全面服务化,根据职责拆分为多个子系统,并且以廉价服务器集群进行支撑. 但是在这样一种架构下: 1. 减轻配置灾难: 服务.网站.FTP服务器.数据库.公共组件等资源的配置信息,以及一些全局的系统配置参数会在多个地方被配置并使用. 随着各类资源的种类和数量增多,加之引用这些资源配置信息的子系统越来越多.配置文件种类的多样化,一方面导致各类

(九)分布式服务----Zookeeper注册中心

==>>点击查看本系列文章目录 首先看一下几种注册中心: 最老的就是Zookeeper了, 比较新的有Eureka,Consul 都可以做注册中心.可以自行搜索对比三者的优缺点. Zookeeper 最开始就是hadoop大家族中的一员,用于做协调的框架,后来已经是apache的子项目了. 几年前大数据很火的时候,只要学hadoop必学zookeeper,当然还有其他成员. 大数据简单说就是分布式,比如分布式文件存储hdfs,分布式数据库hbase,分布式协调zookeeper,还有kafka

【转帖】阿里金融云:分布式服务注册中心(DSR)

https://www.cloud.alipay.com/docs/middleware/register/index.html 分布式服务注册中心(DSR) 分布式服务注册中心简介 服务注册中心 (Register) 是一个基于“发布-订阅”模式的协调中间件.在分布式环境下,它通常被用作地址服务器. SOFA RPC.MsgBroker 等金融云中间件,都依靠服务注册中心来实时感知各个角色的在线地址列表.例如SOFA RPC中,服务消费方需要感知服务提供方地址:MsgBroker中,消息发布者

构建springmvc+mybatis+dubbo分布式平台-zookeeper注册中心安装

上一篇我们介绍<构建dubbo分布式平台-dubbo简介>,结合dubbo基础简介,今天我们来学习基于zookeeper注册中心的安装. 注册中心 1.建议使用dubbo-2.3.3以上版本的使用zookeeper注册中心客户端 2.Zookeeper是Apache Hadoop的子项目,强度相对较好,建议生产环境使用该注册中心. 3.Dubbo未对Zookeeper服务器端做任何侵入修改,只需安装原生的Zookeeper服务器即可, 所有注册中心逻辑适配都在调用Zookeeper客户端时完成

利用Zookeeper实现分布式锁及服务注册中心

原文:利用Zookeeper实现分布式锁及服务注册中心 对于Zookeeper的定义以及原理,网上已经有很多的优秀文章对其进行了详细的介绍,所以本文不再进行这方面的阐述. 本文主要介绍一些基本的准备工作以及zookeeper.net的使用. 本文源代码github地址:https://github.com/Mike-Zrw/ZookeeperHelper zookeeper下载地址:https://archive.apache.org/dist/zookeeper/ ZooInspector下载