Воспроизвести сценарий сетевого раздела RabbitMQ

Я хотел бы воспроизвести сценарий разделения сети со всеми тремя режимами — ignore, autoheal и pause_minority. Как я могу этого добиться? Я попытался остановить (/sbin/service reboot) один из узлов кластера, но это не привело к разделению сети. Я также попытался удалить мнезию на одном узле, чтобы создать несогласованную мнению во всем кластере, но это также не помогло.


person user2340345    schedule 04.03.2016    source источник


Ответы (3)


Чтобы имитировать сетевой раздел, вы можете заблокировать исходящие соединения, используя 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

для восстановления сети.

person Gabriele Santomaggio    schedule 04.03.2016
comment
Как имитировать локально тоже было бы полезно - person Superaghu; 27.03.2017
comment
это не работает при попытке имитировать сетевой раздел в кластере rabbitmq службы docker swarm из 3 реплик - person rok; 04.01.2018

Добавление дополнительной информации к приведенному выше ответу:

Выполните приведенную ниже команду либо в узле 2, либо в узле 3, чтобы заблокировать соединение с другими узлами.

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» по умолчанию)

person Jass    schedule 27.08.2017

Мне удалось смоделировать/воспроизвести сетевой раздел для RabbitMQ, заблокировав порт 25672.

25672: используется для связи между узлами и инструментами CLI.

У меня было два узла RabbitMQ в разных экземплярах AWS.

Чтобы имитировать сетевой раздел, я настроил отбрасывание TCP-пакетов для этого порта, подождал 60 секунд (может отличаться в зависимости от Net Tick параметр времени), а затем снял блокировку портов (необходимую для обнаружения сетевых разделов).

Добавление правил блокировки портов (с наивысшим приоритетом):

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

person Evgeny Melnikov    schedule 12.11.2020