惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
O
OpenAI News
WordPress大学
WordPress大学
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
IT之家
IT之家
Last Week in AI
Last Week in AI
Vercel News
Vercel News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
B
Blog
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
P
Proofpoint News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
MyScale Blog
MyScale Blog
Schneier on Security
Schneier on Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
News and Events Feed by Topic
Google Online Security Blog
Google Online Security Blog
N
News | PayPal Newsroom
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
The GitHub Blog
The GitHub Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recent Announcements
Recent Announcements
L
LINUX DO - 最新话题
TaoSecurity Blog
TaoSecurity Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
F
Fortinet All Blogs
罗磊的独立博客
Forbes - Security
Forbes - Security
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
H
Heimdal Security Blog
Help Net Security
Help Net Security
V
V2EX
Security Latest
Security Latest
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
H
Help Net Security

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】抽象代数:群、环、域的密码学视角 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 【Linux 网络子系统深度拆解】内核网络调优方法论:从基准测试到生产验证 排序基准测试:用数据说话
【系统架构设计】容灾架构:多活与灾备设计
Liao Tonglang · 2026-04-13 · via 土法炼钢兴趣小组的算法知识备份

2021 年 10 月 4 日,Facebook 全球宕机超过 6 小时。原因是一次 BGP 配置变更把所有数据中心的路由撤回了,DNS 服务器无法被访问,连内部员工的门禁系统都失效了——工程师甚至需要拿角磨机切开机房大门。这次事故造成的直接收入损失超过 1 亿美元,市值蒸发约 470 亿美元。

这不是一个遥远的故事。2023 年 11 月,阿里云香港 Region 因为机房冷却系统故障导致大面积服务中断,影响数千家企业客户。2024 年 7 月,CrowdStrike 的一次错误更新导致全球约 850 万台 Windows 设备蓝屏,航空公司停飞、银行停业、医院推迟手术。

这些事故有一个共同特征:单点故障(Single Point of Failure)被放大到了系统级甚至全球级。容灾架构(Disaster Recovery Architecture)的核心目标,就是在硬件故障、软件缺陷、网络中断、自然灾害甚至人为误操作发生时,把业务影响控制在可接受的范围内。

这篇文章要回答三个问题:

  1. 容灾等级怎么划分,不同等级的 RPO/RTO 和成本差异有多大?
  2. 数据同步有哪些拓扑,各自的一致性与延迟特征是什么?
  3. 真正的”多活”到底怎么做——以蚂蚁金服 LDC 架构为例?

在前一篇“优雅降级:如何体面地坏掉”(待写)中,我们讨论了优雅降级——当系统过载时如何有策略地丢弃非核心功能以保全核心链路。容灾是更上一层的命题:当整个数据中心甚至整个地域不可用时,系统如何继续运行。


一、容灾基础概念:RPO、RTO 与 RCO

在讨论任何容灾方案之前,必须先对齐三个核心指标。

RPO:恢复点目标

RPO(Recovery Point Objective,恢复点目标)回答的问题是:能容忍丢多少数据? 它是从故障发生时间点往回看,最多可以丢失多长时间窗口内的数据。

  • RPO = 0:不允许丢失任何数据。这意味着必须使用同步复制,每一笔写操作都要等远端确认。
  • RPO = 5 分钟:可以接受最多丢失最近 5 分钟的数据。异步复制通常能满足。
  • RPO = 24 小时:可以接受丢失一天的数据。定时备份即可。

RTO:恢复时间目标

RTO(Recovery Time Objective,恢复时间目标)回答的问题是:能容忍停多久? 它是从故障发生到业务恢复正常所允许的最长时间。

  • RTO = 0:业务不中断。这要求流量能够实时切换到备用系统,且备用系统随时处于就绪状态。
  • RTO = 30 分钟:允许 30 分钟的切换时间。人工介入做故障确认和流量切换是可以接受的。
  • RTO = 4 小时:允许较长时间的恢复。可以容忍从备份恢复数据、重启服务等操作。

RCO:恢复成本目标

RCO(Recovery Cost Objective,恢复成本目标)是一个经常被忽略但极其重要的维度:为了达到目标 RPO 和 RTO,愿意付出多少成本? 这里的成本包括硬件资源、网络带宽、运维人力和架构复杂度。

