高可用

最近更新时间:2026-05-27 11:35:47

我的收藏
消息队列 RabbitMQ 版提供多维度高可用能力,例如跨可用区部署、数据持久化,有效提升消息服务的稳定性和容灾能力

集群高可用

集群类型
高可用能力
说明
开源托管版
跨可用区部署
在拥有两个或以上可用区的地域购买 RabbitMQ 开源托管版集群时,可以选择 2-3 个可用区进行部署。节点会均匀打散分布在各可用区上。这种部署方式能够让集群在单个可用区不可用的情况下,仍能正常提供服务。
Serverless 版
集群底层默认跨多可用区部署,无需手动选择可用区,集群节点会自动分布在多个可用区,即使单个可用区故障也不影响服务,实现机房级容灾。

数据高可用

集群类型
高可用能力
说明
开源托管版
镜像队列
多节点支持开启镜像队列,可配置多副本同步。
镜像队列可以在 RabbitMQ 集群中的多个节点上复制队列中的消息,确保在某个节点发生故障时,队列中的消息不会丢失,保证服务的可用性。
Serverless 版
数据持久化三副本
集群默认支持数据持久化三副本,通过数据持久化存储和多节点冗余备份的双重保障,确保业务数据在任何情况下都不会丢失,服务不会中断。

跨多可用区部署

概述

消息队列 RabbitMQ 版(TDMQ for RabbitMQ)支持在多个可用区(Availability Zone,简称 AZ)部署集群节点,并基于开源 RabbitMQ 的 镜像队列(Classic Mirrored Queues) 机制提供跨 AZ 的数据冗余与故障切换能力。
TDMQ for RabbitMQ 的集群节点数固定为 奇数,可选 1 / 3 / 5 / 7 节点,其中 3 节点 是最常见的部署形态。本文统一以 3 节点集群为例,介绍其在 2AZ 与 3AZ 部署下的高可用能力差异、网络分区故障下的行为表现,以及购买实例时的多 AZ 选型建议。
注意:
只有 RabbitMQ 托管版才有镜像队列,因此会存在网络分区的风险。RabbitMQ Serverless 不依赖镜像队列,基于底层存算分离架构实现集群的高可用能力,不存在网络分区的问题。

镜像队列说明

镜像队列是开源 RabbitMQ 提供的经典高可用方案,其核心思想是:将一个队列的数据,从 主节点(Master / Leader) 同步复制到一个或多个 镜像节点(Mirror / Follower)。当主节点所在 Broker 不可用时,集群将从健康的镜像中选举一个新的主节点,对客户端继续提供服务。
镜像队列通过 Policy 进行配置,关键参数如下:
参数
说明
TDMQ for RabbitMQ 默认参数值
ha-mode
镜像策略模式:all(全节点镜像)/ exactly(指定副本数)/ nodes(指定节点)
exactly
ha-params
当 ha-mode=exactly 时,指定副本总数(含主节点)
3
ha-sync-mode
新副本同步方式:automatic(自动同步)/ manual(手动)
manual
ha-promote-on-shutdown
主节点优雅停机时是否允许提升未同步的镜像
when-synced
ha-promote-on-failure
主节点崩溃时是否允许提升未同步的镜像
always(高可用)
说明:
镜像队列默认副本数为 3(即每个节点都持有一份完整数据),保证任意节点存活都能恢复消息。需要注意的是,镜像队列模式下集群 TDMQ for RabbitMQ 默认使用 autoheal 分区处理策略,少数派子集并不会自动暂停。

单 AZ 部署场景下的高可用能力(3 节点)

3 节点集群部署在同一个可用区内,所有节点共享同一物理基础设施(机房、电力、网络出口)。
可承受任意单节点宕机:剩余 2 节点构成多数派,集群继续读写,业务侧仅感知亚秒级抖动;
无法应对 AZ 级故障:单 AZ 整机房断电、断网、消防、空调故障等场景下,集群整体不可用,且未同步消息可能永久丢失;
无任何跨 AZ 容灾能力:与 RabbitMQ 单机部署的容灾边界相同,仅多了节点级故障容忍。

2AZ 部署场景下的高可用能力(3 节点)

部署形态

3 节点集群在 2AZ 形态下,因节点数为奇数,必然形成 2 + 1 的不对称结构:主 AZ 部署 2 个节点、备 AZ 部署 1 个节点。
镜像队列默认按 ha-mode=exactly, ha-params=3 配置(即三个节点都持有完整副本),并通过 Queue Master Locator 策略让主副本均衡分布。

可承受的故障范围

