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