一个残酷的现实是:RPO 和 RTO 越低,成本呈指数增长。把 RTO 从 4 小时降到 30 分钟,成本可能翻 3 倍;从 30 分钟降到 0,成本可能翻 10 倍。

成本
 ↑
 |                           *
 |                       *
 |                  *
 |            *
 |       *
 |    *
 |  *
 | *
 |*
 +————————————————————→ RPO/RTO 降低

这意味着容灾方案的选择,本质上是一个业务价值与技术成本之间的权衡。一个日均交易额 10 万元的系统和一个日均交易额 10 亿元的系统,合理的容灾等级完全不同。


二、容灾等级:从冷备到多活

业界通常把容灾方案分为以下几个等级,每个等级对应不同的 RPO、RTO 和成本。

冷备份(Cold Standby)

最基本的容灾方式。定期把数据备份到异地存储(磁带、对象存储等),灾难发生时从备份恢复。

  • RPO:取决于备份频率,通常 4-24 小时。
  • RTO:数小时到数天,取决于数据量和恢复流程。
  • 成本:最低,只需要存储空间和备份工具。
  • 适用场景:非核心系统、合规性备份。

温备份(Warm Standby)

备用站点的硬件和软件已经部署就绪,数据通过异步复制保持近实时同步,但备用站点不承担业务流量。灾难发生时,需要启动应用服务并切换流量。

  • RPO:秒级到分钟级,取决于异步复制的延迟。
  • RTO:分钟级到小时级,取决于启动和切换流程的自动化程度。
  • 成本:中等,需要维护备用站点的硬件和网络,但计算资源可以降配。
  • 适用场景:重要但非实时性要求极高的业务系统。

热备份(Hot Standby)

备用站点与主站点完全同步,应用服务已启动并随时可以接收流量。灾难发生时,只需切换流量入口。

  • RPO:接近 0,使用同步或半同步复制。
  • RTO:秒级到分钟级,主要取决于故障检测和流量切换速度。
  • 成本:高,备用站点需要与主站点相同配置的资源。
  • 适用场景:核心交易系统、金融支付系统。

同城双活(Same-City Active-Active)

两个数据中心位于同一城市(通常距离 30-80 公里),通过专线连接,延迟在 1-3 毫秒以内。两个中心同时承担业务流量,互为备份。

  • RPO:0(同步复制可行,因为延迟低)。
  • RTO:秒级(流量自动切换)。
  • 成本:高,双倍基础设施,但同城专线成本可控。
  • 限制:无法应对城市级灾难(地震、洪水、大面积断电)。

异地多活(Cross-Region Active-Active)

多个数据中心分布在不同城市甚至不同国家,每个中心独立承担一部分业务流量。这是容灾等级最高的方案,也是架构复杂度最高的方案。

  • RPO:取决于数据同步策略,通常 > 0(跨地域同步复制延迟太高,一般用异步复制)。
  • RTO:秒级(流量在多个中心之间均衡分配,一个中心故障不影响其他中心)。
  • 成本:极高,多套基础设施 + 跨地域专线 + 复杂的数据同步和流量调度。
  • 适用场景:大型互联网公司的核心业务。

下表汇总了各等级的关键指标:

容灾等级 RPO RTO 基础设施成本(相对值) 架构复杂度 适用场景
冷备份 4-24 小时 数小时-数天 1x 非核心系统、合规备份
温备份 秒-分钟级 分钟-小时级 2-3x 重要业务系统
热备份 接近 0 秒-分钟级 3-5x 中高 核心交易系统
同城双活 0 秒级 4-6x 金融、支付
异地多活 秒级 秒级 8-15x 极高 大型互联网核心业务

三、数据同步的五种拓扑

容灾架构的核心难点在数据。计算层是无状态的,可以随时在任意节点重启;但数据层是有状态的,必须保证在多个站点之间的一致性。数据同步拓扑的选择,直接决定了 RPO、延迟和系统复杂度。

拓扑一:同步复制(Synchronous Replication)

每一笔写操作必须等待远端副本确认后才返回成功。

客户端 → 主节点 → 写入本地 → 发送到从节点 → 从节点确认 → 返回客户端
  • 优点:RPO = 0,数据不会丢失。
  • 缺点:写入延迟 = 本地写入时间 + 网络往返时间 + 远端写入时间。跨地域场景下(网络延迟 30-100 毫秒),写入延迟显著增加。
  • 适用场景:同城双活(网络延迟低于 3 毫秒)。

