Я пытаюсь настроить кластер серверов RabbitMQ, чтобы получить высокодоступные очереди с использованием активной/пассивной архитектуры сервера. Я следую этим руководствам:
- http://www.rabbitmq.com/clustering.html
- http://www.rabbitmq.com/ha.html
- http://karlgrz.com/rabbitmq-highly-available-queues-and-clustering-using-amazon-ec2/
Мои требования к высокой доступности просты, у меня есть два узла (CentOS 6.4) с RabbitMQ (v3.2) и Erlang R15B03. Node1 должен быть "активным", отвечающим на все запросы, а Node2 должен быть "пассивным" node, в котором все очереди и сообщения реплицируются (из Node1).
Для этого я настроил следующее:
- Node1 с RabbitMQ работает нормально в некластерном режиме
- Node2 с RabbitMQ работает нормально в некластерном режиме
Следующим, что я сделал, было создание кластера между обоими узлами: объединение Node2 в Node1 (руководство 1). После этого я настроил политику для зеркалирования очередей (руководство 2), реплицируя все очереди и сообщения среди всех узлов в кластере. Это работает, я могу подключиться к любому node и публиковать или потреблять сообщение, в то время как оба узла доступны.
Проблема возникает, когда у меня есть очередь queueA, которая была создана на Node1 (master on queueA), и когда Node1 остановлен, я не могу подключиться к очереди A в Node2 для создания или потребления сообщений, Node2 что Node1 недоступен (я думаю, что queueA не реплицируется в Node2, а Node2 не может быть назначен мастером очередиA).
Ошибка:
{ "Операция AMQP была прервана: AMQP close-reason, инициированный Peer, code = 404, text =\" NOT_FOUND - home node "rabbit @node1" прочного queue 'queueA' в vhost 'app01' недоступен \ ", classId = 50, methodId = 10, cause =" }
Последовательность используемых шагов:
Node1:
1. rabbitmq-server -detached
2. rabbitmqctl start_app
Node2:
3. Copy .erlang.cookie from Node1 to Node2
4. rabbitmq-server -detached
Присоедините кластер (Node2):
5. rabbitmqctl stop_app
6. rabbitmqctl join_cluster [email protected]
7. rabbitmqctl start_app
Настроить политику зеркалирования очереди:
8. rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Примечание. Шаблон, используемый для имен очередей, - "" (все очереди).
Когда я запускаю "rabbitmqctl list_policies" и "rabbitmqctl cluster_status", все нормально.
Почему Node2 не может ответить, если Node1 недоступен? Что-то не так в этой настройке?