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
openssl rand -base64 32 > /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie

在 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 ".*" ".*" ".*"

访问:
http://节点IP:15672

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 创建(推荐)

  1. 登录后台 → Queues → Add a queue
  2. Name:quorum.order
  3. Durability:Durable
  4. Type:选择 quorum
  5. 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+。


🎯 最终总结

  1. 3 节点集群 + 统一 Cookie
  2. 不配置任何镜像策略
  3. 队列创建时指定 x-queue-type=quorum
  4. Spring Boot 代码只需增加一个 argument
  5. 策略列表必须为空

posted @ 2026-03-30 11:35  wuyingchun1987  阅读(1)  评论(0)    收藏  举报