拓扑二:异步复制(Asynchronous Replication)

写操作在主节点完成后立即返回成功,后台异步把变更发送到从节点。

客户端 → 主节点 → 写入本地 → 返回客户端
                              ↓(异步)
                         发送到从节点
  • 优点:写入延迟不受网络距离影响。
  • 缺点:RPO > 0,主节点故障时可能丢失尚未同步的数据。
  • 适用场景:跨地域灾备、对一致性要求不是极端严格的业务。

拓扑三:半同步复制(Semi-Synchronous Replication)

写操作需要至少一个从节点确认接收到日志(但不需要写入完成)后才返回成功。这是同步和异步之间的折中。

MySQL 的半同步复制(Semi-Sync Replication)就是这种模式:主节点等待至少一个从节点的 ACK 后返回。如果超时未收到 ACK,会退化为异步复制。

  • 优点:在大多数情况下 RPO = 0,延迟比全同步低。
  • 缺点:退化为异步时可能丢数据;网络抖动时延迟波动大。
  • 适用场景:同城或短距离异地的数据库复制。

拓扑四:多主复制(Multi-Master Replication)

多个节点同时接受写操作,节点之间互相同步变更。

主节点 A ←→ 主节点 B
   ↕              ↕
主节点 C ←→ 主节点 D
  • 优点:每个节点都能独立处理读写请求,消除了单主瓶颈。
  • 缺点:写冲突处理复杂。两个节点同时修改同一条数据时,需要冲突检测和解决机制(Last Write Wins、向量时钟、CRDTs 等)。
  • 适用场景:异地多活的数据层,但需要严格的数据分区策略来减少冲突。

拓扑五:链式复制(Chain Replication)

变更按固定顺序在节点链上传播:主节点 → 节点 A → 节点 B → 节点 C。读请求从链尾节点响应,保证读到的数据一定是已经完全复制的。

写入 → 节点 A → 节点 B → 节点 C → 读取
 (head)                        (tail)
  • 优点:读操作总是返回强一致的结果;写入确认只需要链尾节点确认。
  • 缺点:链中任意节点故障都会阻塞整个链的复制;链越长,端到端延迟越大。
  • 适用场景:对读一致性要求极高的存储系统。Azure Storage 的实现就基于链式复制。

下面用一张对比表来总结五种拓扑:

拓扑 RPO 写入延迟 冲突处理 架构复杂度 典型应用
同步复制 0 高(受网络延迟影响) 同城双活数据库
异步复制 > 0 跨地域灾备
半同步复制 通常为 0 MySQL 同城 HA
多主复制 取决于同步方式 低(本地写入) 复杂 异地多活
链式复制 0 中(链长度决定) Azure Storage

四、同城双活架构

同城双活是国内金融行业最常见的容灾方案,也是很多企业从”单机房”走向”高可用”的第一步。

基本架构

两个数据中心位于同一城市,通过裸光纤或专线连接,网络延迟通常在 1-2 毫秒。

graph TB
    subgraph 用户层
        U[用户请求]
    end

    subgraph 流量调度层
        GLB[全局负载均衡 GSLB]
    end

    subgraph 数据中心 A
        LBA[负载均衡 A]
        APPA1[应用集群 A]
        CACHA[缓存集群 A]
        DBA[数据库主节点]
    end

    subgraph 数据中心 B
        LBB[负载均衡 B]
        APPB1[应用集群 B]
        CACHB[缓存集群 B]
        DBB[数据库从节点]
    end

    U --> GLB
    GLB --> LBA
    GLB --> LBB
    LBA --> APPA1
    LBB --> APPB1
    APPA1 --> CACHA
    APPB1 --> CACHB
    APPA1 --> DBA
    APPB1 --> DBA
    DBA -- 同步复制 --> DBB

关键设计点

数据层:谁是主? 同城双活的数据库通常只有一个写入主节点。两个中心的应用都可以处理请求,但写操作要么路由到主节点所在的中心,要么通过专线跨中心访问主节点。这意味着”双活”实际上是计算层双活、数据层主从。

缓存层:独立还是共享? 两种方案各有利弊。独立缓存意味着每个中心维护自己的缓存,切换时缓存需要预热;共享缓存意味着通过专线访问同一套缓存集群,延迟稍高但数据一致性好。大多数实践选择独立缓存 + 异步同步。

