集群网络分区处理方案
如果配置了镜像队列的RabbitMQ集群没有使用VIP进行代理,项目直接连接各MQ节点进行访问,当集群内某些节点出现网络问题导致无法联通集群 网络环境,集群就会出现网络分区问题
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 发生网络分区时,每个节点都使用特定算法自动决定一个“获胜分区”,然后重启不在分区的其他节点(当有存在关闭状态的节点,不生效)
若有收获,就点个赞吧