重现RabbitMQ网络分区方案

时间:2016-03-04 11:49:42

标签: rabbitmq rabbitmqctl

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

3 个答案:

答案 0 :(得分:2)

为了模拟网络分区,您可以使用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

恢复网络。

答案 1 :(得分: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'值)

答案 2 :(得分:0)

通过阻止25672端口,我设法为RabbitMQ模拟/复制了网络分区。

25672:用于节点间和CLI工具的通信

我在不同的AWS实例中有两个RabbitMQ节点。

为模拟网络分区,我为该端口配置了丢弃tcp数据包,等待60秒(may differ according to Net Tick Time parameter),然后删除端口阻塞(网络分区检测所需的)。 / p>

添加端口阻止规则(具有最高优先级):

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 network partition docs