故障切换:自动还是手动? 自动切换速度快,但误判风险高——网络抖动可能导致脑裂。手动切换更安全,但 RTO 会增加到分钟级。金融系统通常选择半自动:系统自动检测故障并生成切换建议,人工确认后执行。

同城双活的局限

同城双活能应对单机房级别的故障(硬件损坏、机房断电、网络设备故障),但无法应对城市级灾难。2021 年郑州暴雨导致多个数据中心断电断网,如果两个机房都在郑州,同城双活就毫无意义。

因此,对于对可用性要求极高的系统,同城双活只是起点,还需要叠加异地灾备或异地多活。


五、两地三中心架构

“两地三中心”是国内金融行业监管推荐的容灾架构模式,在人民银行和银保监会的多个文件中都有明确要求。

架构模型

“两地”指同城和异地,“三中心”指同城两个数据中心(生产中心 + 同城灾备中心)和异地一个灾备中心。

┌─────────────────────────────────────┐   ┌────────────────────────┐
│          城市 A(同城两中心)           │   │      城市 B(异地)       │
│                                     │   │                        │
│  ┌──────────┐    ┌──────────┐      │   │  ┌──────────┐         │
│  │ 生产中心   │←──→│ 同城灾备  │      │   │  │ 异地灾备  │         │
│  │ (Active)  │同步 │ (Standby)│      │   │  │(Standby) │         │
│  └──────────┘    └──────────┘      │   │  └──────────┘         │
│                                     │   │                        │
└─────────────────────────────────────┘   └────────────────────────┘
            ←———— 异步复制 ————→

工作模式

  • 正常状态:生产中心承担所有业务流量。同城灾备中心通过同步复制保持数据一致,随时可以接管。异地灾备中心通过异步复制保持数据近实时同步。
  • 同城切换:生产中心故障时,切换到同城灾备中心。RPO = 0(同步复制),RTO = 分钟级。
  • 异地切换:整个城市 A 不可用时,切换到异地灾备中心。RPO > 0(异步复制有延迟),RTO = 小时级(需要完整启动服务并验证数据完整性)。

挑战

  1. 异地灾备中心的资源浪费。异地中心在正常情况下不承担流量,但必须维持与生产中心相同配置的硬件。这是纯粹的成本支出。
  2. 异地切换的演练不足。很多企业的异地切换流程一年都演练不了一次。真正灾难发生时,切换脚本可能已经过时,切换过程中暴露出各种未预见的问题。
  3. 数据一致性的妥协。异步复制意味着异地切换时一定会丢数据。丢多少?取决于复制延迟。对于金融业务,每一笔交易数据的丢失都是不可接受的,这就形成了一个两难:同步复制到异地延迟太高影响用户体验,异步复制到异地有丢数据风险。

六、异地多活架构

异地多活是容灾的终极形态——不再区分”生产”和”灾备”,每个数据中心都是生产中心,都在同时处理真实业务流量。

核心挑战

异地多活要解决的核心问题只有一个:跨地域的数据一致性

假设用户 A 在北京下了一笔订单,这笔订单的数据写入了北京的数据库。此时如果用户 A 的请求被调度到了上海,上海的数据库里有没有这笔订单?如果没有,用户会看到自己的订单”消失”了。

这个问题有三种解决思路:

思路一:全局同步复制。 每一笔写操作同步到所有数据中心后才返回。数据强一致,但写入延迟 = 最慢的那个数据中心的网络往返时间。北京到上海的网络延迟约 30 毫秒,北京到广州约 50 毫秒——一次写操作要额外增加 50+ 毫秒的延迟,在高频交易场景下不可接受。

思路二:异步复制 + 用户维度路由。 把数据按用户维度分区,每个用户的所有请求固定路由到同一个数据中心。用户 A 的数据只在北京写入和读取,不需要实时同步到上海。只有当北京不可用时,才切换到上海,此时接受短暂的数据延迟。

思路三:单元化架构。 将整个业务逻辑和数据按用户维度封装到一个”单元”(Unit 或 Cell)中,每个单元可以部署在任意数据中心,单元内部的数据操作是自包含的。这是蚂蚁金服 LDC 架构的核心思想。

数据分区策略

异地多活的关键是确定”按什么维度分数据”。

