
云筑网技术团队
助推建筑行业数字化
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集群

