将RocketMQ集群部署从年终生产故障中解放出来的最佳实践 嘉实货币市场基金

股票行情  2021-03-18 19:31:05

原标题:解除RocketMQ集群部署年终生产故障的最佳实践

【CSDN编者按】因为一次生产事故,年终奖泡汤了!找了一些问题,终于找到了罪魁祸首!MQ集群中一台物理机内存故障导致系统非正常重启,更关键的问题是,为什么一个Broker会因为内存故障重启,10分钟后业务才恢复,也就是客户端真正感知到Broker停机?

作者|丁伟编辑|极客胖丁

作者把“悲伤提醒”比作。临近年底,作者维护的生产MQ集群中某物理机内存故障,导致操作系统异常重启。10分钟内,很多应用发送客户端出现消息发送超时,事故被定性为S1,是作者的“年终奖”。。。

故障描述

RocketMQ集群采用2主2从的部署架构,如下图所示:

它的部署架构的一个非常明显的特征是两个进程,名称服务器和代理,被部署在一个物理机器上。

其中一台机器(192.168.3.100)出现内存故障,导致机器重新启动。但是由于Linux操作系统的自检等因素,整个重启过程竟然持续了近10分钟,客户端的发送超时持续了10分钟,这显然是无法接受的!!!

火箭MQ的高可用设计是什么?接下来我们将详细介绍分析过程。

故障分析

当我得知一个机器故障导致消息发送超时持续了10分钟,我的第一反应是不应该,因为RocketMQ集群是分布式部署架构,自然支持故障发现和故障恢复,消息发送客户端能够自动感知到Broker异常的时间绝对不会超过10分钟。故障是怎么发生的?

首先,我们来回顾一下RocketMQ的路由注册和发现机制。

2.1 RocketMQ路由注册和消除机制

路由注册和消除机制描述如下:

每30秒,群集中的所有代理向群集中的所有名称服务器发送心跳数据包,以注册主题路由信息。 名称服务器在从代理接收心跳数据包时首先更新路由表,并记录接收心跳数据包的时间。 名称服务器每10秒钟启动一个计划任务来扫描代理生存状态表。如果名称服务器在120秒内没有收到代理的心跳数据包,它将确定代理已离线,并从路由表中删除代理。 如果名称服务器和代理之间的长连接断开,名称服务器可以立即检测到代理脱机,并将代理从路由表中删除。 消息客户端(消息发送者和消息消费者)在任何时候都只与其中一个名称服务器建立连接,并每30秒从名称服务器查询路由信息。如果找到查询结果,将更新客户端的本地路由信息。如果查询路由失败,则忽略。 从上面提到的路由注册和消除机制来看,当一个Broker服务器宕机时,消息发送方感知路由信息的变化需要多长时间?

下面讨论两种情况:

名称服务器和代理服务器之间的传输控制协议连接已断开。此时,名称服务器可以立即感知路由信息的变化,并将其从路由表中删除。因此,消息发送方应该能够在大约30秒内感知到路由的变化,在这30秒内,消息发送失败将发生在发送方。但是结合发送回避机制,不会给发送方带来重大的失败,这是可以接受的。 如果名称服务器和代理服务器之间的TCP连接没有断开,但是代理不能再提供服务(比如假死),那么名称服务器感知代理宕机需要120秒,消息发送者感知其路由信息的变化最多需要150秒。 但问题是,为什么一个Broker因为内存故障重启,10分钟后业务恢复,也就是客户端真的意识到Broker停机了?

现在它出现了,我们需要分析它并给出解决方案,以避免在生产环境中出现相同类型的错误。

2.2故障排除流程

查询客户端的日志(/home/{ user }/logs/rockemqlogs/rockemq _ client . log),从中可以看到客户端第一次发送消息的时间是14:44,日志输出如下:

由于192.168.3.100机器的内存故障,首先检查集群中其他名称服务器的日志,看看正常机器中的名称服务器感知代理多长时间——失败。日志如下:

由此可以看出,192.138.3.101的名称服务器基本上在2分钟左右就感知到了它的停机时间,也就是说,虽然机器正在重启,但TCP连接可能并没有因为操作系统的硬件自检等其他原因而断开,所以名称服务器只在120s后才感知到它的停机时间,并从路由信息表中删除代理。根据路由消除机制,客户端应该在150秒内感知到它的变化,为什么不呢?

继续检查客户端路由信息,检查客户端感知到路由信息发生变化的时间点,如下图所示:

根据客户端日志,客户端直到14:53:46才实现更改。为什么?

原来客户端更新路由信息时异常超时,截图如下:

在从故障到恢复期间,客户端一直试图从故障的名称服务器更新路由信息,但它总是返回超时,这导致客户端无法获得最新的路由信息,因此它无法感知关闭的代理。

从日志分析来看,到现在还是比较清晰的。所有客户端在120秒内都没有察觉到其路由信息的变化的原因是客户端一直试图从关闭的名称服务器更新路由信息。然而,由于请求不成功,客户端缓存的路由信息没有更新,导致了上述现象。