最常见的分区维度是用户 ID。电商、社交、金融等 C 端业务,绝大多数操作都与单个用户强关联——“我的订单”、“我的余额”、“我的消息”。把同一个用户的所有数据放在同一个数据中心,可以避免绝大多数跨中心的数据依赖。

但总有一些操作是跨用户的——用户 A 转账给用户 B,两人的数据可能在不同的数据中心。这类跨单元操作需要分布式事务或异步补偿机制来保证一致性。

分区策略的选择直接决定了跨单元操作的比例。好的分区策略能把跨单元操作控制在 5% 以下。


七、蚂蚁金服 LDC 架构深度解析

蚂蚁金服(现蚂蚁集团)的 LDC(Logical Data Center,逻辑数据中心)架构是国内异地多活实践的标杆案例,支撑了每年双十一数十万笔/秒的支付峰值。

核心概念

LDC 的核心思想是把传统的”物理数据中心”抽象为”逻辑数据中心”。一个逻辑数据中心包含完整的应用层、缓存层和数据层,能够独立处理一组用户的所有请求。

graph TB
    subgraph 流量入口
        DNS[DNS / GSLB]
    end

    subgraph 城市 A
        subgraph Zone-A-1
            APP_A1[应用服务]
            DB_A1[数据分片 0-63]
        end
        subgraph Zone-A-2
            APP_A2[应用服务]
            DB_A2[数据分片 64-127]
        end
    end

    subgraph 城市 B
        subgraph Zone-B-1
            APP_B1[应用服务]
            DB_B1[数据分片 128-191]
        end
        subgraph Zone-B-2
            APP_B2[应用服务]
            DB_B2[数据分片 192-255]
        end
    end

    DNS --> Zone-A-1
    DNS --> Zone-A-2
    DNS --> Zone-B-1
    DNS --> Zone-B-2

    DB_A1 -. 异步复制 .-> DB_B1
    DB_A2 -. 异步复制 .-> DB_B2
    DB_B1 -. 异步复制 .-> DB_A1
    DB_B2 -. 异步复制 .-> DB_A2

Zone 与 RZone

LDC 把数据按用户 ID 哈希分成若干个分片(通常 256 个),这些分片被分配到不同的 Zone(可用区)。每个 Zone 是一个逻辑单元,包含处理该分片数据所需的全部服务。

Zone 分为两类:

  • RZone(Region Zone):处理与用户强关联的数据和请求。每个用户固定属于一个 RZone。RZone 可以在不同物理机房之间迁移。
  • GZone(Global Zone):处理全局共享数据(如商品目录、汇率配置等)。GZone 只有一个主写入点,但在所有机房都有只读副本。

流量路由

用户请求进入系统后,路由层根据用户 ID 计算出该用户所属的 Zone,然后将请求路由到该 Zone 所在的物理机房。

用户请求 → 接入层 → 用户 ID % 256 → 分片号 → 查路由表 → Zone 所在机房 → 处理

路由表是动态的。当需要把某些 Zone 从城市 A 迁移到城市 B 时,只需要:

  1. 停止该 Zone 的写入。
  2. 等待数据同步完成。
  3. 更新路由表,把流量切到城市 B。
  4. 开放写入。

整个过程可以做到分钟级切换,且只影响被迁移 Zone 的用户。

跨 Zone 事务

当一笔操作涉及两个不同 Zone 的数据时(例如用户 A 在 Zone-1 转账给用户 B 在 Zone-3),LDC 使用基于 TCC(Try-Confirm-Cancel)的分布式事务框架来保证一致性。

TCC 的三个阶段:

  1. Try:预留资源。扣减用户 A 的余额(冻结),增加用户 B 的余额(冻结)。
  2. Confirm:确认操作。把冻结的余额变为实际扣减/增加。
  3. Cancel:回滚操作。如果 Try 阶段有任何步骤失败,释放所有冻结的资源。

为了减少跨 Zone 事务的比例,蚂蚁在业务层做了大量优化:把高频互动的用户尽量分配到同一个 Zone,把跨 Zone 操作尽量改为异步消息驱动。

容灾切换

LDC 的容灾切换本质上是 Zone 的迁移。当城市 A 的某个机房故障时:

  1. 故障检测系统发现异常。
  2. 决策系统判断需要切换。
  3. 将受影响 Zone 的路由切换到城市 B 的备用节点。
  4. 备用节点接管流量。

