作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:
Web服务器
代理服务器
ZooKeeper
Kafka
RabbitMQ(本章节)
前面介绍了网络分区的基本情况,哪当真的网络分区发生以后,我们应该如何来恢复这个网络分区呢?虽然上个小节介绍了通过自动降级来避免网络分区的出现,但是真实环境是很复杂的,甚至说网络分区必定会出现的,所以我们还需要掌握网络分区的处理方式。
如何处理网络分区
pause-minority): 在 pause-minority 模式下且网络问题修复后,暂停的节点通常能自动重新连接到多数派节点并开始同步恢复。这是最安全、首选的方式。如果能自动回复,其实不叫网络分区,而是只是节点故障(我这里尝试了多种方法均未能实现模拟网络分区,只能算是节点离线故障)。rabbitmqctl forget_cluster_node 命令将已脱离且数据可能过时/不一致的节点(通常是原少数派节点)从集群配置中移除,然后再将其作为新节点重新加入集群并同步数据。此操作有数据丢失风险,需充分评估。这个方式也本来是打算用来手工恢复的方法。由于没有模拟成功网络分区,所以我们这里模拟把mq03节点当作异常的节点,把他剔除集群在加入回来来模拟。
当前集群的情况:
Running Nodes
rabbit@rabbitmq01
rabbit@rabbitmq02
rabbit@rabbitmq03#当然我这个正式环境需要先停止mq进程
[root@rabbitmq03 rabbitmq]# /opt/rabbitmq_server-3.8.35/sbin/rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbitmq03 ...
[root@rabbitmq03 rabbitmq]#
[root@rabbitmq02 root]# /opt/rabbitmq_server-3.8.35/sbin/rabbitmqctl forget_cluster_node rabbit@rabbitmq03
Removing node rabbit@rabbitmq03 from the cluster
[root@rabbitmq02 root]# 这个时候整个集群就由3个节点变成2个节点。如果真实环境应该是需要先执行stop_app
[root@rabbitmq03 rabbitmq]# /opt/rabbitmq_server-3.8.35/sbin/rabbitmqctl join_cluster rabbit@rabbitmq01
Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq01
[root@rabbitmq03 rabbitmq]# /opt/rabbitmq_server-3.8.35/sbin/rabbitmqctl start_app
Starting node rabbit@rabbitmq03 ...
[root@rabbitmq03 rabbitmq]# 这个时候节点就算恢复成功。
如何预防网络分区?
net_ticktime 参数控制 Erlang 节点间的心跳间隔。适当增加(默认 60s)可能对不稳定的网络有一定容忍度,但会增加故障检测时间。需谨慎调整。总结:
RabbitMQ 的网络分区是集群在高可用部署中需要面对的关键挑战。默认的 pause-minority 模式通过牺牲少数派分区的可用性来换取整个集群的数据一致性(防止脑裂)。理解其原理、影响、检测方法和(自动/手动)恢复步骤对于运维 RabbitMQ 集群至关重要。预防措施(健壮网络、奇数节点、监控、Quorum Queues)应优先考虑。在处理恢复时,尤其是在手动干预时,务必保持高度谨慎,避免数据丢失。