在Consul注册后,让RabbitMQ Autocluster在Rabbit MQ上生成一个集群

使用为Consulconfiguration的rabbitmq-autocluster ,我可以启动2个正确注册到Consul的RMQ实例。 我可以通过查看Consul的网页graphics用户界面来查看“rabbitmq”服务button上的“2通过”。 但是, rabbitmqctl cluster_status并不表示RMQ实例已聚集。

下面你可以看到一个关于不能连接到rabbit@node1 ,但是没有任何东西被configuration成这个名字。 这是根本还是我的问题? 我是否需要设置RMQ Docker容器主机名才能使其工作? 我认为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 === 

**编辑**以上是在两台RMQ机器的另一台机器上使用一台Consul服务器。 我已经使用在运行每个RMQ实例的相同机器上运行的Consul容器再次尝试,以充当Consul客户端。 RMQ实例将启动并注册到其共同主持的Consul客户端。 两个Consul客户端连接到同一个Consul服务器。 当第一个RMQ实例经过足够的时间后,启动其中一个RMQ实例时,我们可以看到:

 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正在使用它的主机名的IP地址注册每个RMQ实例,因为有一个. 它认为这是一个FQDN。 如果将RABBITMQ_USE_LONGNAME设置为true ,则RMQ将无法使用此输出进行引导 。

您需要为您的docker实例提供一个有意义的主机名,以及两个实例可以parsing的主机名。

例如,在您提供的日志中,以下是由docker自动生成的主机名:

  • 节点1:

     node : rabbit@edae08d9e0bc 
  • 节点2:

     node : rabbit@e9bd0b21c5af 

一旦你为你的实例手动设置了一个“可parsing的”主机名,RabbitMQ节点将能够通信并形成一个集群。