Rabbitmq选举集群搭建
文章目录
- Rabbitmq选举集群搭建
- 前言
- 基础知识介绍
-
- rabbimq选举集群介绍
- [Raft 协议介绍](#Raft 协议介绍)
- 常用命令
-
- 查看rabbitmq版本
- rabbitmq开启MQtt和管理端页面服务
- 查看集群状态
- 查看Erlang版本
- 代码修改
- 集群搭建
-
- rabbitmq配置
- 物理机上安装
- docker中安装
- [配置 keepalived](#配置 keepalived)
- [配置 HAproxy](#配置 HAproxy)
前言
在生产环境中rabbitmq常常需要搭建集群,下面我就给大家分享一下rabbitmq选举集群的搭建过程,搭建环境为两台机器,1.6和1.89,在1.89上安装了docker,这样模拟出三个机器,组成最小集群。
基础知识介绍
rabbimq选举集群介绍
RabbitMQ 选举集群是自 RabbitMQ 3.8 版本引入,基于 Raft 一致性协议实现,旨在替代传统的镜像队列,因为传统的镜像队列有缺陷,估计后面官方会把镜像队列去除掉。
Raft 协议介绍
Raft 协议是一种专为分布式系统设计的共识算法,它的核心目标是让多个服务器节点在面对网络故障、机器宕机等异常情况时,依然能就"数据状态"达成一致。相比于早期的 Paxos 算法,Raft 最大的特点是易于理解和工程实现,Raft知识共识算法中的一种还有: Paxos、Zab、Gossip等算法。
核心运作机制
在 Raft 算法中,每个节点都有以下 3 个角色之一:
- Leader(领导者):负责处理所有客户端的请求,并将这些请求作为日志,发送给所有的 Follower. Leader 会定期向所有 Follower 发送心跳消息,告诉他们 "我是领导,我还活着",防止 Follower 进入选举流程.
- Follower(跟随者):跟随者 不直接处理客户端请求,而是接受 Leader 发送的日志,并使用这些信息.
- Candidate(候选者):当 跟随者 在一段时间内没有收到 Leader 的心跳消息,就会变成 Candidate,并开始进入选举流程
常用命令
查看rabbitmq版本
shell
sudo rabbtimqctl version
输出内容如下:

rabbitmq开启MQtt和管理端页面服务
powershell
sudo rabbitmq-plugins enable rabbitmq_management
sudo rabbitmq-plugins enable rabbitmq_mqtt
查看集群状态
powershell
rabbitmqctl cluster_status
查看Erlang版本
shell
sudo erl
输出内容如下:

代码修改
默认情况下创建队列的时候rabbitmq x-queue-type值为classic,但是classic不支持Raft协议。需要在创建队列的时候把类型设置为quorum。这里需要注意如果是从classic改为quorum类型的时候如果之前业务里使用到了队列的优先级参数需要调整,classic支持10级,但是quorunm只有两级一种是普通一种是高优先级(1-4为普通;5-9高)这里说的是给 BasicProperties中Priority赋的值
classic和quorum队列对比
| 特性维度 | Classic Queue (经典队列) | Quorum Queue (仲裁队列) |
|---|---|---|
| 核心设计 | 单机、非复制 FIFO 实现,追求高性能和低延迟。 | 分布式、强一致,基于 Raft 共识算法,数据安全是最高优先级。 |
| 数据安全 | 低,节点宕机会导致数据丢失(除非使用了已被移除的镜像队列)。 | 高,数据同步到集群多数节点后才确认,属于"持久化+复制"队列。 |
| 消息优先级 | 完全支持 (0-255级);需通过参数声明优先级数量,完全按优先级消费。 | 有限支持 (仅2级);从 4.0 开始支持,仅有高、普通两级,按 2:1 的比例混合投递。 |
| 适用场景 | 非关键数据、临时队列;例如:RPC 请求响应、非核心日志、可容忍偶尔丢失的后台任务。 | 关键数据、核心业务;例如:交易订单、支付消息、任何不能丢失的消息。 |
| 性能与资源 | 性能高、资源占用低;无复制开销,可以暂存于内存。 | 性能略低、资源消耗高;需写入磁盘+网络同步,至少需要 3 个节点建议。 |
集群搭建
目前企业级rabbitmq集群搭建方案主要采用:仲裁队列(Quorum Queues)+HAProxy+Keepalived
测试环境介绍:目前我们有两台机器:1.6和1.89
为了达成最小集群(3台机器)我们在1.89上安装一个docker模拟一台机器
注意 如果之前是单节点重新配置为集群之后会丢失掉之前rabbitmq创建的用户信息需要重新创建。
rabbitmq配置
物理机上安装
powershell
#!/bin/sh
sudo apt-get install curl gnupg apt-transport-https -y
## Team RabbitMQ's main signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
## Community mirror of Cloudsmith: modern Erlang repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
## Community mirror of Cloudsmith: RabbitMQ repository
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null
## Add apt repositories maintained by Team RabbitMQ
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu noble main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu noble main
# another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu noble main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu noble main
## Provides RabbitMQ
##
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu noble main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu noble main
# another mirror for redundancy
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu noble main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu noble main
EOF
## RabbitMQ Start
sudo apt-get install apt-transport-https
sudo apt-get install curl gnupg apt-transport-https -y
## Team RabbitMQ's signing key
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Modern Erlang/OTP releases
##
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb1.rabbitmq.com/rabbitmq-erlang/ubuntu/noble noble main
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb2.rabbitmq.com/rabbitmq-erlang/ubuntu/noble noble main
## Provides modern RabbitMQ releases
##
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb1.rabbitmq.com/rabbitmq-server/ubuntu/noble noble main
deb [arch=amd64 signed-by=/usr/share/keyrings/com.rabbitmq.team.gpg] https://deb2.rabbitmq.com/rabbitmq-server/ubuntu/noble noble main
EOF
## Update package indices
sudo apt-get update -y
## Install Erlang packages
sudo apt-get install -y erlang-base \
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
erlang-runtime-tools erlang-snmp erlang-ssl \
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server=4.1.3-1 -y --fix-missing
## RabbitMQ End
修改host
powershell
echo "192.168.1.6 rabbit-node-1" >> /etc/hosts
echo "192.168.1.89 rabbit-node-2" >> /etc/hosts
加入集群
powershell
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit-node-1
rabbitmqctl start_app
docker中安装
- 修改镜像源
powershell
sudo vi /etc/docker/daemon.json
把以下内容复制到这个配置文件里
powershell
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://dockerproxy.com"
]
}
然后执行以下命令应用配置然后重启docker服务
powershell
sudo systemctl daemon-reload
sudo systemctl restart docker
- 拉取rabbitmq集群镜像
powershell
docker pull rabbitmq:4.1.3-management
输出以下内容说明拉取成功

- 创建容器
注意这里的'ASXZNAVZTXMWHMQZRGTO'是你是设置的erlang.cookie里的字符串
powershell
docker run -d \
--name rabbitmq-node3 \
--hostname rabbit-docker-3 \
--network bridge \
-p 5673:5672 -p 15673:15672 -p 4370:4369 -p 25673:25672 -p 1888:1883\
--add-host rabbit-node-1:192.168.1.6 \
--add-host rabbit-node-2:192.168.1.89 \
-e RABBITMQ_ERLANG_COOKIE='ASXZNAVZTXMWHMQZRGTO' \
-v /var/lib/rabbitmq-docker:/var/lib/rabbitmq \
rabbitmq:4.1.3-management
- docker加入以rabbit-node-1为leader的集群
powershell
docker exec -it rabbitmq-node3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit-node-1
rabbitmqctl start_app
exit
- 开启页面服务和mqtt服务
进入容器
powershell
docker exec -it rabbitmq-node3 bash
开启服务
powershell
rabbitmq-plugins enable rabbitmq_mqtt
rabbitmq-plugins enable rabbitmq_management
配置erlang.cookie
注意这一步需要安装了rabbitmq之后再操作
物理机上执行
powershell
vi /var/lib/rabbitmq/.erlang.cookie
docker上执行
powershell
docker exec -it <容器名> vi /var/lib/rabbitmq/.erlang.cookie
把所有机器上的值都设置为相同的一串字符串。
配置 keepalived
作用说明
Keepalived 的核心作用是解决 HAProxy 自身的单点故障问题,为负载均衡层提供高可用保障。
- 提供虚拟 IP(VIP):Keepalived 会在多台 HAProxy 节点之间维护一个漂移的虚拟 IP。客户端只需连接这个 VIP,而非具体某个 HAProxy 的物理 IP
- 主备自动切换:正常情况下,VIP 只在主 HAProxy 节点上生效。如果主节点宕机或服务异常,Keepalived 会自动将 VIP 漂移到备节点,整个过程对客户端无感知。
- 健康检查联动:Keepalived 会持续检测 HAProxy 进程的状态(比如通过检查端口、进程或自定义脚本)。一旦发现 HAProxy 服务失效,会主动触发 VIP 切换,避免客户端被路由到已失效的负载均衡器。
通常会是这样的 2 + N 模式:
-
两台服务器部署 HAProxy + Keepalived 组合,形成主备关系,对外暴露一个虚拟 IP。
-
三台或更多服务器部署 RabbitMQ 仲裁队列集群。
安装
我们目前的情景时有两台机器(1.6、1.89)加上一个(1.89)上的docker组成集群;这里我选择1.6作为主服务器;1.89就做备用服务器。
在1.6和1.89上执行以下语句进行安装
powershell
sudo apt install keepalived
验证是否安装成功
powershell
keepalived -version
输出如下图:

创建健康检查脚本
这里主节点(1.6)备用节点(1.89)上都需要创建
它主要是负责检查HAproxy是否正常,如果不正常的话就Keepalived就需要做漂移,把请求转到另一个正常的HAproxy上去。
powershell
vi /etc/keepalived/check_haproxy.sh
把以下内容写入文件
powershell
#!/bin/bash
if pgrep haproxy > /dev/null; then
exit 0
fi
# 尝试重启
systemctl start haproxy
sleep 2
if pgrep haproxy > /dev/null; then
exit 0
else
# 重启失败,停止 keepalived 释放 VIP
systemctl stop keepalived
exit 1
fi
授予执行权限
powershell
chmod +x /etc/keepalived/check_haproxy.sh
配置Master(192.168.1.6)的Keepalived
执行以下命令
powershell
vim /etc/keepalived/keepalived.conf
把以下内容复制到文件内
注意以下配置文件中'eno1'为网卡名称,需要改为自己机器上的网卡名称
查看网卡名称命令
powershell
ip link show
powershell
global_defs {
router_id RABBIT1
script_user root
enable_script_security
}
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight 2
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eno1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_haproxy
}
}
配置Backup (192.168.1.89)的Keepalived
执行以下命令
powershell
vim /etc/keepalived/keepalived.conf
注意以下配置文件中'ens160'为网卡名称,需要改为自己机器上的网卡名称
查看网卡名称命令
powershell
ip link show
配置文件内容
powershell
global_defs {
router_id RABBIT2
script_user root
enable_script_security
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass maiyuan!2#
}
virtual_ipaddress {
192.168.1.100/24 dev ens160
}
track_script {
chk_haproxy
}
}
启动服务
这里两台机器上都要执行
powershell
systemctl enable keepalived
systemctl restart keepalived
systemctl status keepalived
当服务启动成功之后外部应用要访问rabbitmq就可以通过192.186.1.100+5670 进行访问了
验证服务是否正常
验证 VIP 是否已绑定
注意以下命令中'eno1'为网卡名称,需要改为自己机器上的网卡名称
powershell
ip addr show eno1 | grep 192.168.1.100

