容器:

容器:

使用rabbitmq-自动集群配置为 Consul 后,我可以启动 2 个 RMQ 实例,这些实例可以正确地向 Consul 注册。我可以通过查看 Consul Web GUI 来验证这一点,在“rabbitmq”服务按钮上看到“2 passing”。但是,这rabbitmqctl cluster_status并不表示 RMQ 实例已集群化。

下面您可以看到一个错误,提示无法连接到rabbit@node1,但没有任何使用该名称的配置。这是根源还是我的问题?我需要设置 RMQ Docker 容器主机名才能使其工作吗?我假设 rabbitmq-autocluster 允许集群设置而无需处理主机名(/etc/hosts或 DNS),因为 Consul 会处理所有这些。这错了吗?

RMQ 和 Consul 都在 Docker 容器中运行,运行方式如下:

容器:

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 实例是否真正集群。但是,当我运行此命令时,它没有显示任何集群:

日志

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 服务器。我再次尝试使用Consul 容器在运行每个 RMQ 实例的同一台机器上运行,以充当 Consul 客户端。RMQ 实例将启动并向其共同托管的 Consul 客户端注册。两个 Consul 客户端都连接到同一个 Consul 服务器。在经过足够的时间让第一个 RMQ 实例完全向 Consul 注册后启动其中一个 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 设置为trueRMQ 启动失败,输出如下信息

答案1

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

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

  • 节点 1:

    node           : rabbit@edae08d9e0bc
    
  • 节点 2:

    node           : rabbit@e9bd0b21c5af
    

一旦您为实例手动设置“可解析”主机名,RabbitMQ 节点将能够通信并形成集群。

相关内容