Распределенные узлы RabbitMQ не узнают друг друга

Я работаю над распределенным POC RabbitMQ и застрял в основах кластеризации узлов.
Я пытаюсь следовать руководство по кластеризации, так что это мой справочник.
После установки erlang (R14B04) и Rabbit (2.8.2-1) я скопировал содержимое файла .erlang.cookie с одного узла. к двум другим.
Я не был уверен, как заставить erlang заметить это изменение, и мне пришлось перезапустить сами машины (довольно грубая сила, но я совсем не знаю erlang).
Кроме того Я открыл в iptables 4369 и 5 дополнительных портов для связи и разместил под /usr/lib64/erlang/bin/sys.config следующий конфиг:

{kernel,[{inet_dist_listen_min, XX00},{inet_dist_listen_max,XX05}]}]

Затем еще один перезапуск (тупой, я знаю), чтобы убедиться, что erlang учитывает это, но все же, когда я запускаю:

rabbitmqctl cluster rabbit@HostName1

Я получил:

Clustering node rabbit@HostName2 with [rabbit@HostName1] ...
Error: {no_running_cluster_nodes,[rabbit@HostName1],
                                 [rabbit@HostName1]}

Есть шанс, что моя возня с erlang.cookie или с портами не увенчалась успехом, но я не знаю, как их проверить. Я пытался ввести erl в cmd, а затем erl_epmd:names() или другие команды, чтобы получить больше информации, но я, вероятно, далеко не в мире erlang.

Был бы очень признателен за любую помощь

Обновление:
Я попытался пропинговать два узла erlang вручную и получил обратно pang.
Я сделал следующее:
Подключился к двум узлам, остановил rabbitmq (не был уверен, что это необходимо, но чтобы быть уверенным), запустил erlang так (erl -sname dilbert и erl -sname dilbert2), когда запустилась командная строка erlang, я запустил node(). на каждом из них и получил dilbert@HostName1 и dilbert2@HostName2 соответственно. Затем я попытался запустить net_adm:ping('dilbert'). и net_adm:ping('dilbert@HostName1'). с одинарными кавычками и без них с обоих узлов (изменив имена, конечно) и получил во всех 8 случаях pang.
Когда я запустил nodes(). на одной из машин, я получил пустой массив. .
Я также пытался разрешить весь трафик через брандмауэр (сценарий), а затем запустить приведенные выше команды (не волнуйтесь, они снова включены) и по-прежнему возвращаются pang.
Обновление 2:
По какой-то причине у меня было несоответствие файлов cookie, которое мне нужно было устранить (спасибо, @ kjw0188 за предложение [я запустил erlang:get_cookie(). в командной строке erlang]).
Это не помогло, и мне нужно было полностью остановить iptables (не знаю, почему, но скоро разберусь) и загрузить узел erlang с -name dilbert@my-ip, потому что у моих стоечных серверов нет DNS-имени. Это, наконец, позволило мне получить pong и увидеть, что узлы видят друг друга (nodes(). возвращает непустой массив после проверки связи).
Проблема, с которой я столкнулся сейчас, заключается в том, как указать RabbitMQ использовать -name вместо - имя при запуске erlang.


person Ittai    schedule 14.06.2012    source источник
comment
Вы видели, можете ли вы запускать узлы erl на каждой машине и смотреть, могут ли они пинговать друг друга?   -  person kjw0188    schedule 15.06.2012
comment
@ kjw0188 kjw0188 Еще не пробовал (нуб erlang). Вы знаете, как я могу проверить, что текущий узел не работает? Я думаю, что RabbitMQ запускает узел при загрузке, поэтому я остановлю его, но я хочу убедиться, что ни один узел не работает, прежде чем я попробую ваше предложение. Спасибо   -  person Ittai    schedule 15.06.2012
comment
Вам не нужно отключать кролика, но если вы хотите, вы можете попробовать остановить службу sudo /etc/init.d/rabbitmq-server stop   -  person kjw0188    schedule 16.06.2012
comment
@ kjw0188 kjw0188 Все еще не повезло, см. Мое обновление выше. Спасибо   -  person Ittai    schedule 16.06.2012
comment
Куки совпадают? Попробуйте erlang:get_cookie(). на dilbert и dogbert или установите файл cookie вручную с помощью параметра командной строки -setcookie. Если они по-прежнему не могут пропинговать друг друга, похоже, что erlang по какой-то причине не может найти другие узлы. Доступны ли хосты обычным ping? Используйте имя хоста для машин для проверки связи, а не IP-адрес.   -  person kjw0188    schedule 16.06.2012
comment
@ kjw0188 Как ни странно, один из файлов cookie не совпал. По какой-то причине у меня есть несколько файлов cookie на каждом узле (возможно, это связано с rabbitMQ), и один из файлов cookie не соответствует. Плохая новость заключается в том, что даже после того, как я исправил это, я все еще получаю обратно pang. У меня была проблема со связью между узлами не с IP-адресом, и я думаю, что это связано с тем, что они размещены в Rackspace. Я постараюсь проверить это у них и обновить здесь, как только появится что-то новое. Спасибо за вашу помощь и терпение.   -  person Ittai    schedule 16.06.2012
comment
Я просто хочу добавить, что я работаю над Windows, и у меня также были проблемы с кластеризацией. Я продолжал получать сообщение TCP-соединение успешно, но дистрибутив Erlang не удалось. Оказывается, имя хоста чувствительно к регистру даже в Windows, поэтому вместо rabbit@rabbitmq_node1 мне пришлось указать rabbit@RABBITMQ_NODE1, потому что именно так оно отображается в %COMPUTERNAME%   -  person Alf47    schedule 14.08.2014


Ответы (5)


Таким образом, у меня было несколько проблем с подключением двух моих узлов RabbitMQ-
я добавлю, что мои узлы размещены в стоечном пространстве, поэтому у них нет отображаемого имени хоста по умолчанию и требуется iptables, поскольку нет DMZ или встроенной системы безопасности. групповая концепция, такая как амазонка.

Проблемы:
1. Cookie. Не знаю, как и почему, но у меня было несколько экземпляров .erlang.cookie/root, в моем домашнем каталоге и в /var/lib/rabbitmq/). Я сохранил только один в rabbitmq и проверил все узлы имеют один и тот же файл cookie.
2. IPTables. Чтобы узлы могли общаться, мне нужно было открыть порт epmd и диапазон портов для фактической связи inet_dist_listen_min inet_dist_listen_max.

/sbin/iptables -A INPUT -i eth1 -p tcp --dport ${epmd} -s ${otherNode} -j ACCEPT
/sbin/iptables -A INPUT -i eth1 -p tcp --dport ${inet_dist_listen_min}:${inet_dist_listen_max} -s ${otherNode} -j ACCEPT  

empd — это обычный порт 4369, а для другого диапазона используйте любой диапазон, который вы хотите.
${otherNode} — это IP-адрес моего другого узла.
Мне также нужно было настроить erlang через rabbitmq для использования этих портов (см. файл конфигурации в конце )
3. Имя хоста. Поскольку у меня нет имени хоста, мне нужно было отредактировать скрипты кролика, чтобы использовать -name, а не -sname (первый указывает erlang взять полное имя, последний означает короткое имя и, таким образом, добавляет символ @ и имя хоста).
Это было достигнуто путем редактирования:
/usr/lib/rabbitmq/bin/rabbitmqctl
В начало добавлено определение свойства RABBITMQ_NODE_IP_ADDRESS