由于每个 Zone 的数据都在异地有副本,切换过程只涉及路由表的更新和短暂的写入暂停(等待数据同步追平),可以做到分钟级 RTO。


八、流量调度与 DNS 切换

容灾切换的”最后一公里”是流量调度——如何把用户的请求从故障站点引导到健康站点。

DNS 级别切换

最传统的方式是修改 DNS 解析记录,把域名指向新的 IP 地址。

  • 优点:实现简单,不需要额外的基础设施。
  • 缺点:DNS 有缓存(TTL)。即使你把 TTL 设为 60 秒,各级 DNS 缓存(运营商 DNS、浏览器 DNS 缓存、操作系统 DNS 缓存)可能导致实际切换时间远超 60 秒。某些运营商的 DNS 缓存甚至会忽略 TTL,缓存数小时。

GSLB 级别切换

GSLB(Global Server Load Balancing,全局服务器负载均衡)在 DNS 之上增加了智能调度能力。它可以根据用户地理位置、各站点的健康状况和负载情况,动态返回最优的 IP 地址。

常见的 GSLB 产品:

  • 商业方案:F5 BIG-IP DNS、AWS Route 53、阿里云 DCDN。
  • 开源方案:PowerDNS + 自定义健康检查脚本。

GSLB 的健康检查机制是关键。检查频率太低,故障检测延迟高;检查频率太高,可能因为网络抖动产生误判。通常采用多点探测 + 多次确认的策略:从多个探测点同时检查目标站点,只有超过半数探测点都报告故障时,才触发切换。

应用层级别切换

在应用层实现流量调度,绕过 DNS 缓存的问题。客户端在启动时从配置中心获取所有可用站点的地址列表,每次请求时根据策略选择目标站点。如果当前站点不可用,自动切换到备用站点。

客户端 → 配置中心获取站点列表 → 选择站点 A → 请求失败 → 切换到站点 B → 请求成功
  • 优点:切换速度最快(毫秒级),不受 DNS 缓存影响。
  • 缺点:需要客户端配合改造,不适用于纯 Web 场景(浏览器无法绕过 DNS)。

Anycast 路由

使用 BGP Anycast 技术,多个站点共享同一个 IP 地址,BGP 协议自动把流量路由到最近的站点。某个站点故障时,BGP 路由收敛后流量自动转移到其他站点。

  • 优点:对客户端完全透明,不需要修改 DNS。
  • 缺点:BGP 路由收敛时间不可控(秒到分钟级),且 BGP 路由是基于网络拓扑的”最近”而非真正的地理”最近”。
  • 典型应用:Cloudflare、Google 的全球 CDN(Content Delivery Network,内容分发网络)。

混合策略

实际生产环境通常组合使用多种调度方式:

GSLB(全局调度)→ 同城双活 LB → 应用层路由
      ↓                              ↓
DNS TTL = 60s              配置中心实时更新
多点探测健康检查              客户端侧快速故障转移

九、工程案例:某支付平台的两地三中心实践

以下案例来自国内某头部支付平台的公开技术分享,展示了从单机房到两地三中心的演进过程。

背景

  • 日均交易量:超过 1 亿笔。
  • 峰值 TPS(Transactions Per Second,每秒交易数):超过 10 万。
  • 监管要求:RPO = 0(同城),RPO < 30 秒(异地),RTO < 30 分钟。

演进历程

第一阶段:单机房主从。 一个机房内部署 MySQL 主从,应用服务器多实例部署。问题:机房级故障导致全部业务中断,2019 年某次机房空调故障导致服务中断 4 小时。

第二阶段:同城双活。 在同城建设第二个机房,通过裸光纤连接(延迟 1.2 毫秒)。MySQL 使用半同步复制,应用层双活。问题:数据库仍然是单主写入,写流量全部走主机房,主机房故障时需要人工切换主从。

第三阶段:两地三中心。 在异地城市建设第三个机房。同城两中心使用同步复制(RPO = 0),异地中心使用异步复制(RPO < 15 秒)。引入 GSLB 做流量调度,同城切换自动化(RTO < 30 秒),异地切换半自动化(RTO < 20 分钟)。

关键技术决策

数据库选型:MySQL Group Replication vs. OceanBase。 最终选择了 OceanBase(蚂蚁集团的分布式数据库),原因是 OceanBase 原生支持多副本强一致和自动故障切换,减少了中间件层的复杂度。

