损坏的 RabbitMQ 集群无法重新启动

损坏的 RabbitMQ 集群无法重新启动

我在 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.

这是经过净化的,但命令和意图被保留。

如果您希望队列进行故障转移,还需要配置高可用性:

https://www.rabbitmq.com/ha.html

相关内容