DEFAULT_NODE_IP_ADDRESS=auto
DEFAULT_NODE_PORT=5672
[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
[ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${NODE_PORT}

[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" != "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_IP_ADDRESS=${DEFAULT_NODE_IP_ADDRESS}
[ "x" != "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${DEFAULT_NODE_PORT}

и в фактической команде erl я изменил
-sname ${RABBITMQ_NODENAME} \ на
-name ${RABBITMQ_NODENAME}@${RABBITMQ_NODE_IP_ADDRESS}\.
Это заставило rabbitmq прослушивать только указанный IP-адрес (указанный в файле конфигурации в конце) и загружать с этим IP-адресом вместо обычного имя хоста.

отредактировано /usr/lib/rabbitmq/bin/rabbitmq-server
Фактическая команда erl изменена с -sname ${RABBITMQ_NODENAME} \ на -name ${RABBITMQ_NODENAME}@${RABBITMQ_NODE_IP_ADDRESS}\

Добавлен файл конфигурации кролика (/etc/rabbitmq/rabbitmq-env.conf) с:

#the ip address which rabbit should use, this is to limit rabbit to only use internal rackspace communication and not publicly accessible ports  
NODE_IP_ADDRESS=myIpAdress  
#had to change the nodename becaue otherwise rabbitmq used rabbit@Hostname and not only rabbit  
NODENAME=myCompany
#This instructed rabbit to instruct erlang which ports it should use for its communications with other nodes  
export SERVER_ERL_ARGS="$SERVER_ERL_ARGS -kernel inet_dist_listen_min somePort -kernel inet_dist_listen_max someOtherBiggerPort"

Некоторые ресурсы, которые помогли мне на этом пути:
Руководство по кластеризации RabbitMQ
Кластеризация серверов RabbitMQ для обеспечения высокой доступности
страница руководства Rabbitmq-env.conf(5)< br> Связь узлов по общедоступному IP-адресу erlang список рассылки (средний пост)
Настройка кластера RabbitMQ в облаке

Надеюсь, это поможет кому-то еще.

РЕДАКТИРОВАТЬ:
Не знаю, как я ошибся, но мне показалось, что мои инструкции по порту erlang-rabbit не были приняты во внимание или их было недостаточно. В итоге пришлось разрешить все коммуникации между двумя узлами...

person Ittai    schedule 18.06.2012

Одна вещь, на которую действительно следует обратить внимание, — это пробелы любого рода в файле cookie erlang, особенно разрывы строк ПОСЛЕ содержимого файла cookie. Пока оба идентичны, все в порядке, но когда у одного есть разрыв строки, а у другого нет, ничего не будет работать.

person Jonathan Oliver    schedule 20.09.2012

Предыстория: я столкнулся с той же проблемой при настройке кластера Rabbitmq. Я использовал 2 док-контейнера, работающих на моем хост-компьютере, что эквивалентно 2 отдельным узлам, и я не мог создать кластер из этих двух.

Решение. 1. Убедитесь, что на всех узлах вашего кластера установлены одинаковые файлы cookie erlang. Расположение по умолчанию — /var/lib/rabbitmq/.erlang.cookie. Этот файл используется для аутентификации, поэтому убедитесь, что он одинаков на всех узлах. После изменения файла .erlang.cookie перезапустите службу rabbitmq.

  1. Убедитесь, что узлы доступны друг другу, используйте ping или telnet для проверки соединения.

  2. Убедитесь, что в /etc/hosts есть правильные записи, например, если Rabbit2 хочет присоединиться к кластеру Rabbit1, файл /etc/hosts of Rabbit2 должен содержать.

    172.68.1.6      rabbit1
    172.68.1.7      rabbit2
    

Теперь остановите службу, используя $rabbitmqctl stop_app, а затем $rabbitmqctl join_cluster rabbit@rabbit1, запустите службу с помощью rabbitmqctl start_app и проверьте $rabbitmqctl cluster_status, чтобы узнать, присоединились ли вы к кластеру или нет.

Я следовал официальной документации Rabbitmq для настройки кластера.

person Rahul Mishra    schedule 29.07.2016

чтобы изменить поведение имени/имени RabbitMQ, вы можете отредактировать сценарии:

  • RabbitMQ-мульти
  • RabbitMQ-сервер
  • кроликmqctl

Пример В скрипте rabbitmqctl есть следующий фрагмент кода:

exec erl \
    -pa "${RABBITMQ_HOME}/ebin" \
    -noinput \
    -hidden \
    ${RABBITMQ_CTL_ERL_ARGS} \
    -sname rabbitmqctl$$ \
    -s rabbit_control \
    -nodename $RABBITMQ_NODENAME \
    -extra "$@"

Вы должны изменить его в:

exec erl \
    -pa "${RABBITMQ_HOME}/ebin" \
    -noinput \
    -hidden \
    ${RABBITMQ_CTL_ERL_ARGS} \
    -name rabbitmqctl$$ \
    -s rabbit_control \
    -nodename $RABBITMQ_NODENAME \
    -extra "$@"
person Vincenzo Maggio    schedule 18.06.2012
comment
Спасибо! Я только что понял это пару часов назад, и я работаю над составлением полного отчета о своих проблемах, чтобы опубликовать его в качестве ответа (поскольку у меня было несколько проблем, связанных с распределенным rabbitmq). - person Ittai; 18.06.2012

http://pearlin.info/?p=1672

поэтому вам нужно скопировать файл cookie с узла, к которому вы пытаетесь подключиться

пример: - кролик@узел1 кролик@узел2

перейдите по адресу rabbit@node1 и скопируйте файл cookie из каталога cat /var/lib/rabbitmq/.erlang.cookie

перейдите по адресу rabbit@node2, удалите текущий файл cookie и вставьте новый.

на том же узле

/usr/sbin/rabbitmqctl stop_app

/usr/sbin/rabbitmqctl сброс

Кластер /usr/sbin/rabbitmqctl rabbit@node1

должен сделать это.

то же самое задокументировано здесь.

http://pearlin.info/?p=1672

person user2348359    schedule 03.05.2013
comment
Ссылка, которую вы разместили http://pearlin.info/?p=1672, не на английском языке и не о программировании. - person Eric Leschinski; 02.09.2014