这就是问题所在。根据我们对RocketMQ的理解,当名称服务器关闭时,客户端会自动从名称服务器列表中选择下一个名称服务器。为什么命名服务器没有在这里切换,而是等到14:53?

接下来,我们将注意力转向NameServer的交换机代码,其代码片段如下图所示:

上图中的几个关键分析如下:

客户端从缓存中选择一个连接来发送RPC请求的先决条件是该连接的isActive方法返回true,即底层的TCP连接处于活动状态。 当客户端向服务器发起RPC请求时,如果存在非超时类异常,将执行closeChannel方法,该方法将关闭连接并将其从连接缓存表中删除。这非常关键,因为如果缓存中有一个连接,并且在切换名称服务器时该连接处于活动状态,则不会切换名称服务器。 如果发送RPC超时,rocketmq将根据clientCloseSocketIfTimeout参数决定是否关闭连接,但不幸的是,该参数默认为false,并且没有提供修改过的条目。 现在问题已经分析到这里,就很清楚了。

由于机器内存故障等因素触发重启和自检,名称服务器、代理无法再处理请求,但底层TCP连接没有断开,超时后返回。但是,客户端不会关闭与故障机器名称服务器的TCP连接,也不会触发名称服务器的切换。机器成功重启后,TCP连接断开。故障机器重新启动后,它会感知路由信息的变化,并从故障中恢复。

根本原因:由于域名服务器的假死,路由信息无法更新。

最佳实践

出现以上故障后,个人感觉nameserver不应该和broker一起部署。如果名称服务器和代理没有部署在一起,可以有效避免上述问题,其部署架构如下图所示:

如果这样的部署架构面临上述场景,即Broker假死,能否有效避免?答案是肯定的。

如果192.168.3.100的broker是伪造的,那么3.110和3.111的名称服务器可以感知到broker-a在2分钟内宕机,客户端可以从名称服务器获取最新的路由信息,这样在发送消息时就不会继续向宕机的Broker发送消息,故障会得到恢复;

如果名称服务器是伪造的,并且发生了超时错误,只要代理没有关闭,它仍然可以通过缓存正常工作。然而,如果nanmeserver、broker被伪造在一起,上述架构仍然无法避免上述问题。

因此,这一最佳做法主要包括以下两项措施:

1.名称服务器和代理必须单独部署并隔离。

2.超时后应该关闭名称服务器和客户端的连接,触发名称服务器漂移,需要修改源代码。回搜狐多看

负责编辑:


以上就是将RocketMQ集群部署从年终生产故障中解放出来的最佳实践嘉实货币市场基金的全部内容了,喜欢我们网站的可以继续关注姬峰股票网其他的资讯!

相关推荐

如何报销医疗保险卡,医疗保险卡报销比例规定
1.如何报销医疗保险卡1.通常,当您因病需要住院时,可以携带医疗保险卡和医疗记录给您在指定的医院,您可以使用您的医疗保险卡进行结...
安永:内地银行第一季度净利润同比增长
安永会计师事务所在其第20期"中国上市银行对2021年第一季度的业绩分析,2020年回顾和未来前景"中指出,今年第一季度,该38...
上汽大众配备15台超声波和毫米波雷达,推出SkodaOctaviaPRO
新闻SAIC(600104)的主要内容合资汽车公司上汽大众于3月9日宣布推出新款斯柯达明锐PRO。新型号配备15台超声波,毫米波...
管爱通增资1.05亿元:收购一家拥有第三方支付牌照的公司部分股权
8月21日,首创获悉,管爱通(871282.OC)本次非公开发行实际发行1132.36万元人民币普通股,发行价为每股92727元...
欢迎来到会议后的坏消息?盛美股份母公司ACMR因两项罪名被卖空机构起诉
盛美半导体设备(上海)有限公司(以下简称:盛美股份)最近可能有点焦虑。公司科创板一开会,母公司就被做空机构指控造假。10月8日,...
华夏生物科创板IPO获上交所询价
7月24日,首都国家获悉,成都圣诺生物科技股份有限公司(以下简称:圣诺生物)的IPO申请近日已被上交所查询。(图片来源:上海证券...
因买方违约,上海证大终止出售烟台非全资子公司股权
9月8日,首创获悉,港股公司上海证大(00755.HK)公告,将通过公开上市方式终止出售其持有的烟台市非全资子公司股权。上海证大...
公司债券交易纠纷,*ST康德部分财产被查封、扣押、冻结
8月5日,国都获悉*ST康德(002450.SZ)近日收到"民事裁定书"。据悉,由于公司债券交易纠纷,在案件审理过程中,东莞农村...
5G赋能新媒体,联通股价走势将如何
5月15日,首创获悉,中国联通(600050.SH)近日披露了《2020年第一季度报告》。据介绍,中国联通2020年一季度营业收...

友情链接