当配置完成之后就可以通过我们指定的ip去访问mq服务了

配置 HAproxy
安装
执行以下命令进行安装
powershell
sudo apt install -y haproxy
配置
这里因为我配置了pgsql的集群所有配置文件有pgsql集群的数据,如果不需要可以把多余的删除掉,只保留rabbitmq的相关配置
powershell
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode tcp # 使用 TCP 模式,这是 PostgreSQL 协议所必需的
option tcplog
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
# 确保长连接不会因空闲而被断开
timeout client 1h
timeout server 1h
#errorfile 400 /etc/haproxy/errors/400.http
#errorfile 403 /etc/haproxy/errors/403.http
#errorfile 408 /etc/haproxy/errors/408.http
#errorfile 500 /etc/haproxy/errors/500.http
#errorfile 502 /etc/haproxy/errors/502.http
#errorfile 503 /etc/haproxy/errors/503.http
#errorfile 504 /etc/haproxy/errors/504.http
# 用于管理界面的后端配置
frontend stats
mode http
bind *:7000
stats enable
stats uri /stats
stats refresh 10s
stats admin if LOCALHOST
# ---------------------------------------------------------------------
# 1.pgsql 读写端口:只路由到主库
# ---------------------------------------------------------------------
frontend postgres_master_frontend
bind *:5431
default_backend postgres_master_backend
backend postgres_master_backend
option httpchk GET /primary HTTP/1.1
http-check send hdr Host 192.168.1.6
#default-server check-ssl verify none
# 注意:master 节点必须通过 Patroni REST API 的 8008 端口进行健康检查
server pg-node1 192.168.1.6:5433 check port 8008 inter 3s fall 3 rise 2
# ---------------------------------------------------------------------
# 2.pgsql 只读端口:路由到所有健康副本 (Replicas)
# ---------------------------------------------------------------------
frontend postgres_replica_frontend
bind *:5430
default_backend postgres_replica_backend
backend postgres_replica_backend
option httpchk GET /replica HTTP/1.1
http-check send hdr Host 192.168.1.89
#default-server check-ssl verify none
server pg-node2 192.168.1.89:5433 check port 8008 inter 3s fall 3 rise 2
# ---------------------------------------------------------------------
# RabbitMQ 负载均衡核心配置
# ---------------------------------------------------------------------
# RabbitMQ AMQP 代理配置
listen rabbitmq_cluster
bind *:5670
mode tcp
balance roundrobin
# 后端集群节点配置,将IP替换为你的实际IP和端口
server rabbit-node-1 192.168.1.6:5672 check inter 5000 rise 2 fall 3
server rabbit-node-2 192.168.1.89:5672 check inter 5000 rise 2 fall 3
server rabbit-docker-3 192.168.1.89:5673 check inter 5000 rise 2 fall 3
# RabbitMQ MQTT 代理配置
listen rabbitmq_mqtt
bind *:1880 # 1. 监听 MQTT 默认端口
mode tcp # 2. 使用四层代理模式
balance roundrobin # 3. 采用轮询负载均衡算法
# 4. 后端服务器列表,配置你的RabbitMQ节点
server rabbit-node-1 192.168.1.6:1883 check inter 5000 rise 2 fall 3
server rabbit-node-2 192.168.1.89:1883 check inter 5000 rise 2 fall 3
server rabbit-docker-3 192.168.1.89:1888 check inter 5000 rise 2 fall 3
修改配置之后执行以下命令应用最新配置
powershell
sudo systemctl reload haproxy
验证是否配置成功
访问:http://192.168.1.100:7000/stats
