cover_image

一次RocketMQ消息超时引发的故障

张兴俊(简雍) 云筑网技术团队
2021年12月30日 09:00
图片

云筑网技术团队

助推建筑行业数字化


1 问题

RocketMQ作为公司消息中间件在各个业务广泛使用,用于公司的各个业务场景各个业。公司MQ集群已经支撑业务正常使用了很长一段时间,然而最近公司招采业务在发送MQ消息时出现了频繁超时导致业务事务回滚,严重影响了业务的使用。需要尽快解决MQ超时问题。

2 排查

业务超时异常定位

根据业务给出的超时异常信息,确认是MQ超时导致的异常,RocketMQ默认设置的超时时间是3s,如果业务发送消息在3s内没有返回结果就抛出超时异常,然而通过管控端消息查询发现消息确能够在MQ服务端查询到,判断可能是消息落盘超时或者主从同步问题。

MQ服务GC分析和日志追踪

找运维同学导出线上MQ服务最近超时时间段的日志以及MQ服务的GC日志。根据服务日志排查出现很多的写消息超时提醒日志(如下图),首先猜测是否是GC导致的,排查GC日志后发现GC正常,这段时间没有出现Full GC的情况。

图片

检查主从配置 & 查看主从复制

查看MQ集群配置当前MQ配置了主从同步复制,异步刷盘(可初步排除落盘问题),继续检查日志信息,最终发现主从同步时存在超时日志,并且出现主从连接心跳过期断开后5s再次连接同步消息日志,看到这里基本已经可以确定是主从超时导致业务超时,同时查看超时的时间点也和业务超时时间点吻合。

图片

主从服务网络排查 & 确认brokerIP2配置问题

查看从节点连接的情况,发现从节点连接的IP并不是master主节点的IP地址,而是另一个容器节点的IP(如下图),而且这两个IP非主从关系。那为什么会使用容器的IP去连接主节点同步数据呢?(而且ping没问题, 看不出网络是否稳定,找运维的同学确认网络有问题),并且查看MQ打印的日志存在很多主从响应超时的日志和断开的日志。可以确定是网络不稳定是导致超时的主要因素。

但是主从节点之间却能够同步数据(疑惑?),经过排查是由于当前master机器部署了另一个master节点的从节点,这个从节点通过容器IP(同一台机器连接)指向当前机器的master的10912端口进行数据同步,这导致主从节点数据同步数据错误的另一个问题(如果业务查询很久以前数据就会从从节点拉数据,这会导致无法拉取到数据)。继续检查master节点配置发现master的brokerIP2配置成了容器的IP(导致从节点连接主节点同步数据错误)。以下是主从同步数据超时日志:

图片

排查brokerIP2配置错误问题

由于公司当前MQ集群是采用docker部署的,没有声明指定brokerIP2,RocketMQ主节点BrokerIP2如果不指定会默认取当前机器的IP(这里取了容器的网络IP),默认就取了容器的IP作为brokerIP2的值,最终导致从节点不能正确连接到主节点,同时网络不稳定导致业务超时。

3 解决

修改问题机器的master节点brokerIP2指向正确的IP

当前MQ集群采用主从部署架构,brokerIP2的错误导致从节点同步的数据不是自己的master节点的数据,需要注意事项:

a、修改master节点权限为只读(暂停新消息写入)

sh mqadmin updateBrokerConfig -b xx.xx.xx.xx:10911 -k brokerPermission -v 4

b、修改master 节点brokerIP2指向正确的IP

sh mqadmin updateBrokerConfig -b xx.xx.xx.xx:10911 -k brokerIP2 -v xx.xx.xx.xx

c、重新挂载新的从节点(或者将老的从节点的数据全部清除后,重新启动老的从节点)

d、等待新的从节点和master的数据同步完成

e、修改master节点的权限为读写权限,恢复集群可用性

图片
重新搭建主从节点替换现有集群(保证有多余集群的情况)

a、搭建新的master,slave主从节点(相同的namesrv注册中心)

b、将老集群的topic和group导入新集群节点,验证正常

c、切换老集群节点权限为只读等待消费完成,并且没有新的消息写入

d、下线老的MQ集群

图片

作  者:张兴俊(简雍)
审  稿:吴友强(技巅)
编  :周旭龙(爱迪生)

往期回顾

01
如何让你的系统快一点?
02
1024云筑极客结回顾
03
如何设计一个通用点赞系统?

图片
继续滑动看下一个
云筑网技术团队
向上滑动看下一个