Rabbitmq 集群分为二种
- 普通模式:创建好 RabbitMQ 集群之后的默认模式。
- 镜像模式:把需要的队列做成镜像队列。
普通集群模式
queue 创建之后,如果没有其它 policy,消息实体只存在于其中一个节点,A、B 两个 Rabbitmq 节点仅有相同的元数据,即队列结构,但队列的数据仅保存有一份,即创建该队列的 rabbitmq 节点(A 节点),当消息进入 A 节点的 Queue 中后,consumer 从 B 节点拉取时,RabbitMQ 会临时在 A、B 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer,所以 consumer可以连接每一个节点,从中取消息,该模式存在一个问题就是当 A 节点故障后,B 节点无法取到 A 节点中还未消费的消息实体。
镜像集群模式
把需要的队列做成镜像队列,存在于多个节点,属于 RabbitMQ 的 HA 方案(镜像模式是在普通模式的基础上,增加一些镜像策略)该模式解决了普通模式中的数据丢失问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取,该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置 policy,然后客户端创建队列的时候,rabbitmq 集群根据“队列名称”自动设置是普通集群模式或镜像队列。
集群中有两种节点类型
- 内存节点:只将数据保存到内存
- 磁盘节点:保存数据到内存和磁盘。
内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存数据就足够了如果集群中只有内存节点,那么不能全部停止它们,否则所有数据消息在服务器全部停机之后都会丢失。
推荐设计架构
在一个 rabbitmq 集群里,有 3 台或以上机器,其中 1 台使用磁盘模式,其它节点使用内存模式,内存节点无访问速度更快,由于磁盘 IO 相对较慢,因此可作为数据备份使用。
1、Ubuntu 2004 安装RabbitMQ
集群环境
# 三台服务器
192.168.1.81
192.168.1.82
192.168.1.83
主机名解析配置
# vim /etc/hosts
192.168.1.81 mq01
192.168.1.82 mq02
192.168.1.83 mq03
安装步骤与单台部署一致
2、创建 RabbitMQ 集群
Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起 erlang 的集群环境,而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限,所以必须保证各节点 cookie 保持一致,否则节点之间就无法通信。
各服务器关闭 RabbitMQ
root@mq01:~# systemctl stop rabbitmq-server
root@mq02:~# systemctl stop rabbitmq-server
root@mq03:~# systemctl stop rabbitmq-server
# 在 mq-server1 同步.erlang.cookie 至其他两台
root@mq01:~# scp /var/lib/rabbitmq/.erlang.cookie 192.168.1.82:/var/lib/rabbitmq/.erlang.cookie
root@mq01:~# scp /var/lib/rabbitmq/.erlang.cookie 192.168.1.83:/var/lib/rabbitmq/.erlang.cookie
各服务器启动 RabbitMQ
root@mq01:~# systemctl start rabbitmq-server
root@mq02:~# systemctl start rabbitmq-server
root@mq03:~# systemctl start rabbitmq-server
查看当前集群状态
root@mq01:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
Basics
Cluster name: rabbit@mq01
Disk Nodes
rabbit@mq01
Running Nodes
rabbit@mq01
Versions
rabbit@mq01: RabbitMQ 3.11.5 on Erlang 25.2
root@mq02:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
Basics
Cluster name: rabbit@mq02
Disk Nodes
rabbit@mq02
Running Nodes
rabbit@mq02
Versions
rabbit@mq02: RabbitMQ 3.11.5 on Erlang 25.2
root@mq03:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq03 ...
Basics
Cluster name: rabbit@mq03
Disk Nodes
rabbit@mq03
Running Nodes
rabbit@mq03
Versions
rabbit@mq03: RabbitMQ 3.11.5 on Erlang 25.2
创建 RabbitMQ 集群
在 mq01 作为内存节点添加到 mq03,并作为内存节点
root@mq01:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq01 ...
root@mq01:~# rabbitmqctl reset
Resetting node rabbit@mq01 ...
root@mq01:~# rabbitmqctl join_cluster rabbit@mq03 --ram
Clustering node rabbit@mq01 with rabbit@mq03
root@mq01:~# rabbitmqctl start_app
Starting node rabbit@mq01 ...
在 mq02 作为内存节点添加到 mq03,并作为内存节点
root@mq02:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq02 ...
root@mq02:~# rabbitmqctl reset
Resetting node rabbit@mq02 ...
root@mq02:~# rabbitmqctl join_cluster rabbit@mq03 --ram
Clustering node rabbit@mq02 with rabbit@mq03
root@mq02:~# rabbitmqctl start_app
Starting node rabbit@mq02 ...
将集群设置为镜像模式
只要在其中一台节点执行以下命令即可:
root@mq01:~# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
验证当前集群状态
root@mq01:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
Basics
Cluster name: rabbit@mq01
Disk Nodes
rabbit@mq03
RAM Nodes
rabbit@mq01
rabbit@mq02
Running Nodes
rabbit@mq01
rabbit@mq02
rabbit@mq03
Versions
rabbit@mq01: RabbitMQ 3.11.5 on Erlang 25.2
rabbit@mq02: RabbitMQ 3.11.5 on Erlang 25.2
rabbit@mq03: RabbitMQ 3.11.5 on Erlang 25.2
3、web 界面验证集群状态
各节点启动 web 插件
root@mq01:~# rabbitmq-plugins enable rabbitmq_management
root@mq02:~# rabbitmq-plugins enable rabbitmq_management
root@mq03:~# rabbitmq-plugins enable rabbitmq_management
root@mq01:~# vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.11.5/plugins/rabbit-3.11.5/ebin/rabbit.app
40 {loopback_users, []}, #删除被禁止登陆的 guest 账户
root@mq01:~# systemctl restart rabbitmq-server
![图片[1]-RabbitMQ 集群部署-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2022/12/image-272.png)