跳到主要内容

集群网络分区处理方案

如果配置了镜像队列的RabbitMQ集群没有使用VIP进行代理,项目直接连接各MQ节点进行访问,当集群内某些节点出现网络问题导致无法联通集群网络环境,集群就会出现网络分区问题

image.png

03节点出现网络分区,集群环境无法与其联通

制造网络分区:

aiptables封禁 / 解封IP地址或者端口号

b重启网卡

c挂起 & 重启主机

发现网络分区:

a使用 rabbitmqctl cluster_status

b使用控制台页面查看

c使用 http:localhost:15672/api/nodes 查看

处理方案:

手动处理:

a挂起客户端进程,如果进程数过多可以忽略这一步

b删除集群中所有镜像队列配置,如果没有删除镜像队列配置,恢复过程中可能会出现队列“漂移”现象

c挑选信任分区(通常为集群节点),判断标准:是否有Disk节点、分区节点数、分区队列数、分区客户端连接数

d使用 stop_app 命令手动关闭非信任分区的节点(通常为已处于非集群的节点)

e修复非信任区节点主机的网络后使用 start_app 重启节点

f查看集群是否已经恢复,如果没有恢复,需要重启信任分区的节点;成功恢复,重新建立镜像队列配置

g如果第一步操作了,则重启生产者和消费者的项目服务;没有操作,需要查看项目服务是否已经建立与集群环境的连接

自动处理:

自带三种网络分区处理方式,默认为 ignore 模式(不自动处理),如果要开启,需要配置 rabbitmq.config

中的 cluster_paritition_handling 参数

pause-minority 发生网络分区时检测自己,如果处于少数派则关闭自己(如果节点分区数一致,则可能会导致两个分区全部关闭导致MQ服务都不可用)

pause-if-all-down 每个节点预先配置一个节点表,当失去和列表中所有节点的通信时则关闭自己(配置不合理可能会导致所有节点都宕机)

autoheal 发生网络分区时,每个节点都使用特定算法自动决定一个“获胜分区”,然后重启不在分区的其他节点(当有存在关闭状态的节点,不生效)

若有收获,就点个赞吧