我在 3 台服务器上运行 RabbitMQ,Erlang 和 RabbitMQ 的版本相同:RabbitMQ 3.4.1、Erlang 17.3
服务器 2 上的一个节点崩溃了。另外两个节点没有连接在一起:
服务器1:
[CentOS-62-64-minimal ~]$ sudo rabbitmqctl cluster_status
Cluster status of node 'rabbit@CentOS-62-64-minimal' ...
[{nodes,[{disc,['rabbit@CentOS-62-64-minimal',rabbit@de3,rabbit@mysql]}]},
{running_nodes,['rabbit@CentOS-62-64-minimal']},
{cluster_name,<<"rabbit@CentOS-62-64-minimal">>},
{partitions,[]}]
服务器3:
[de3 ~]$ sudo rabbitmqctl cluster_status
Cluster status of node rabbit@de3 ...
[{nodes,[{disc,['rabbit@CentOS-62-64-minimal',rabbit@de3,rabbit@mysql]}]},
{running_nodes,[rabbit@de3]},
{cluster_name,<<"rabbit@CentOS-62-64-minimal">>},
{partitions,[]}]
在服务器3上重启并重置rabbitmq后,终于连接到了服务器1:
[CentOS-62-64-minimal ~]$ sudo rabbitmqctl cluster_status
Cluster status of node 'rabbit@CentOS-62-64-minimal' ...
[{nodes,[{disc,['rabbit@CentOS-62-64-minimal',rabbit@de3,rabbit@mysql]}]},
{running_nodes,['rabbit@CentOS-62-64-minimal']},
{cluster_name,<<"rabbit@CentOS-62-64-minimal">>},
{partitions,[]}]
为什么仅 1 个节点宕机,集群就会“崩溃”?服务器 3 运行正常,但服务器 1 却不行:“队列位于已宕机的服务器上”。
至于服务器 2,它没有重新启动。手动重启后,我无法让它重新连接到集群,即使多次重置并删除 /var/lib/rabbitmq/mnesia/:
[root@mysql ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mysql ...
[{nodes,[{disc,[rabbit@mysql]}]},
{running_nodes,[rabbit@mysql]},
{cluster_name,<<"[email protected]">>},
{partitions,[]}]
[mysql ~]# rabbitmqctl stop_app
Stopping node rabbit@mysql ...
[root@mysql ~]# rabbitmqctl force_reset
Forcefully resetting node rabbit@mysql ...
[ysql ~]# rabbitmqctl join_cluster rabbit@CentOS-62-64-minimal
Clustering node rabbit@mysql with 'rabbit@CentOS-62-64-minimal' ...
Error: {ok,already_member}
[mysql ~]# rabbitmqctl start_app
Starting node rabbit@mysql ...
[mysql ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mysql ...
[{nodes,[{disc,[rabbit@mysql]}]},
{running_nodes,[rabbit@mysql]},
{cluster_name,<<"[email protected]">>},
{partitions,[]}]
我不知道哪里出了问题。上次发生这种情况时,我将 RabbitMQ 和 Erlang 升级到了最新版本。
答案1
今天我遇到了这个问题,当时我正在为一个故障修复事件设计一个故意中断的文档,以教导我们的运营团队如何修复问题。我故意将一个节点从集群中分离出来,但无法rabbitmqctl join_cluster
成功运行,因为集群认为该节点已经是成员。
将节点“rabbit@node-1”与“rabbit@node-0”进行聚类......完成(已是成员)。
最终,对我有用的是rabbitmqctl forget_cluster_node rabbit@node-1
从一个工作的集群节点。一旦我这样做了,我就能成功运行rabbtmqctl join_cluster rabbit@node-0
答案2
根据RabbitMQ 集群文档您的rabbitmqctl cluster_status
输出看起来不对;running_nodes
应该包含的不仅仅是您正在运行命令的本地节点。这说明它们无法正常通信,节点之间是否有防火墙?
答案3
Bodgit 是正确的,我可以从运行中的 Rabbit 集群告诉你,你的配置是错误的。看起来每个节点都是它自己的集群,只有它自己是当前运行的节点。
请参阅 RabbitMQ 文档以了解如何设置集群。
您应该在每个节点上看到类似下面的内容:
root@rabbit0:~# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbit0' ...
[{nodes,[{disc,['rabbit@rabbit0','rabbit@rabbit1']}]},
{running_nodes,['rabbit@rabbit1','rabbit@rabbit0']},
{cluster_name,<<"[email protected]">>},
{partitions,[]}]
...done.
root@rabbit1:~# rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbit1' ...
[{nodes,[{disc,['rabbit@rabbit0','rabbit@rabbit1']}]},
{running_nodes,['rabbit@rabbit0','rabbit@rabbit1']},
{cluster_name,<<"[email protected]">>},
{partitions,[]}]
...done.
这是经过净化的,但命令和意图被保留。
如果您希望队列进行故障转移,还需要配置高可用性: