一、背景
在上一章节中,咱们学会了如何搭建一个单节点的 RabbitMQ 服务器,然而单节点的 RabbitMQ 不牢靠,如果单节点挂掉,则会导致音讯队列不可用。此处咱们搭建一个 3 个节点的 RabbitMQ 集群,用于解决这个问题。
二、介绍 RabbitMQ 的集群
1、集群类型
默认状况下的 RabbitMQ 集群只是元数据(metadata)是同步的,队列中的音讯是不同步的,这样也是不平安的,须要配置成镜像队列,让数据也冗余到别的节点中,这样能力保障一个节点挂掉,还能够对外提供服务。
元数据
:指的是队列信息、交换机信息、绑定信息等。
2、节点名的重要性
在集群中,节点名必须要惟一,集群中是通过节点名来进行分割的。
3、erlang cookie 的重要性
集群节点中是通过什么来认证的,从而让集群节点能够相互通信,靠的就是 erlang cookie
,因而集群中的 erlang cookie 的值必须要统一。
1、erlang cookie 文件的地位
不同的操作系统这个文件的地位是不一样的。
这个地位个别是在 /var/lib/rabbitmq/.erlang.cookie
这个地位。
2、erlang cookie 文件的权限
.erlang.cookie
的文件权限个别给 600
就能够了,不要给太高或太低,否则集群可能无奈启动。
4、集群节点类型
RabbitMQ 集群分为 磁盘节点
和内存节点
。
1、 磁盘节点 所有的数据都是存在磁盘上
2、 内存节点 的数据是存在内存中,但不是所有的数据都是存在内存中的 ,比方:音讯只会存在索引等。
3、在一个集群中 至多须要一个磁盘 (disc) 节点
5、集群中退出节点
新退出的集群的节点必须是一个全新的节点,不能够带有数据,如果存在则须要在退出集群的节点上执行rabbitmqctl reset
。
三、搭建一个 RabbitMQ 集群
此处以 3 个 Centos7 服务器来搭建一个 RabbitMQ 集群。
主机名 | ip 地址 | 节点类型 | 用户名 | 明码 | management port | amqp port |
---|---|---|---|---|---|---|
centos01 | 192.168.56.101 | 磁盘节点(disc) | admin | admin | 15672 | 5672 |
centos02 | 192.168.56.102 | 磁盘节点(disc) | admin | admin | 15672 | 5672 |
centos03 | 192.168.56.103 | 内存节点(ram) | admin | admin | 15672 | 5672 |
1、配置 3 个服务器都能够拜访各自的主机名
在 3 台服务器上都须要这样操作vim /etc/hosts
bash192.168.56.101 centos01
192.168.56.102 centos02
192.168.56.103 centos03
2、同步各个节点的 erlang cookie
如果 cookie 文件不存在,则能够启动一个 RabbitMQ 节点,而后在复制过来,在复制的过程中,须要保障 RabbitMQ 节点最好都不要启动。
在 centos01 服务器上操作
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.56.102:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.56.103:/var/lib/rabbitmq/.erlang.cookie
3、创立集群
1、centos01 服务器上操作
rabbitmq-server -detached
能够查看 /var/log/rabbitmq/rabbit\@centos01.log
这个日志文件看是否启动胜利。
2、放行集群通信端口等
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=4369/tcp --permanent
firewall-cmd --zone=public --add-port=25672/tcp --permanent
3、centos02 退出 centos01
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@centos01
rabbitmqctl start_app
4、centos03 退出 centos02
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@centos02 --ram
rabbitmqctl start_app
5、查看集群是否构建实现
6、将 centos03 集群移除
1、将须要被移除的节点进行
rabbitmqctl stop
2、在另外启动的节点上执行
rabbitmqctl forget_cluster_node rabbit@centos03
3、重新加入集群中
在启动的时候可能报如下谬误 "Node rabbit@centos03 thinks it's clustered with node rabbit@centos02, but rabbit@centos02 disagrees"
这个时候咱们须要删除 rm -rvf /var/lib/rabbitmq/mnesia/
这个目录,而后在次执行退出集群的命令即可。
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@centos02 --ram
rabbitmqctl start_app
四、配置镜像集群
1、一般集群
通过上方步骤形成的集群是一个一般的集群,只是队列中的元数据共享,而队列中的数据是具体保留到某个节点上的。
这样够不成高可用,如果这个节点挂掉的话,则这个队列的数据还是不能够生产的,也无奈往这个队列中发送数据。那么如果解决这个问题呢,答案是应用镜像队列集群。
2、镜像队列集群
在默认的虚拟主机 (/
) 所有的队列都配置成镜像队列。(ha-all
只是取的名字)
rabbitmqctl set_policy --vhost / ha-all "^" '{"ha-mode":"all"}'
创立完镜像队列后发现,队列在所有的节点上都存在。
镜像队列的高级用法,参考官网文档 https://www.rabbitmq.com/ha.html
五、参考文档
1、RabbitMQ 官网集群搭建
2、镜像队列的用法