Назад | Перейти на главную страницу

Получение автокластера RabbitMQ для создания кластера на Rabbit MQ после регистрации Consul

С помощью rabbitmq-автокластер настроенный для Consul, я могу запустить 2 экземпляра RMQ, которые правильно регистрируются в Consul. Я могу проверить это, посмотрев на веб-интерфейс Consul, чтобы увидеть "2 прохождения" на кнопке службы "rabbitmq". Тем не мение, rabbitmqctl cluster_status не указывает, что экземпляры RMQ сгруппированы.

Ниже вы можете увидеть ошибку о невозможности подключения к rabbit@node1, но с таким именем ничего не настроено. Это корень или моя проблема? Нужно ли мне устанавливать имена хостов RMQ Docker Container, чтобы это работало? Я предположил, что rabbitmq-autocluster позволяет настроить кластер без необходимости возиться с именами хостов (/etc/hosts или DNS), потому что Consul все это сделает. Это не так?

И RMQ, и Consul запускаются в Docker-контейнерах, работают так:

Контейнеры:

RMQ 1

docker run --name rmq1 -d \
  -e AUTOCLUSTER_TYPE=consul \
  -e CONSUL_SCHEME=http \
  -e CONSUL_HOST=192.168.99.100 \
  -e CONSUL_PORT=8500 \
  -e CONSUL_SERVICE=rabbitmq \
  -e CLUSTER_NAME=rmqcluster \
  -l consul \
  -p 4369:4369 \
  -p 5672:5672 \
  -p 15672:15672 \
  -p 25672:25672 \
  gavinmroy/alpine-rabbitmq-autocluster

RMQ 2

Обратите внимание на асимметричный порт вперед

docker run --name rmq2 -d \
  -e AUTOCLUSTER_TYPE=consul \
  -e CONSUL_SCHEME=http \
  -e CONSUL_HOST=192.168.99.100 \
  -e CONSUL_PORT=8500 \
  -e CONSUL_SERVICE=rabbitmq \
  -e CLUSTER_NAME=rmqcluster \
  -l consul \
  -p 4370:4369 \
  -p 5673:5672 \
  -p 15673:15672 \
  -p 25673:25672 \
  gavinmroy/alpine-rabbitmq-autocluster

Консул

docker run --name consul \
-p 8400:8400 -p 8500:8500 -p 8600:53/udp \
-h consul progrium/consul \
-server -bootstrap -ui-dir /ui

Из комментарий разработчика по этому поводу, это выглядит как rabbitmqctl cluster_status должно быть использовано для установления того, что экземпляры RMQ действительно сгруппированы. Однако, когда я запускаю эту команду, она не показывает никаких кластеров:

Журналы

RMQ 1

=INFO REPORT==== 15-Feb-2016::19:57:56 ===                                    
node           : rabbit@edae08d9e0bc                                          
home dir       : /var/lib/rabbitmq                                            
config file(s) : /usr/lib/rabbitmq/etc/rabbitmq/rabbitmq.config               
cookie hash    : iqG7DCBA+lxNNLQq/Y6efg==                                     
log            : tty                                                          
sasl log       : tty                                                          
database dir   : /var/lib/rabbitmq/mnesia                                     
Setting default log settings                                                  
=INFO REPORT==== 15-Feb-2016::19:57:57 ===                                    
autocluster: Registering node with consul                                     

=INFO REPORT==== 15-Feb-2016::19:57:57 ===                                    
autocluster: Node appears to be the first in the cluster    

RMQ 2

Обратите внимание, что это также первый узел в кластере.

=INFO REPORT==== 15-Feb-2016::19:58:07 ===  
node           : rabbit@e9bd0b21c5af
home dir       : /var/lib/rabbitmq
config file(s) : /usr/lib/rabbitmq/etc/rabbitmq/rabbitmq.config
cookie hash    : iqG7DCBA+lxNNLQq/Y6efg==
log            : tty
sasl log       : tty
database dir   : /var/lib/rabbitmq/mnesia
Setting default log settings
=INFO REPORT==== 15-Feb-2016::19:58:08 ===
autocluster: Registering node with consul

=INFO REPORT==== 15-Feb-2016::19:58:08 ===
autocluster: Node appears to be the first in the cluster

RMQ 2

Если я сбегу docker restart rmq2, я получаю ниже. Обратите внимание на ошибку

=INFO REPORT==== 15-Feb-2016::21:24:26 ===                                                                                                                                                                                                                              
node           : rabbit@e9bd0b21c5af
home dir       : /var/lib/rabbitmq
config file(s) : /usr/lib/rabbitmq/etc/rabbitmq/rabbitmq.config
cookie hash    : iqG7DCBA+lxNNLQq/Y6efg==
log            : tty
sasl log       : tty
database dir   : /var/lib/rabbitmq/mnesia
Setting default log settings
=INFO REPORT==== 15-Feb-2016::21:24:27 ===
autocluster: Registering node with consul

=ERROR REPORT==== 15-Feb-2016::21:24:32 ===
autocluster: Can not communicate with cluster nodes: [rabbit@node1]

=INFO REPORT==== 15-Feb-2016::21:24:32 ===

** РЕДАКТИРОВАТЬ ** В приведенном выше примере использовался один сервер Consul на отдельной машине от двух машин RMQ. Я попробовал это снова, используя Консул Контейнер работает на тех же машинах, на которых работает каждый из экземпляров RMQ, чтобы действовать как Consul Client. Экземпляры RMQ запустятся и зарегистрируются с их совместно размещенным клиентом Consul. Оба клиента Consul подключены к одному серверу Consul. При запуске одного из экземпляров RMQ после того, как прошло достаточно времени, чтобы 1-й экземпляр RMQ полностью зарегистрировался в Consul, мы видим следующее:

docker logs rmq2 | grep autoclusterautocluster: Registering node with consul 
autocluster: Can not communicate with cluster nodes: [rabbit@192]            
autocluster: Starting Consul Health Check TTL Timer          

Похоже, Consul регистрирует каждый экземпляр RMQ, используя его IP-адрес в качестве имени хоста, и потому что есть . в нем он думает, что это полное доменное имя. Если я установил RABBITMQ_USE_LONGNAME на true, RMQ не загружается с этим выводом.

Вам необходимо дать осмысленное имя хоста вашим экземплярам докеров и имена хостов, которые могут быть разрешены обоими экземплярами.

Например, в предоставленном вами журнале есть имена хостов, автоматически сгенерированные докером:

  • Узел 1:

    node           : rabbit@edae08d9e0bc
    
  • Узел 2:

    node           : rabbit@e9bd0b21c5af
    

После того как вы вручную установите «разрешаемое» имя хоста для своих экземпляров, узлы RabbitMQ смогут связываться и формировать кластер.