乐趣区

关于java:Centos7部署RabbitMQ的镜像队列集群

一、背景

在上一章节中,咱们学会了如何搭建一个单节点的 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、镜像队列的用法

退出移动版