使用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 设置为true
,RMQ 启动失败,输出如下信息。
答案1
您需要为您的 docker 实例提供一个有意义的主机名,以及两个实例都可以解析的主机名。
例如,在您提供的日志中,以下是 docker 自动生成的主机名:
节点 1:
node : rabbit@edae08d9e0bc
节点 2:
node : rabbit@e9bd0b21c5af
一旦您为实例手动设置“可解析”主机名,RabbitMQ 节点将能够通信并形成集群。