前面章节介绍了怎样搭建 RabbitMQ 集群,搭建集群的过程可以看作是向集群添加节点的过程。
下面将介绍怎样将节点从 RabbitMQ 集群中踢出?将节点从集群中踢出,可以减少集群的规模以节省硬件资源,也可以替换一个/多个硬件配置更好、性能更好的节点。
这里还是以前面章节搭建的 RabbitMQ 集群,该集群中有 node1、node2 和 node3 三个节点。
首先在需要踢出的节点上执行 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 命令来将此节点从 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 集群。
该命令的作用是清空节点的状态并将其恢复到空白状态。如果 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 集群中踢出。