在使用 rabbitmqctl cluster_status 命令来查看集群状态时会有如下信息:
[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 ...
其中,“Disk Nodes” 表示节点类型。RabbitMQ 中的每一个节点,不管是单机版 RabbitMQ 服务或者是集群版 RabbitMQ 服务中的节点,要么是内存节点,要么是磁盘节点。
内存节点:内存节点将所有的队列、 交换器、绑定关系、用户、权限和 vhost 的元数据定义都存储在内存中。
磁盘节点:磁盘节点则将这些信息存储到磁盘中。
单机版的 RabbitMQ 服务,节点类型必须是磁盘类型的节点,否则当重启 RabbitMQ 之后,所有关于系统的配置信息都会丢失。不过在集群版 RabbitMQ 服务中,可以选择部分节点配置为内存节点,这样可以获得更高的性能。
将 node2 节点加入 node1 节点的时候可以指定 node2 节点的类型为内存节点,命令如下:
(1)停止 RabbitMQ 应用
[root@node2 rabbitmq]# rabbitmqctl stop_app Stopping rabbit application on node rabbit@node2 ...
(2)将当前节点 node2 使用内存节点类型添加到 rabbit@node1 集群中
[root@node2 rabbitmq]# rabbitmqctl join_cluster rabbit@node1 --ram Clustering node rabbit@node2 with rabbit@node1
(3)启动 RabbitMQ 应用
[root@node2 rabbitmq]# rabbitmqctl start_app Starting node rabbit@node2 ...
(4)查看当前集群的状态
[root@node2 rabbitmq]# rabbitmqctl cluster_status Cluster status of node rabbit@node2 ... Basics Cluster name: rabbit@node2 Disk Nodes rabbit@node1 rabbit@node3 RAM Nodes rabbit@node2 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 ...
上面输出日志中,可得知 rabbit@node1 和 rabbit@node3 均为磁盘节点(Disk Nodes),rabbit@node2 为内存节点(RAM Nodes)。
如果集群已经搭建好了,那么也可以使用命令来切换节点的类型,其中:
disc:表示磁盘节点
ram:表示内存节点
示例:将上面 node2 节点由内存节点转变为磁盘节点,命令如下:
(1)停止 RabbitMQ 应用
[root@node2 rabbitmq]# rabbitmqctl stop_app Stopping rabbit application on node rabbit@node2 ...
(2)将当前节点类型修改为磁盘节点类型,命令如下:
[root@node2 rabbitmq]# rabbitmqctl change_cluster_node_type disc Turning rabbit@node2 into a disc node
(3)启动 RabbitMQ 应用
[root@node2 rabbitmq]# rabbitmqctl start_app Starting node rabbit@node2 ...
(4)查看当前集群的状态
[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 ...
注意,在 RabbitMQ 集群中执行创建队列(Queue)、交换器(Exchange)或者绑定关系(Bindings)的操作,将持续到 RabbitMQ 集群中所有节点都成功提交元数据变更后才会返回。对内存节点来说,则将数据写入内存。对于磁盘节点来说,则将数据写入磁盘。内存节点可以提供很高的性能,磁盘节点能够保证集群配置信息的高可靠性。
RabbitMQ 要求在集群中至少有一个节点为磁盘节点类型 ,所有其他节点可以全部是内存节点 。当节点加 入或者离开 RabbitMQ 集群时,必须将变更通知到至少一个磁盘节点类型的节点。
如果只有一个磁盘节点,而且该节点刚好崩溃了,那么集群可以继续发送或者接收消息。但是,它不能执行创建队列、交换器、绑定关系、创建用户、更改权限、添加或删除集群节点的操作,直到将该磁盘节点类型的节点恢复到 RabbitMQ 集群中。所以在建立集群的时候应该保证有两个或者两个以上的磁盘节点类型的节点存在。
在内存节点类型的节点重启后,它们会连接到预先配置的磁盘节点类型的节点,下载当前集群元数据的副本。当在集群中添加内存节点类型的节点时,确保通知 RabbitMQ 集群中所有的磁盘节点类型的节点。
注意:只要内存节点类型的节点可以找到至少一个磁盘节点类型的节点,那么它就能够在重启后重新加入 RabbitMQ 集群中。