8

我想用所有三种模式重现网络分区场景-ignore和。我怎样才能做到这一点?我尝试停止(/sbin/service reboot)集群的一个节点,但这并没有导致任何网络分区。我还尝试删除一个节点上的 mnesia 以在集群中创建不一致的 mnesia,但这也无济于事。autohealpause_minority

4

4 回答 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']}]}

RabbitMQ 网络分区文档

于 2020-11-12T07:24:55.860 回答
0

如果您使用的是 docker,断开连接的网络将激活分区。

docker network disconnect network_name rabbitmq_container_name
于 2022-02-23T07:48:35.873 回答