[TOC] #### 1. 前言 --- 前面几讲我们聊了普通集群、镜像队列、Quorum Queue 这一讲我们把它们串起来,看看 RabbitMQ 的部署是怎么一步步演进的,每一步都是为了解决上一步的问题 ```plaintext 第1步:单机部署 ↓ 机器挂了怎么办? 第2步:普通集群 ↓ 队列数据只在一个节点上 第3步:镜像队列 ↓ 消息可能丢,有脑裂风险 第4步:Quorum Queue ↓ 最终方案 ``` #### 2. 第一步:单机部署 --- 一台机器,一个 RabbitMQ 实例,适合开发、测试环境,问题是:机器挂了,消息系统全停 ```bash docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management ``` #### 3. 第二步:普通集群 --- 部署三台 RabbitMQ,组成一个集群 每台机器的 RabbitMQ 使用相同的 Erlang Cookie 才能加入同一个集群 ```yaml # 三台机器的 docker-compose.yml version: '3' services: rabbitmq: image: rabbitmq:3-management hostname: rabbit-node1 # 每台机器改成不同的名字 environment: - RABBITMQ_ERLANG_COOKIE=your_cookie_here ports: - "5672:5672" - "15672:15672" ``` 这里的命令只是帮助大家理解 RabbitMQ 集群是如何组成的 本讲重点是理解 RabbitMQ 集群的演进思路,而不是背诵部署命令,实际生产环境中,通常会结合 Docker Compose、Kubernetes、或其它自动化运维工具完成部署,很少有人在线上环境手工逐条执行这些命令 节点 B 和节点 C 加入节点 A 的集群: ```bash # 在节点 B 上执行 rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@rabbit-node1 rabbitmqctl start_app # 节点 C 同理 ``` 现在你有了一个三节点的集群,解决了连接分散的问题,但队列数据还是只在一个节点上 #### 4. 第三步:镜像队列(旧方案) --- 给集群配置镜像策略,让队列数据自动复制到所有节点: ```bash rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all"}' --apply-to queues ``` 现在每个队列的数据都会同步到三个节点,解决了数据冗余的问题,但有消息丢失风险和脑裂问题 #### 5. 第四步:Quorum Queue(推荐方案) --- RabbitMQ 3.8+ 支持 Quorum Queue,声明队列时指定类型为 `quorum`: ```php $channel->queue_declare('order_queue', false, true, false, false, false, [ 'x-queue-type' => 'quorum' ]); ``` 或者在管理界面创建队列时选择类型为 Quorum Quorum Queue 会自动在集群的多个节点上存储数据,不需要手动配置策略 推荐 3 个节点,这样可以容忍 1 个节点故障 #### 6. 实际部署建议 --- | 环境 | 部署方式 | | ------------ | ------------ | | 开发/测试 | 单机 | | 生产环境 | Quorum Queue 集群 | | 大型生产 | Quorum Queue 集群 | 几个注意点 一、节点数用奇数 3 个节点可以容忍 1 个故障,5 个可以容忍 2 个,偶数个节点会出现平票,不推荐 二、搭配负载均衡 在集群前面加一个 HAProxy 或 Nginx,Producer 和 Consumer 连负载均衡地址,不用关心具体连哪个节点 ```plaintext upstream rabbitmq { server 192.168.1.101:5672; server 192.168.1.102:5672; server 192.168.1.103:5672; } ``` 三、监控很重要 部署之后一定要监控: + 节点状态是否正常 + 队列是否同步完成 + 消息堆积情况 #### 7. 本文小结 --- RabbitMQ 的部署演进: | 阶段 | 解决的问题 | 遗留问题 | | ------------ | ------------ | ------------ | | 单机 | 能用 | 单点故障 | | 普通集群 | 连接分散 | 数据无冗余 | | 镜像队列 | 数据冗余 | 消息可能丢、脑裂 | | Quorum Queue | 可靠高可用 | 功能略有局限 | 实际项目中,直接用 Quorum Queue 集群,不需要从单机一步步演进 对于新项目来说,通常直接选择 Quorum Queue,并不会真的经历从单机到 Quorum Queue 的升级路线 这个演进过程主要是帮助你理解 RabbitMQ 的设计演化,以及每种方案解决和遗留了什么问题 真正重要的不是记住部署命令,而是理解每一种方案解决了什么问题、又留下了什么问题 这才是 RabbitMQ 集群章节想传达的核心