上一篇主要总结了 在CentOS7上 如何安装 RabbitMQ v3.5.6
这一篇总结一下:RabbitMQ 2种集群模式的搭建
一:准备工作
- 准备3台虚拟机,均安装rabbitmq-server,分别对应node1,node2,node3
(参照上一篇:在CentOS7上 如何安装 RabbitMQ v3.5.6) - 分别 配置静态 IP为:
10.200.37.201
10.200.37.202
10.200.37.203 - 修改hosts文件,添加如下内容:
-
【!重要】修改3台虚拟机对应的hostnamermq-n1 10.200.37.201 rmq-n2 10.200.37.202 rmq-n3 10.200.37.203
分别 修改为:rmq-n1、rmq-n2、rmq-n3vi /etc/hostname
(第2、3、4步可参照:CentOS7 基础设置(eg:静态IP,hosts文件,防火墙,主机名......))
二:普通集群 搭建
-
说明:
rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群镜像。
(.erlang.cookie是erlang分布式的token文件,集群内所有的设备要持有相同的.erlang.cookie文件才允许彼此通信)。 -
查找.erlang.cookie文件
find / -name *.cookie
-
将查找到的.erlang.cookie文件,分别复制到另外两台虚拟机中。(过程中要输入另外两台虚拟机的密码)
scp /var/lib/rabbitmq/.erlang.cookie 10.200.37.202:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie 10.200.37.203:/var/lib/rabbitmq/
-
复制完成后,需要修改文件权限为400
chmod 400 /var/lib/rabbitmq/.erlang.cookie
-
erlang.cookie复制完成后,逐个重启节点服务:
-
systemctl restart rabbitmq-server.service systemctl status rabbitmq-server.service
将rabbit@rmq-n1作为集群主节点,在节点rabbit@rmq-n2和节点rabbit@rmq-n3上面分别执行如下命令,以加入集群中
(--ram 指定内存节点类型,--disc指定磁盘节点类型) -
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rmq-n1 rabbitmqctl start_app
3节点都可查看集群状态
rabbitmqctl cluster_status
-
访问web管理界面:
-
至此,rabbitmq普通集群搭建完成。
说明:
鉴于很多人,在完成“复制.erlang.cookie文件”这一步后,将rmq-n2和rmq-n3节点加入到rmq-n1时,报如下错误:
Error:unable to connect to nodes ['rabbit@rmq-n1']:nodedown
Segmentation fault
为此,我专门模拟了一遍,最后发现是由于节点间用于elang分布式节点通信的指定端口未打开,而造成节点间无法通信!
查看:
【原创】集群搭建报“Error unable to connect to nodes ['rabbit@rmq-n1']:nodedown Segmentation fault” 错的解决
-
从集群中移除节点:
-
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app
修改节点类型:
-
rabbitmqctl stop_app rabbitmqctl change_cluster_node_type disc rabbitmqctl start_app
停止所有节点 RabbitMQ 服务,然后使用 detached 参数独立运行,这步很关键,尤其增加节点停止节点后再次启动遇到无法启动都可以参照这个顺序
rabbitmqctl stop rabbitmq-server -detached rabbitmqctl cluster_status
三、镜像集群 搭建
- 说明:
上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。
使用Rabbit镜像功能,需要基于rabbitmq策略来实现,策略是用来控制和修改群集范围的某个Vhost队列行为和Exchange行为 - 在cluster中任意节点启用策略,策略会自动同步到集群节点:
rabbitmqctl set_policy -p my-vhosts my-policy"^" '{"ha-mode":"all"}'
命令说明:
在vhost名称为“my-vhosts” 上创建了一个策略,策略名称为my-policy,
策略正则表达式为 “^” 表示所有匹配所有队列名称,
策略模式为 all 即复制到所有节点,包含新增节点。 -
客户端连接任一节点,创建名称为“test-queue”的队列,访问任一管理界面,可以看到队列已经复制到其它2节点
-
至此,rabbitmq镜像集群 搭建完成。