消息队列的跨机房同步。 使用 Kafka 的 MirrorMaker 2 做跨机房消息同步。遇到的坑:MM2 在网络抖动时可能产生消息重复,消费端必须做幂等处理。

缓存预热。 同城切换时,目标机房的 Redis 缓存命中率会骤降,导致大量请求穿透到数据库。解决方案:维护一份”热 Key 列表”,切换前提前把热 Key 加载到目标机房的 Redis。

容灾演练

每季度执行一次同城切换演练,每半年执行一次异地切换演练。演练流程:

  1. 提前 72 小时通知所有团队。
  2. T-2 小时:确认所有前置检查通过(数据同步延迟、缓存预热完成、监控告警就位)。
  3. T-0:执行切换。
  4. T+30 分钟:验证所有业务指标正常。
  5. T+2 小时:回切到原机房。
  6. T+24 小时:复盘。

第一次异地演练发现了 27 个问题,其中 3 个是 P0 级别(会导致切换失败的阻塞性问题)。这充分说明了定期演练的价值——没有测试过的容灾方案就是没有容灾方案


十、容灾架构的权衡

容灾方案的选择不是技术问题,是业务决策。以下是各方案的综合权衡:

维度 冷备份 温备份 热备份 同城双活 两地三中心 异地多活
RPO 小时级 分钟级 秒级 0 同城 0 / 异地秒级 秒级
RTO 天级 小时级 分钟级 秒级 同城秒级 / 异地分钟级 秒级
硬件成本 1x 2x 3x 5x 6x 10x+
运维复杂度 极高
抗城市级灾难
资源利用率 高(只需存储) 低(备用空闲) 低(备用空闲) 中(双活分担) 高(多活分担)
切换风险 高(长期未验证)
数据一致性 同城强 / 异地弱 最终一致
适合的业务规模 小型 / 非核心 中型 中大型 大型 大型金融 超大型互联网

选择建议

  1. 小型企业 / 非核心系统:冷备份 + 定期演练。成本低,满足基本的数据保护需求。
  2. 中型企业 / 重要业务:温备份或热备份。根据 RTO 要求选择。如果 RTO 要求小于 1 小时,选热备份。
  3. 金融企业 / 支付系统:两地三中心。满足监管要求,同城双活保证日常高可用,异地灾备应对极端情况。
  4. 大型互联网企业 / 全球化业务:异地多活。成本高但资源利用率高(每个中心都在承担流量),且用户体验最好(就近访问)。

十一、容灾架构的常见陷阱

陷阱一:灾备中心从未被真正测试

很多企业花了大量成本建设灾备中心,但从未做过完整的切换演练。等到真的需要切换时,发现脚本已经过时、配置已经漂移、数据同步已经中断了几个月都没人发现。

对策:把容灾演练纳入日常运维流程,至少每季度一次。每次演练后输出详细的复盘报告,跟踪所有问题的修复。

陷阱二:只关注基础设施,忽略应用层

数据库可以自动切换,但应用层的连接字符串、配置文件、第三方服务的 IP 白名单、CDN 回源地址——这些都需要同步更新。一个被遗忘的硬编码 IP 就可能导致切换失败。

对策:维护一份完整的”切换检查清单”,覆盖从 DNS 到应用到第三方依赖的所有环节。

陷阱三:忽视脑裂风险

在自动切换场景下,如果故障检测机制误判(例如网络分区导致备用中心认为主中心已宕机),可能出现两个中心同时认为自己是主中心的情况。两个主中心同时接受写操作,数据就会产生不可调和的冲突。

对策:引入仲裁节点(Arbiter)或法定人数(Quorum)机制。只有获得多数节点同意的一方才能成为主中心。

陷阱四:低估异地延迟对业务的影响

跨地域网络延迟(30-100 毫秒)看起来不大,但在一个涉及多次数据库读写和服务调用的请求链路中,这些延迟会累加。一个在同城环境下 50 毫秒完成的请求,在跨地域环境下可能需要 300 毫秒。

对策:在设计异地多活时,把延迟预算纳入性能模型。确保关键链路的跨地域调用次数最小化。


十二、结论