2AZ / 3 节点部署在以下故障场景下可保持服务可用:
任意单节点宕机:剩余节点仍持有完整镜像副本,集群可继续读写;
AZ-B(备 AZ,1 节点)整体故障:剩余 2 个节点仍在 AZ-A,构成多数派,常仅出现短暂抖动/重连,具体取决于客户端重连与连接池参数;
AZ-A(主 AZ,2 节点)整体故障:AZ-B 的 1 个节点持有完整镜像副本,当分区处理策略为 autoheal (TDMQ for RabbitMQ 默认策略)时,集群以单节点方式继续提供读写服务,业务可用性保持;
跨 AZ 网络抖动:抖动恢复后,如果 ha-sync-mode=manual(TDMQ for RabbitMQ 默认策略) 需要手工同步,如果 ha-sync-mode=automatic,则自动同步。

3AZ 相比 2AZ 额外提升的高可用能力(3 节点)

部署形态

3 节点集群在 3AZ 形态下,每个 AZ 各部署 1 个节点(1+1+1),形成完全对称的拓扑。

三种部署形态容灾能力对比

能力维度
单 AZ
2AZ(2+1)
3AZ(1+1+1)
单节点故障
自动切换
自动切换
自动切换
网络复杂度
不涉及跨 AZ 问题
网络复杂度低
网络复杂度高,更容易出现网络分区问题
单 AZ 整体故障
集群完全不可用
备 AZ 故障无感;主 AZ 故障会降级为单节点运行,存在少量未同步消息丢失
任意 AZ 故障均自动切换,剩余 2AZ 仍持有完整副本
网络分区脑裂风险
基本不会发生
默认 autoheal 策略下,少数派 AZ 在分区期间继续接收消息,恢复时被强制丢弃
多数派始终在另两个 AZ,少数派 AZ 影响面仅 1/3
AZ 故障期间高可用能力
无 AZ 冗余
主 AZ 故障后退化为单点,无 HA
任一 AZ 故障后仍剩 2 节点互为镜像
镜像副本分布
单 AZ
副本最多分布在 2AZ
副本天然分布在 3AZ,跨 AZ 容灾粒度更细

网络分区故障下的行为对比(3 节点)

网络分区是使用 RabbitMQ 时需要面对的一类典型故障:单机网络异常或内部通信端口不通,节点间无法通信即可能触发分区。TDMQ for RabbitMQ 默认 net_ticktime=60s,分区判定窗口为 45s ~ 75s(可配置,非固定值),分区发生时各子集会认为对方节点已 down,元数据操作仅在本子集生效。

分区会带来什么风险

未配置镜像队列时:发送方仍可投递但可能路由失败,需配合 mandatory + Basic.Return 处理;消费方可能出现 ack 失效;分区恢复后元数据不丢,但可能消息重复。
配置了镜像队列时(TDMQ for RabbitMQ 默认形态):每个子集都会独立选出 master,互相独立运行;分区恢复时还要看 ha-sync-mode:
manual(默认):当新的 slave 节点加入时,不会同步 master 节点上的旧数据。但如果此时 master 节点发生异常,那么此部分数据可能会丢失。
automatic:当新的 slave 节点加入时,会自动同步 master 节点中的数据。队列数据同步过程中,队列服务不可用,客户端连接会被阻塞。如果 master 节点中有大量的消息堆积,比如会造成 slave 节点的同步时间增长,进一步影响集群服务的可用性。
镜像队列默认采用 autoheal 策略:分区期间各子集双写,恢复时按"客户端连接数最多 → 节点数最多"规则选出获胜方,输家节点重启,输家分区期间产生的消息被丢弃。

腾讯云 TDMQ for RabbitMQ 的监控与恢复

分钟级拨测:覆盖网络分区、端口 down 等指标,均配置电话告警,运维侧分钟级介入;
默认 autoheal:集群自动选出获胜分区并重启输家节点,加速分区收敛,无需人工干预;
VIP 接入:分区期间客户端流量自动引流至获胜分区,避免持续连到将被重启的节点。

客户端侧建议

1. 发送方:开 publisher confirm + mandatory,处理 Basic.Return,识别分区期间的路由失败;
2. 消费方:分区恢复时可能消息重复,消费侧必须做幂等;
3. 配置堆积告警:分区恢复后 slave 重新追平的时长正比于 master 堆积量,建议配置监控。

多 AZ 选购建议

双 AZ 和 三 AZ 都能满足单 AZ 故障场景下的容灾要求,达到 SLA 99.95%,建议根据业务的实际场景进行选择。