我想用所有三种模式重现网络分区场景-ignore
和。我怎样才能做到这一点?我尝试停止(/sbin/service reboot)集群的一个节点,但这并没有导致任何网络分区。我还尝试删除一个节点上的 mnesia 以在集群中创建不一致的 mnesia,但这也无济于事。autoheal
pause_minority
问问题
3313 次
4 回答
5
为了模拟网络分区,您可以使用阻止传出连接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
恢复网络。
于 2016-03-04T13:12:50.967 回答
0
为上述答案添加更多详细信息:
在 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”值)
于 2017-08-27T14:31:48.723 回答
0
我设法通过阻塞25672
端口来模拟/重现 RabbitMQ 的网络分区。
25672:用于节点间和 CLI 工具通信
我在不同的 AWS 实例中有两个 RabbitMQ 节点。
为了模拟网络分区,我为该端口配置了丢弃 tcp 数据包,等待 60 秒(根据 Net Tick Time 参数可能有所不同),然后移除端口阻塞(这是网络分区检测所必需的)。
添加端口阻塞规则(优先级最高):
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']}]}
于 2020-11-12T07:24:55.860 回答
0
如果您使用的是 docker,断开连接的网络将激活分区。
docker network disconnect network_name rabbitmq_container_name
于 2022-02-23T07:48:35.873 回答