容灾架构不是一个技术选型问题,是一个业务风险管理问题。核心的决策框架是:

  1. 量化业务损失。系统每停 1 小时损失多少钱?每丢 1 分钟数据的代价是什么?
  2. 确定 RPO 和 RTO。根据业务损失确定可接受的数据丢失量和停机时间。
  3. 选择容灾等级。根据 RPO/RTO 要求和预算约束,选择合适的容灾方案。
  4. 验证,验证,再验证。定期演练是容灾体系中最重要的环节——一个未经验证的容灾方案,其可靠性为零。

从同城双活到异地多活,技术复杂度和成本呈指数增长。但这不意味着每个系统都需要异地多活。大多数系统,冷备份 + 定期演练就够了。关键是让容灾等级与业务价值匹配,然后把选定的方案真正落实到位。


导航

上一篇:优雅降级:有损服务设计的艺术(待写)

下一篇:SLO 工程:可靠性的量化管理


参考资料

论文与书籍

-Erta Hoefler, et al., “Disaster Recovery Planning: A Strategy Guide”, Addison-Wesley, 2014. 容灾规划的系统性参考。 - Martin Kleppmann, “Designing Data-Intensive Applications”, O’Reilly, 2017. 第五章关于数据复制拓扑的经典论述。 - Pat Helland, “Life beyond Distributed Transactions: an Apostate’s Opinion”, CIDR, 2007. 单元化架构思想的理论基础。

工业实践

  • 蚂蚁集团技术博客, “蚂蚁金服异地多活单元化架构下的微服务体系”, 2019. LDC 架构的官方技术解读。
  • 蚂蚁集团 OceanBase 团队, “OceanBase 数据库系统架构”, 2021. OceanBase 多副本一致性机制的详细说明。
  • Facebook Engineering Blog, “More details about the October 4 outage”, 2021. Facebook 全球宕机事故的官方复盘。
  • Cloudflare Blog, “How Cloudflare Uses Anycast”, 2020. Anycast 在全球流量调度中的应用实践。
  • Alibaba Cloud Blog, “Two-Site-Three-Center Architecture for Financial Applications”, 2022. 两地三中心在金融场景的落地经验。

标准与规范

  • GB/T 20988-2007, “信息安全技术 信息系统灾难恢复规范”. 国内容灾等级划分的标准来源。
  • ISO 22301:2019, “Business Continuity Management Systems”. 业务连续性管理的国际标准。
  • 中国人民银行, “银行业信息系统灾难恢复管理规范”, JR/T 0044-2008. 金融行业容灾建设的监管要求。

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2025-10-09 · storage

【存储工程】灾难恢复设计

全面剖析灾难恢复架构——RPO/RTO 等级设计、同城双活与异地灾备、两地三中心架构、故障切换机制与灾备演练方法论

2026-04-13 · architecture

【系统架构设计】高可用设计模式:冗余、故障转移与仲裁

Active-Passive、Active-Active、N+1 冗余——不同模式的故障检测与切换机制有何差异?本文拆解高可用的度量体系、冗余模型、故障转移机制、脑裂问题与 Fencing 策略,结合 VIP 漂移与 DNS 切换的工程实现,讨论主备切换中的数据一致性,最后以某支付系统数据库高可用架构为例,给出模式选型的完整对比。

2026-04-22 · architecture / fintech

【金融科技工程】金融级可靠性:两地三中心、单元化、RPO/RTO、灰度

金融系统的可用性不是 SLA 表里的一个数字,而是人民银行、银保监、GB/T 20988 六级灾备、SOX、FFIEC 这些监管框架共同压出来的工程形态。本文从 RTO/RPO 的定义出发,走过单机→主备→同城双活→两地三中心→三地五中心→单元化(LDC/Set)的架构演进,拆解异地多活的数据同步、冲突处理与流量调度,配套混沌工程、全链路压测、应急预案与复盘文化,最后用 Go 写一个可运行的多活流量切换骨架。结合光大 8·16 乌龙指、2021 AWS us-east-1 故障、2020 工行手机银行故障、蚂蚁春节红包等公开案例展开。

2026-04-13 · architecture

【系统架构设计】什么是软件架构:从代码结构到系统决策

软件架构的定义至少有三种主流理解,每种指向不同的关注点。本文对比 Booch、Fowler、Johnson 三家定义,分析架构决策的不可逆性特征,拆解 Krutchten 4+1 视图模型,回答一个核心问题:架构和设计的边界到底在哪里。