Пошаговое руководство по развертыванию кластера RabbitMQ Active-Passive
Реализация высокой доступности (HA) для критически важных служб обмена сообщениями требует надежной избыточности. Настройка кластера RabbitMQ Active-Passive — это классический подход для достижения этой цели, гарантирующий, что в случае сбоя активного узла назначенный пассивный узел сможет быстро взять на себя управление, минимизируя время простоя. Это руководство содержит исчерпывающий, пошаговый процесс настройки такого развертывания, охватывающий предварительные условия, конфигурацию узлов и обеспечение бесперебойных возможностей аварийного переключения.
Этот шаблон развертывания основан на стандартной кластеризации RabbitMQ в сочетании с внешним механизмом (например, Pacemaker или простыми скриптами) для управления захватом IP-адресов при сбое. В этом руководстве мы сосредоточимся на аспекте кластеризации RabbitMQ, который лежит в основе настройки HA.
Предварительные условия для кластера Active-Passive
Прежде чем приступить к настройке, убедитесь, что следующие предварительные условия выполнены на всех предполагаемых узлах кластера (Узел A - Активный, Узел B - Пассивный):
- Идентичные версии программного обеспечения: Все узлы должны работать под одной и той же версией RabbitMQ Server и Erlang/OTP.
- Доступность сети: Все узлы должны иметь возможность обмениваться данными друг с другом через необходимые порты (по умолчанию 5672 для AMQP, 25672 для кластеризации).
- Разрешение имен хостов: Настройте файл
/etc/hosts(или DNS) на всех узлах так, чтобы каждый узел мог надежно разрешать имя хоста всех других узлов. - Согласованность Cookie: «Магический cookie» Erlang должен быть идентичным на всех узлах. Это крайне важно для доверия узлов друг другу при кластеризации.
Установление согласованности Cookie
Cookie Erlang определяет, могут ли узлы безопасно обмениваться данными. Его необходимо скопировать с первого инициализированного узла на все остальные.
На Узле A (Первый узел):
Найдите файл cookie (обычно /var/lib/rabbitmq/.erlang.cookie или ~/.erlang.cookie в зависимости от метода установки) и скопируйте его содержимое.
На Узле B (и последующих узлах):
- Остановите службу RabbitMQ:
bash sudo systemctl stop rabbitmq-server - Замените существующий файл cookie содержимым, скопированным с Узла A, обеспечив правильные разрешения (обычно
400).
bash # Пример использования echo (замените содержимое по мере необходимости) echo "YOUR_LONG_COOKIE_STRING" | sudo tee /var/lib/rabbitmq/.erlang.cookie sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie - Запустите службу на Узле B:
bash sudo systemctl start rabbitmq-server
Шаг 1: Настройка имен хостов и сети
Убедитесь, что файлы хостов на Узле A и Узле B правильно сопоставляют их имена хостов.
Пример /etc/hosts (на обоих серверах):
192.168.1.10 rabbitmq-node-a
192.168.1.11 rabbitmq-node-b
Шаг 2: Инициализация первого узла кластера (Активного)
Узел A будет начальным основным узлом, где кластер устанавливается в первую очередь.
- Запустите службу на Узле A (если она еще не запущена):
bash sudo systemctl start rabbitmq-server - Проверка состояния: Убедитесь, что узел работает правильно.
bash rabbitmqctl status
Шаг 3: Подключение второго узла (Пассивного) к кластеру
Теперь мы даем указание Узлу B присоединиться к кластеру, возглавляемому Узлом A.
- Остановите службу на Узле B (если она запущена):
bash sudo systemctl stop rabbitmq-server -
Команда присоединения: Выполните команду присоединения на Узле B, указав имя хоста Узла A в качестве пира.
bash rabbitmqctl join_cluster rabbit@rabbitmq-node-a
Совет: Используйте имя хоста, определенное в/etc/hosts. -
Запустите службу на Узле B:
bash sudo systemctl start rabbitmq-server
Шаг 4: Проверка формирования кластера
Войдите на Узел A и убедитесь, что оба узла распознают друг друга.
rabbitmqctl cluster_status
Ожидаемый фрагмент вывода:
Вы должны увидеть rabbitmq-node-a и rabbitmq-node-b в списке running_nodes.
Cluster status of node rabbit@rabbitmq-node-a ...
[{nodes,[{disc,[rabbit@rabbitmq-node-a,rabbit@rabbitmq-node-b]}]},
{running_nodes,[rabbit@rabbitmq-node-a,rabbit@rabbitmq-node-b]},
...
]
Шаг 5: Настройка высокой доступности (Кластеризация очередей)
Стандартная кластеризация RabbitMQ позволяет узлам обмениваться метаданными (пользователями, обменниками), но сообщения, находящиеся в очередях, обычно не реплицируются автоматически, если не применяются определенные политики HA. Для истинного аварийного переключения Active-Passive должны использоваться зеркалированные очереди.
Определение политики
Политика применяется к очередям, соответствующим определенным шаблонам, для определения количества копий очереди, которые должны существовать в кластере, и где они должны быть продвинуты.
Используйте команду rabbitmqctl set_policy на любом узле для обеспечения зеркалирования по всему кластеру ("^").
```bash
Установить политику с именем 'ha-all', которая зеркалирует очереди, соответствующие любому имени ('^')
на все узлы в кластере (всего 3 узла), и установить поведение 'promote'.
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"'