解决RabbitMQ镜像集群脑裂问题

1、现象:

项目中使用了rabbitmq的镜像模式集群,两个节点,昨天出现MQ集群不能正常消息通信,打开web管理界面:
mq集群web管理界面

Network partition detected
Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data. Please read RabbitMQ documentation about network partitions and the possible solutions.

原来是集群出现脑裂现象,网络分区中一个节点在一分钟(或者一个net_ticktime时间)内不能连接上另一个节点,那么Mnesia会认为另一个节点已经挂了。就算之后两个节点连通,但是这两个节点都认为对方已经挂了,Mnesia此时认定发生了网络分区的情况。rabbitmq出错日志如下:

=INFO REPORT==== 11-Jun-2019::19:11:57 ===
node 'rabbit@lg-mq01' up

=ERROR REPORT==== 11-Jun-2019::19:11:57 ===
Mnesia('rabbit@lg-mq02'): ** ERROR ** mnesia_event got {inconsistent_database, running_partitioned_network, 'rabbit@lg-mq01'}

=INFO REPORT==== 11-Jun-2019::19:12:09 ===
accepting AMQP connection <0.15728.1484> (10.200.66.115:56670 -> 10.200.66.115:5672)

=INFO REPORT==== 11-Jun-2019::19:12:09 ===
connection <0.15728.1484> (10.200.66.115:56670 -> 10.200.66.115:5672): user 'xxxxx' authenticated and granted access to vhost 'leboGame'

=INFO REPORT==== 11-Jun-2019::19:12:14 ===
accepting AMQP connection <0.22202.1484> (10.200.66.115:56686 -> 10.200.66.115:5672)

=INFO REPORT==== 11-Jun-2019::19:12:14 ===
connection <0.22202.1484> (10.200.66.115:56686 -> 10.200.66.115:5672): user 'xxxxx' authenticated and granted access to vhost 'leboGame'

=WARNING REPORT==== 11-Jun-2019::19:12:17 ===
closing AMQP connection <0.15728.1484> (10.200.66.115:56670 -> 10.200.66.115:5672):
client unexpectedly closed TCP connection

=INFO REPORT==== 11-Jun-2019::19:12:18 ===
accepting AMQP connection <0.20778.1484> (10.200.66.115:56700 -> 10.200.66.115:5672)

=INFO REPORT==== 11-Jun-2019::19:12:18 ===
connection <0.20778.1484> (10.200.66.115:56700 -> 10.200.66.115:5672): user 'xxxxx' authenticated and granted access to vhost 'leboGame'

=INFO REPORT==== 11-Jun-2019::19:54:58 ===
accepting AMQP connection <0.23143.1484> (10.200.66.115:61598 -> 10.200.66.115:5672)

2、解决办法:

原因是rabbitmq集群在配置时未设置出现网络分区处理策略,先要将集群恢复正常,再设置出现网络分区处理策略,步骤如下:
(1)首先需要挑选一个信任的分区,这个分区才有决定Mnesia内容的权限,发生在其他分区的改变将不被记录到Mnesia中而直接丢弃。
(2)停止(stop)其他分区的节点,然后启动(start)这些节点,之后重新将这些节点加入到当前信任的分区之中。

rabbitmqctl stop_app
rabbitmqctl start_app

(3)最后,你应该重启(restart)信任的分区中所有的节点,以去除告警。
你也可以简单的关闭整个集群的节点,然后再启动每一个节点,当然,你要确保你启动的第一个节点在你所信任的分区之中。
(4)设置出现网络分区处理策略,这里设置为autoheal,下面会详细说明其它策略
在/etc/rabbitmq下新建rabbitmq.conf,加入:

[
 {rabbit,
  [{tcp_listeners,[5672]},
   {cluster_partition_handling, autoheal}
]}
].

3、网络分区处理策略:

有以下3种处理策略:
(1)ignore
默认类型,不处理。
要求你所在的网络环境非常可靠。例如,你的所有 node 都在同一个机架上,通过交换机互联,并且该交换机还是与外界通信的必经之路。
(2)pause_minority
rabbitmq节点感知集群中其他节点down掉时,会判断自己在集群中处于多数派还是少数派,也就是判断与自己形成集群的节点个数在整个集群中的比例是否超过一半。如果是多数派,则正常工作,如果是少数派,则会停止rabbit应用并不断检测直到自己成为多数派的一员后再次启动rabbit应用。注意:这种处理方式集群通常由奇数个节点组成。在CAP中,优先保证了CP。
注意:pause_minority适用情形有限制,如3个节点集群,每次只down1个时,此模式适用。但如果网络都出问题,3节点会独立形成3个集群。
(3)autoheal
你的网络环境可能是不可靠的。你会更加关心服务的可持续性,而非数据完整性。你可以构建一个包含2个node的集群。
当网络分区恢复后,rabbitmq各分区彼此进行协商,分区中客户端连接数最多的为胜者,其余的全部会进行重启,恢复到同步状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值