воскресенье, 14 апреля 2019 г.

По следам мануала: RabbitMQ + cluster

RabbitMQ поддерживает полноценную сборку кластера. Однако, при её настройке стоит учитывать несколько особенностей.

Во-первых стоит отметить что RabbitMQ и Erlang сейчас поддерживают только x64. Я попробовал компилировать под x32 - не вышло, упало где-то именно внутри rabbitmq-server и на мой скромный вопрос никто в слаке не ответил. Говорят, что есть какой-то патч под Debian, но каков статус его совместимости - неизвестно. Кстати, в оффициальном мануале по компиляции ссылки на него естественно нет.  

При этом в кластере RabbitMQ версии Erlang и RabbitMQ должны быть одинаковы на всех нодах даже в МИНОРНЫХ ВЕРСИЯХ. Это делается из-за минорных несовместимостей, которые по автору мануала, могут привести к серьёзным проблемам. Апологеты ФП, ау? Вы же обещали что иммутабельность избавит нас от багов, а тут банальная версионность не может поддерживаться (ну да ладно).

На установщик RabbitMQ под Windows 10 ругается SmartScreen, но если нажать "Подробнее", то появится ссылка установку. По умолчанию консольные утилиты под Windows находятся в C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.14\sbin

Под Ubuntu свежий RabbitMQ лучше ставить из собственных репозиториев Erlang и RabbitMQ (есть на оффициальном сайте).

На что ещё стоит обратить внимание? На всех нодах должен быть одинаковым файл .erlang.cookie.

На обоих нодах (мне правда хватило одной) в простой конфигурации необходимо создать файл rabbitmq.conf и проверить что хостнеймы на обоих нодах резолвятся на верные IP (помимо портов):

cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config

cluster_formation.classic_config.nodes.1 = rabbit@hostname1.eng.example.local
cluster_formation.classic_config.nodes.2 = rabbit@hostname2.eng.example.local

Кроме этого, при соединении с хостом, который не является localhost, блокируется логин с пользователя guest - это стоит учесть.
Можно создать нового и даже дать ему админские права:

rabbitmqctl add_user user 1
rabbitmqctl set_user_tags user administrator
rabbitmqctl set_permissions -p / user ".*" ".*" ".*"

В остальном, если всё (порты и конфиг) настроены, то стартовать очень просто:

rabbitmqctl start_app
rabbitmqctl cluster_status

Из плюсов этого подхода хочу отметить, что при всех проблемах, между нодами синхронизируется всё: очереди, пользователи, обмены. Из-за этого можно не думать особо о топологии и просто работать. Мне понравилось, но проблемы с версиями - это всё же грустно.

Комментариев нет:

Отправить комментарий