重现 RabbitMQ 网络分区场景
Reproduce RabbitMQ network partition scenario
我想用所有三种模式重现 网络分区场景 - ignore
、autoheal
和 pause_minority
。
我怎样才能做到这一点?我尝试停止(/sbin/service 重新启动)集群的其中一个节点,但这并没有导致任何网络分区。我还尝试删除一个节点上的 mnesia 以在整个集群中创建不一致的 mnesia,但这也没有帮助。
为了模拟网络分区,您可以使用 iptables
阻止传出连接
假设你有 3 个节点:
node1 - ip : 10.10.0.1
node2 - ip : 10.10.0.2
node3 - ip : 10.10.0.3
创建集群后,以节点2为例,
iptables -A OUTPUT -d 10.10.0.1 -j DROP
这样你就阻塞了连接,节点将进入网络分区。
然后
iptables -F
恢复网络。
为以上答案添加更多详细信息:
在 node2 或 node3 中执行以下命令以阻止来自其他节点的连接
sudo iptables -A INPUT -s 10.10.0.1 -j DROP
允许来自其他节点的连接/删除我们之前创建的防火墙规则
sudo iptables -D INPUT -s 10.10.0.1 -j DROP
查看现有的防火墙规则
iptables --list
注意:在少数集群设置中,只有当之前连接被阻塞的节点(通过'iptables'命令)能够与每个节点通信时,才会发生网络分区其他的。因此,尝试在 60 秒后阻止和取消阻止连接(这是默认 'net_ticktime' 值)
我通过阻塞 25672
端口成功模拟/重现了 RabbitMQ 的网络分区。
25672: used for inter-node and CLI tools communication
我在不同的 AWS 实例中有两个 RabbitMQ 节点。
为了模拟网络分区,我配置了丢弃该端口的 TCP 数据包,等待 60 秒 (may differ according to Net Tick Time parameter),然后移除了端口阻塞(这是网络分区检测所必需的).
添加端口屏蔽规则(优先级最高):
sudo iptables -I INPUT 1 -p tcp --dport 25672 -j DROP
sudo iptables -I OUTPUT 1 -p tcp --dport 25672 -j DROP
删除规则(60+ 秒后):
sudo iptables -D INPUT -p tcp --dport 25672 -j DROP
sudo iptables -D OUTPUT -p tcp --dport 25672 -j DROP
检查是否发生网络分区:
sudo rabbitmqctl cluster_status
partitions
属性 的数组中会有这样的节点
{partitions,[{'rabbit@ip-163-10-1-10',['rabbit@ip-163-10-0-15']}]}
如果您使用的是 docker,断开连接的网络将激活分区。
docker network disconnect network_name rabbitmq_container_name
我想用所有三种模式重现 网络分区场景 - ignore
、autoheal
和 pause_minority
。
我怎样才能做到这一点?我尝试停止(/sbin/service 重新启动)集群的其中一个节点,但这并没有导致任何网络分区。我还尝试删除一个节点上的 mnesia 以在整个集群中创建不一致的 mnesia,但这也没有帮助。
为了模拟网络分区,您可以使用 iptables
假设你有 3 个节点:
node1 - ip : 10.10.0.1
node2 - ip : 10.10.0.2
node3 - ip : 10.10.0.3
创建集群后,以节点2为例,
iptables -A OUTPUT -d 10.10.0.1 -j DROP
这样你就阻塞了连接,节点将进入网络分区。
然后
iptables -F
恢复网络。
为以上答案添加更多详细信息:
在 node2 或 node3 中执行以下命令以阻止来自其他节点的连接
sudo iptables -A INPUT -s 10.10.0.1 -j DROP
允许来自其他节点的连接/删除我们之前创建的防火墙规则
sudo iptables -D INPUT -s 10.10.0.1 -j DROP
查看现有的防火墙规则
iptables --list
注意:在少数集群设置中,只有当之前连接被阻塞的节点(通过'iptables'命令)能够与每个节点通信时,才会发生网络分区其他的。因此,尝试在 60 秒后阻止和取消阻止连接(这是默认 'net_ticktime' 值)
我通过阻塞 25672
端口成功模拟/重现了 RabbitMQ 的网络分区。
25672: used for inter-node and CLI tools communication
我在不同的 AWS 实例中有两个 RabbitMQ 节点。
为了模拟网络分区,我配置了丢弃该端口的 TCP 数据包,等待 60 秒 (may differ according to Net Tick Time parameter),然后移除了端口阻塞(这是网络分区检测所必需的).
添加端口屏蔽规则(优先级最高):
sudo iptables -I INPUT 1 -p tcp --dport 25672 -j DROP
sudo iptables -I OUTPUT 1 -p tcp --dport 25672 -j DROP
删除规则(60+ 秒后):
sudo iptables -D INPUT -p tcp --dport 25672 -j DROP
sudo iptables -D OUTPUT -p tcp --dport 25672 -j DROP
检查是否发生网络分区:
sudo rabbitmqctl cluster_status
partitions
属性 的数组中会有这样的节点
{partitions,[{'rabbit@ip-163-10-1-10',['rabbit@ip-163-10-0-15']}]}
如果您使用的是 docker,断开连接的网络将激活分区。
docker network disconnect network_name rabbitmq_container_name