Rabbitmq Network Partitions 网络分区解决方案

高可用集群环境(镜像模式):

双节点:
rabbit@rabbit1(master)、rabbit@rabbit2(slave)

集群设置:

rabbit1控制台:

1
2
3
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

将节点2加入到集群,rabbit2控制台:

1
2
3
4
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app

参数“—ram”表示设置为内存节点,忽略此参数则默认为磁盘节点。可以用命令rabbitmqctl change_cluster_node_type disc
改变节点类型,需要注意的是集群环境中至少有一个为磁盘节点

最后查看集群状态:

1
2
3
4
5
6
7
root@rabbit2:/# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]},
{cluster_name,<<"rabbit@rabbit-cluster">>},
{partitions,[]},
{alarms,[{rabbit@rabbit1,[]},{rabbit@rabbit2,[]}]}]

首先解决网络分区导致队列不可用的问题,需要先设置队列的高可用策略,
在任意mq节点控制台执行命令:

1
rabbitmqctl set_policy -p / ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

-p 指定vhost
“^” 指定策略匹配到所有队列

然后进入rabbit1控制台,编辑mq配置分区恢复处理策略:

1
root@rabbit1:/# vim /etc/rabbitmq/rabbitmq.conf

添加以下内容:

1
2
3
4
5
6
7
8
9
## 指定网络分区处理策略
cluster_partition_handling = pause_if_all_down

## Recovery strategy. Can be either 'autoheal' or 'ignore'
cluster_partition_handling.pause_if_all_down.recover = autoheal

## Node names to check
cluster_partition_handling.pause_if_all_down.nodes.1 = rabbit@rabbit1
cluster_partition_handling.pause_if_all_down.nodes.2 = rabbit@rabbit2

RabbitMQ提供了4种处理网络分区的方式:

  1. ignore 默认,RabbitMQ不会自动做任何处理,即需要手动处理。
  2. pause_minority 这种处理方式适合集群节点数大于2个且最好为奇数的情况,因为当网络恢复时,有可能两个节点会自动启动恢复网络分区,也有可能还是保持关闭状态。
  3. pause_if_all_down, [nodes], ignore|autoheal RabbitMQ会自动关闭不能和[nodes]中节点通信的节点。
  4. autoheal RabbitMQ会自动决定一个获胜的(winning)分区,然后重启不在这个分区中的节点以恢复网络分区。

最后重启节点1,使策略生效。

如果对您有所帮助,欢迎投食!
0%