rabbitmq集群在脑裂恢复后出现消息无法投入的问题

问题描述

三节点集群(版本3.9.7),有一台拔网线恢复后,绑定的q出现问题,有个queue消息投不进去,管理界面查看队列状态,发现存在一个rk对应三个队列的多重绑定用法,三个队列只有一个投不进去。
注:topic类型的ex,队列属性是autodelete,但是公司内部使用的客户端库实现了自动重连,也就是说断网后会重新创建出队列

认为是脑裂后rmq服务器数据库不一致引起的故障,通过解绑或重启临时解决,但毕竟不是长久之策,而且该问题已经出现了三四次

排查流程(涉及公司机密不放相关图片)

1.往publish方法里加打印,发现route返回结果不包含问题队列

2.通过mnesia及ets函数直接查找route,发现三个节点都能查到,并未发现明显的不一致

3.分析rmq服务器逻辑,topic类型的route和direct、fanout不同,它需要先进行正则匹配,并最终通过mnesia:select进行查找

而其他类型的ex则是直接通过ets:select(2.5版本之前也是mnesia:select)

4.为topic的route补充像其他类型ex一样直接查找的结果,取并集,重新编译rmq服务器

5.替换故障集群中一个节点进行测试,发现补充的方式查找成功,此时通过被替换的节点投消息也能投进

解决方案
按上述方法补充route方式即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RabbitMQ集群(Cluster Split Brain)是指在一个RabbitMQ集群中,由于网络分区或节点间通信故障等原因,导致集群中的节点无法正常通信,形成了多个子集群,每个子集群都认为自己是有效的集群,从而导致数据的不一致和消息的丢失。 当发生时,不同的子集群可能会继续处理消息,并在各自的子集群中进行消息传递和存储。这会导致消息的重复传递、顺序混乱以及数据的不一致性。当网络分区被修复时,不同的子集群可能会试图重新连接并合并,但由于数据和状态的不一致性,可能会导致冲突和错误。 为了避免RabbitMQ集群问题,可以采取以下措施: 1. 使用心跳机制:RabbitMQ节点之间可以通过定期发送心跳消息来检测彼此的可用性。如果节点在一段时间内未收到其他节点的心跳响应,则可以认为网络出现故障或节点失效,从而避免问题。 2. 配置集群节点:在搭建RabbitMQ集群时,需要正确配置节点之间的通信参数,包括节点名称、IP地址、端口等。确保节点之间可以正常通信,避免因网络配置错误而导致问题。 3. 使用Quorum队列:RabbitMQ从3.8版本开始引入了Quorum队列,它使用多数投票算法来避免问题。Quorum队列提供了更强的数据一致性和容错能力,可以自动处理网络分区和节点失效的情况。 4. 监控和故障排除:定期监控RabbitMQ集群的运行状态,及时发现并处理可能导致问题的异常情况。同时,建立完善的故障排除机制,快速恢复集群的正常运行。 需要注意的是,尽管采取了预防措施,但在复杂的网络环境中,仍然无法完全排除问题的发生。因此,在设计分布式系统时应考虑到问题,并采取相应的容错和恢复策略来确保系统的可用性和数据一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值