RabbitMQ 3 节点仲裁队列集群部署文档
📘 RabbitMQ 3 节点仲裁队列集群部署文档
—— 适用于 CentOS 7/8 · 2026 年 3 月 · 纯仲裁队列 · 无镜像策略
一、文档概述
本文档描述了 RabbitMQ 3 节点集群 的标准安装流程,基于 仲裁队列(Quorum Queue) 实现高可用与强一致消息处理。
整个部署不使用任何镜像策略(ha-*),完全遵循 RabbitMQ 官方最新推荐方案。
二、环境准备
2.1 服务器配置
| 节点 | 主机名 | 角色 | 系统 | 核心要求 |
|---|---|---|---|---|
| 节点1 | master | 主节点 | CentOS 7/8 | 关闭防火墙、SELINUX |
| 节点2 | node2 | 从节点 | CentOS 7/8 | 与 master 同版本环境 |
| 节点3 | node3 | 从节点 | CentOS 7/8 | 与 master 同版本环境 |
2.2 网络与主机名解析
所有节点执行:
2.2.1 配置主机名
hostnamectl set-hostname master
# 节点2
hostnamectl set-hostname node2
# 节点3
hostnamectl set-hostname node3
2.2.2 配置 /etc/hosts
cat >> /etc/hosts << EOF
192.168.1.10 master
192.168.1.11 node2
192.168.1.12 node3
EOF
2.2.3 关闭防火墙与 SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
三、所有节点统一安装环境
3.1 安装 Erlang
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | bash
yum install -y erlang
3.2 安装 RabbitMQ
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | bash
yum install -y rabbitmq-server
3.3 启动服务
systemctl enable rabbitmq-server
systemctl start rabbitmq-server
四、构建集群(核心步骤)
4.1 所有节点停止服务
systemctl stop rabbitmq-server
4.2 主节点生成 Erlang Cookie
openssl rand -base64 32 > /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie
4.3 同步 Cookie 到 node2、node3
在 master 执行:
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/
节点2、node3 执行:
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie
4.4 所有节点启动服务
systemctl start rabbitmq-server
4.5 加入集群(仅在 node2、node3 执行)
node2:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@master
rabbitmqctl start_app
node3:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@master
rabbitmqctl start_app
4.6 查看集群状态
rabbitmqctl cluster_status
正常输出应包含 3 个节点:
- rabbit@master
- rabbit@node2
- rabbit@node3
✅ 集群组建成功。
五、管理后台初始化
5.1 开启管理插件
rabbitmq-plugins enable rabbitmq_management
5.2 创建管理员账号
rabbitmqctl add_user admin YourPass123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
5.3 清除所有策略(必须为空)
rabbitmqctl list_policies
输出必须为空。
如有策略,删除:
rabbitmqctl clear_policy 策略名
六、创建仲裁队列
6.1 安装 rabbitmqadmin(可选)
wget http://localhost:15672/cli/rabbitmqadmin -O /usr/local/bin/rabbitmqadmin
chmod +x /usr/local/bin/rabbitmqadmin
ln -s /usr/local/bin/rabbitmqadmin /usr/bin/rabbitmqadmin
6.2 命令行创建仲裁队列
rabbitmqadmin --username=admin --password=YourPass123 declare queue name=quorum.order durable=true arguments='{"x-queue-type":"quorum"}'
6.3 UI 创建(推荐)
- 登录后台 → Queues → Add a queue
- Name:quorum.order
- Durability:Durable
- Type:选择 quorum
- Add queue
6.4 验证类型
rabbitmqadmin --username=admin --password=YourPass123 list queues name type
输出 type = quorum ✅
七、Spring Boot 集成仲裁队列(示例代码)
7.1 队列声明
@Configuration
public class RabbitConfig {
@Bean
public Queue quorumOrderQueue() {
return QueueBuilder.durable("quorum.order")
.withArgument("x-queue-type", "quorum")
.build();
}
}
7.2 生产者(开启发布确认)
@Configuration
public class ProducerConfig {
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory factory) {
RabbitTemplate template = new RabbitTemplate(factory);
template.setConfirmCallback((correlationData, ack, cause) -> {
if (!ack) {
System.err.println("消息丢失:" + cause);
}
});
return template;
}
}
7.3 消费者(手动 ACK)
@Component
public class Consumer {
@RabbitListener(queues = "quorum.order")
public void receive(String msg, Channel channel, Message message) throws IOException {
System.out.println("收到:" + msg);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
}
八、运维与注意事项
8.1 仲裁队列不支持以下特性
- TTL
- 延迟队列
- 优先级队列
- 全局 QoS
- 独占队列
8.2 推荐磁盘
必须使用 SSD,仲裁队列 WAL 写密集,HDD 性能严重不足。
8.3 集群节点数
推荐 3 节点或 5 节点(奇数)。
8.4 监控指标
关注:
- 队列深度
- 仲裁队列同步状态
- 磁盘延迟
- 节点网络延迟
九、附录:常见报错排查
9.1 rabbitmqadmin 访问拒绝
rabbitmqadmin --username=admin --password=你的密码 命令
9.2 节点无法加入集群
- 检查 .erlang.cookie 是否一致
- 检查 /etc/hosts
- 检查 4369、5672、15672、25672 端口是否开放
9.3 仲裁队列不识别 x-queue-type
说明 RabbitMQ 版本太低,升级到 3.8+。
🎯 最终总结
- 3 节点集群 + 统一 Cookie
- 不配置任何镜像策略
- 队列创建时指定 x-queue-type=quorum
- Spring Boot 代码只需增加一个 argument
- 策略列表必须为空
浙公网安备 33010602011771号