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