RabbitMQ集群脑裂故障处理

网络抖动或故障均可能会导致RabbitMQ集群发生脑裂故障,在不同节点的RabbitMQ管理界面上可以看出其他节点存在红色不可用,显示错误信息如下

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. 

此时集群的节点与节点间通讯失败了,但是各自都能独立提供服务,这种情况也可能导致数据处理出现异常。

故障分析与处理:

分别到集群各个节点上,执行rabbitmqctl cluster_status命令,查看RabbitMQ集群信息。

注意看partitions值为空数组,意思是集群网络没有分区:

# rabbitmqctl cluster_status
Cluster status of node rabbit1@mqcluster ...
[{nodes,[{disc,[rabbit1@mqcluster,rabbit2@mqcluster]}]},
{running_nodes,[rabbit1@mqcluster,rabbit2@mqcluster]},
{partitions,[]}]

脑裂故障发生时partitions值非空,意思是集群网络出现分区:

# rabbitmqctl cluster_status
Cluster status of node rabbit1@mqcluster ...
[{nodes,[{disc,[rabbit1@mqcluster,rabbit2@mqcluster]}]},
{running_nodes,[rabbit1@mqcluster,rabbit2@mqcluster]},
{partitions,[{rabbit1@mqcluster,[rabbit2@mqcluster]},{rabbit2@mqcluster,[rabbit1@mqcluster]}]}]

参考网上的一些解决方案后,处理如下:

在出现以上网络分区问题的节点上执行: 

rabbitmqctl stop_app

rabbitmqctl start_app

注意:mq集群不能采用kill -9 杀死进程,否则生产者和消费者不能及时识别mq的断连,会影响生产者和消费者正常的业务处理。 

---------------

脑裂后自动修复的方法
修改节点的配置文件
在/etc/rabbitmq下新建rabbitmq.conf,加入:

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

  

若已有配置文件,则直接添加{cluster_partition_handling, autoheal}配置,详情介绍可去官网搜索。

然后重启RabbitMQ:systemctl restart rabbitmq-server

 

参考:https://www.cnblogs.com/liyongsan/p/9640361.html

posted @ 2022-09-20 16:35  Don  阅读(1735)  评论(0编辑  收藏  举报