0、节点信息

ip主机

主机名

角色

192.168.2.13

mq1

初始节点,磁盘存储

192.168.2.14

mq2

内存节点

192.168.2.15

mq3

内存节点

1、集群中至少存在一个磁盘节点才能真正实现持久化;
2、磁盘节点和内存节点的区别就是存储的介质不同,一个是存储在磁盘,一个是存储在内存;同时,他们的访问速度也不同,内存节点读取效率是大于磁盘节点的;
3、集群数据的存储位置:/var/lib/rabbitmq/mnesia/

1、安装rabbitmq

mq1的rabbitmq在上篇中已经安装好了,mq2和mq3两个节点单机rabbitmq的安装过程略…
参考上篇

安装单机后先不配置rabbitmq_management插件

2、配置hosts

编辑每个节点的 /etc/hosts 文件

192.168.2.13	mq1
192.168.2.14	mq2
192.168.2.15	mq3

3、配置 cookie

复制初始主节点的 erlang.cookie
(在mq1初始主节点上执行,复制给其他两个节点)

scp /var/lib/rabbitmq/.erlang.cookie root@192.168.2.14:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.2.15:/var/lib/rabbitmq/.erlang.cookie

4、加入集群

(在mq2和mq3上执行)

rabbitmqctl stop_app	# 暂停rabbitmq服务

rabbitmqctl join_cluster --ram rabbit@mq1		# 以内存节点的身份加入集群
或者
rabbitmqctl join_cluster rabbit@mq1		# 以磁盘节点的身份加入集群

rabbitmqctl start_app	# 开启rabbitmq服务

查看集群状态:

rabbitmqctl cluster_status

从状态中可以看到这个集群有几个节点,哪些是磁盘节点,哪些是内存节点,以及节点运行的状态;

5、其他

——退出集群

方法一:使用 rabbitmqctl forget_cluster_node 命令,剔除mq3。

# mq3上执行(先停止)
[root@mq3 src]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq3 ...

# mq1上执行(将mq3剔除)
[root@mq1 rabbitmq]# rabbitmqctl forget_cluster_node rabbit@mq3
Removing node rabbit@mq3 from the cluster

方法二:使用 rabbitmqctl reset 命令,mq2退出集群。

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

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

——修改集群节点类型

退出节点,再重新加入集群的时候选择是磁盘节点还是内存节点;

附录一:集群简述

每一个节点,不管是磁盘存储还是内存存储,都具备全部的队列、消息数据;即,每一个节点都是一个单独的出入口,这样可以提高整体的吞吐量;

如果集群里只有一个磁盘节点,这个节点挂了,会发生什么?此时消息路由机制仍可正常进行(可以正常投递和消费消息),但是不能做如下事:
● create queues
● create exchanges
● create bindings
● add users
● change permissions
● add or remove cluster nodes
所以,考虑到高可用性,推荐在集群里保持2个磁盘节点,这样一个挂了,另一个还可正常工作。但上述最后一点,往集群里增加或删除节点,要求2个磁盘节点同时在线

如果不做队列持久化、消息持久化,那么当队列所在的节点宕掉后,数据就会全部丢失;
即便做了队列和消息的持久化,也需要队列所在的节点恢复启动后才可以使用;