RabbitMQ 教程

踢出集群节点

前面章节介绍了怎样搭建 RabbitMQ 集群,搭建集群的过程可以看作是向集群添加节点的过程。

下面将介绍怎样将节点从 RabbitMQ 集群中踢出?将节点从集群中踢出,可以减少集群的规模以节省硬件资源,也可以替换一个/多个硬件配置更好、性能更好的节点。

这里还是以前面章节搭建的 RabbitMQ 集群,该集群中有 node1、node2 和 node3 三个节点。

使用 rabbitmqctl forget_cluster_node 命令

首先在需要踢出的节点上执行 rabbitmqctl stop_app 或者 rabbitmqctl stop 命令来关闭 RabbitMQ 服务。再在其他节点(非被踢出的节点)上执行 rabbitmqctl forget_cluster_node 命令将指定的节点剔除出 RabbitMQ 集群。

这种方式适合被踢出节点不再运行 RabbitMQ 服务的情况。

示例:将 node2 节点从 RabbitMQ 集群中踢出。命令如下:

(1)查看集群状态

[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
Basics
Cluster name: rabbit@node1

Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3

Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3

Versions
rabbit@node1: RabbitMQ 3.9.14 on Erlang 24.3.3
rabbit@node2: RabbitMQ 3.9.14 on Erlang 24.3.3
rabbit@node3: RabbitMQ 3.9.14 on Erlang 24.3.3
...

(2)停止 node2 节点的 RabbitMQ 应用

[root@node2 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node2 ...

(3)在 node1 节点中执行 rabbitmqctl forget_cluster_node 命令,将 node2 节点从集群中踢出

[root@node1 ~]# rabbitmqctl forget_cluster_node rabbit@node2
Removing node rabbit@node2 from the cluster

(4)继续查看 RabbitMQ 集群状态

[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
Basics
Cluster name: rabbit@node1

Disk Nodes
rabbit@node1
rabbit@node3

Running Nodes
rabbit@node1
rabbit@node3

Versions
rabbit@node1: RabbitMQ 3.9.14 on Erlang 24.3.3
rabbit@node3: RabbitMQ 3.9.14 on Erlang 24.3.3
...

使用 rabbitmqctl forget_cluster_node 命令

前面章节介绍过,在关闭集群中的所有节点之后,如果最后一个被关闭的节点最终由于某些异常(例如:宕机了)而无法启动,则可以通过 rabbitmqctl forget_cluster_node 命令来将此节点从 RabbitMQ 集群中剔除。

例如:RabbitMQ 集群中所有节点按照 node3、node2、nodel 的顺序关闭,此时如果要启动 RabbitMQ 集群,必须先启动 nodel 节点。如果此时节点启动不了,可以在 node2 节点中执行命令将 nodel 节点从 RabbitMQ 集群中剔除。

(1)按照 node3、node2、nodel 的顺序,关闭 RabbitMQ 服务。

[root@node3 ~]# rabbitmqctl stop
Stopping and halting node rabbit@node3 ...

[root@node2 ~]# rabbitmqctl stop
Stopping and halting node rabbit@node2 ...

[root@node1 ~]# rabbitmqctl stop
Stopping and halting node rabbit@node1 ...

(2)在 node2 节点中执行 rabbitmqctl forget_cluster_node 命令,将 node1 节点从集群中踢出

[root@node2 ~]# rabbitmqctl forget_cluster_node rabbit@nodel --offline
Removing node rabbit@nodel from the cluster. Warning: quorum queues cannot be shrunk in offline mode
  * Impersonating node: rabbit@node2...
 done
  * Mnesia directory: /var/lib/rabbitmq/mnesia/rabbit@node2
  ...

(3)分别启动 node2 和 node3 节点

[root@node2 ~]# rabbitmq-server -detached
[root@node2 ~]# rabbitmqctl start_app
Starting node rabbit@node2 ...

[root@node3 ~]# rabbitmq-server -detached
[root@node3 ~]# rabbitmqctl start_app
Starting node rabbit@node3 
...

(4)查看集群状态

[root@node2 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
Basics
Cluster name: rabbit@node2

Disk Nodes
rabbit@node2
rabbit@node3

Running Nodes
rabbit@node2
rabbit@node3

Versions
rabbit@node2: RabbitMQ 3.9.14 on Erlang 24.3.3
rabbit@node3: RabbitMQ 3.9.14 on Erlang 24.3.3
...

注意:上面在使用命令的时候用到了 参数。如果不添加这个参数,就需要保证 node2 节点中的 RabbitMQ 服务处于运行状态,而在这种情况下,node2 无法先行启动,则“--offline ”参数的添加让其可以在非运行状态下将 node1 踢出当前 RabbitMQ 集群。

使用 rabbitmqctl reset 命令

该命令的作用是清空节点的状态并将其恢复到空白状态。如果 RabbitMQ 集群不是由于节点的启动顺序的缘故而不得不删除一个集群节点。我们可以使用 rabbitmqctl reset 命令将节点从集群中踢出。例如:

(1)查看集群状态

[root@node2 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
Basics
Cluster name: rabbit@node2
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3

Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3

Versions
rabbit@node1: RabbitMQ 3.9.14 on Erlang 24.3.3
rabbit@node2: RabbitMQ 3.9.14 on Erlang 24.3.3
rabbit@node3: RabbitMQ 3.9.14 on Erlang 24.3.3

Maintenance status
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node2, status: not under maintenance
Node: rabbit@node3, status: not under maintenance
...

(2)使用 rabbitmqctl stop_app 命令停止 RabbitMQ 应用

[root@node2 rabbitmq]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node2 ...

(3)使用 rabbitmqctl reset 命令将 node2 节点踢出集群

[root@node2 rabbitmq]# rabbitmqctl reset
Resetting node rabbit@node2 ...

(4)使用 rabbitmqctl start_app 命令启动 RabbitMQ 应用

[root@node2 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@node2 ...

(5)最后,查看集群状态

[root@node1 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
Basics
Cluster name: rabbit@node1
Disk Nodes
rabbit@node1
rabbit@node3

Running Nodes
rabbit@node1
rabbit@node3

Versions
rabbit@node1: RabbitMQ 3.9.14 on Erlang 24.3.3
rabbit@node3: RabbitMQ 3.9.14 on Erlang 24.3.3
...

从上可以得知,node2 节点已经成功从 RabbitMQ 集群中踢出。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号