一个机房整体故障后怎样恢复:多机房、RPO 与 RTO
从业务损失出发定义 RPO、RTO 与恢复边界,比较备份恢复、冷备、温备、热备和双活,并完整走过数据复制、流量切换、旧主隔离、依赖恢复与回切演练。
单机宕机可以由同机房副本接管,机房整体失联会同时带走计算、缓存、数据库、消息队列、配置中心和运维入口。此时“在另一个机房部署一套服务”只完成了最容易的一部分。备用数据库复制到什么位置,谁确认主机房已经失去写权限,DNS 多久生效,密钥和配置能否使用,消息积压怎样处理,恢复后的旧主会不会重新接收写入,这些问题共同决定系统是否真的能恢复。
本文回答的问题是:当一个机房或云 Region 整体不可用时,怎样根据可接受的数据损失和停机时间设计恢复方案,并在切换与回切过程中避免双主和二次数据破坏? AWS 将 RTO 定义为中断到恢复之间可接受的最大延迟,将 RPO 定义为最近恢复点距离故障时刻可接受的最大时间。两者是业务目标,不是某个数据库产品的配置项。
一、RPO 与 RTO 衡量两种不同损失
故障发生在 12:00。备用系统在 12:20 恢复对外服务,它拥有的数据只到 11:55:
RTO 实际值 = 20 分钟
RPO 实际值 = 5 分钟
RTO 关注服务停多久,决定检测、决策、拉起资源、恢复数据、校验和切流的总预算。RPO 关注可能丢多少数据,决定备份频率、复制方式和确认点。把副本放到另一个机房可能缩短 RTO,但异步复制延迟仍决定 RPO;每秒备份一次也不代表能在几分钟内把数 TB 数据恢复完。
目标要按业务能力拆分。支付写入可以要求 RPO 接近 0、RTO 15 分钟;历史报表允许 RPO 24 小时、RTO 8 小时;商品详情读可以在 2 分钟内以旧缓存恢复。整套系统写一个“RTO=5 分钟”没有可执行意义,因为最慢的非关键依赖会让所有组件被迫采用昂贵方案。
先定义什么叫恢复
“容器已经启动”不是业务恢复。一个可验证的恢复终点应包括:用户流量已进入备用机房;核心读写满足一致性要求;认证、密钥、配置和依赖可用;错误率与延迟处于降级 SLO 内;故障期间的结果未知请求有查询与补偿路径;监控能够观察新主路径。
RTO 也要区分部分恢复和完全恢复。支付系统可以先恢复订单查询与“处理中”写入,再恢复同步扣款,最后追赶报表与通知。把恢复拆成阶段,核心能力无需等待整个技术栈满血。
二、高可用与灾难恢复覆盖不同故障域
同机房多副本解决机器、机架和部分网络故障,通常依赖毫秒级心跳与自动接管。灾难恢复处理相关性更强、持续时间更长的故障:整个可用区、Region、运营商链路、账号控制面或大范围配置事故。故障边界扩大后,自动判断更难,数据分歧和操作风险更高。
多可用区不一定等于多 Region,多 Region 也不一定独立。两个 Region 可能共享身份系统、DNS 控制面、CI/CD、证书颁发、全局数据库或人员操作流程。架构图上的两套计算集群如果依赖同一组不可用的密钥服务,仍然是一个故障域。
故障域清单至少包括:计算与网络、权威数据、缓存和队列、服务发现与配置、身份与密钥、DNS/全局流量入口、制品仓库和部署系统、监控告警、运维权限,以及依赖的第三方 API。每个组件都要说明备用位置、复制方式、恢复顺序和失效行为。
三、四种恢复策略是在成本与时间之间选择
AWS 灾难恢复指南把常见方案分为备份恢复、pilot light、warm standby 和 multi-site active/active。名称会因平台变化,背后的资源状态相同。
| 策略 | 备用侧平时状态 | 典型恢复动作 | RTO/RPO 特征 | 主要成本 |
|---|---|---|---|---|
| 备份恢复 | 保存跨域备份 | 建基础设施、恢复数据、部署应用 | RTO 长,RPO 由备份频率决定 | 日常成本最低 |
| 冷备 / Pilot light | 核心数据持续复制,计算未完整运行 | 扩容计算、接入依赖、切流 | RTO 通常为数十分钟级 | 保留数据底座 |
| 温备 / Warm standby | 缩容但功能完整 | 扩容、校验、切流 | RTO 可到分钟级,RPO 取决于复制 | 长期运行两套关键组件 |
| 热备 / 双活 | 两侧接近完整容量 | 隔离故障侧、调整流量 | RTO 最短,写一致性最复杂 | 基础设施与运维成本最高 |
表中的时间不是保证。AWS 文档给出的区间是方案示意,实际 RTO 取决于数据量、自动化、依赖和演练。温备若半年没有成功部署,故障时可能比每日验证的备份恢复更慢。
双活不会自动得到 RPO=0
两地都接读流量比较容易,两地都接写流量需要决定冲突语义。若所有写仍路由到单一主 Region,备用侧是读双活、写主备;主 Region 失效时要提升远端副本。若两地独立写同一数据,系统要使用全局共识、按用户/业务键分区归属,或者接受并合并冲突。
跨地域同步共识受广域网 RTT 约束。三地多数派写入会把远端网络延迟放进每次提交路径;异步复制降低正常写延迟,却允许故障时丢失尚未到达备用侧的数据。RPO、写延迟和故障可用性之间需要明确取舍。
四、从业务事实设计数据复制
数据库通常是恢复链路的核心,却不是唯一数据。关系库、缓存、搜索索引、对象存储、消息队列和任务状态各自有复制与重建方式。先把数据分成事实、派生数据和临时数据:
- 订单、支付流水、账户余额是业务事实,需要明确跨域持久化和对账;
- 搜索索引、报表宽表和部分缓存可以从事实重建,RPO 可以更宽松;
- 会话、限流计数和本地缓存可能允许丢失,但恢复时会引发回源洪峰;
- 消息既可能是传输载体,也可能承载唯一事实,后者需要单独评审。
同步复制与异步复制的确认点
同步复制要求远端或跨故障域多数派确认后才向客户端返回成功,可以把已确认写入的 RPO 压低,但远端延迟和分区会进入前台可用性。异步复制先在本地确认,后台传输变更;正常延迟较低,故障时可能丢失复制积压。
衡量异步 RPO 不能只看“复制线程在线”。应观测备用侧已应用的日志位置、主侧当前位置、字节与时间 lag,并区分已发送、已接收、已持久化和已应用。跨 Region 网络正常但备用数据库 apply 堵塞时,传输延迟很低,实际可恢复点仍在落后。
备份处理复制无法解决的故障
逻辑误删、错误脚本和数据腐败会被复制到所有在线副本。独立备份需要跨故障域存放、不可变保留、加密密钥可恢复,并支持 point-in-time recovery。备份成功率只能证明文件产生,恢复演练才能证明文件、日志链、schema 和密钥能组合成可启动数据。
备份还要记录依赖版本。只恢复数据库而没有对应应用制品、配置和 schema migration 顺序,可能无法读取旧数据。恢复资产应作为一个有版本的集合管理。
五、切流前必须隔离旧主
主机房“监控不可达”不等于它已经停止写。可能只是监控和备用机房到主机房的链路中断,主机房仍服务部分用户。此时直接提升备用数据库并切入另一部分流量,会出现两个主节点各自接受写入。
故障切换需要 fencing。可以撤销旧主的数据库写权限、关闭存储卷、在全局路由层移除入口、使用更高 epoch/term 让资源端拒绝旧主,或者由能够覆盖两侧的仲裁系统授予唯一写租约。只有 DNS 改向不能终止已经建立的连接,也不能阻止仍能直连旧主的内部服务。
当无法证明旧主已隔离时,系统面临明确选择:等待更多证据,牺牲 RTO;或允许备用侧以只读/受限写模式恢复,避免双主;或按业务预先接受冲突并有合并协议。不能把不确定性隐藏在“自动切换”四个字里。
自动切换需要比健康检查更多证据
单探针连续三次失败适合摘除实例,不足以宣布 Region 灾难。切换决策可以综合外部探针、跨区依赖状态、数据库复制位置、全局流量指标和云控制面事件,并设定人工确认或双人审批。自动化的重点是把确认后的操作快速、可重复地执行,而非让模糊信号直接触发不可逆切主。
对于几秒级 RTO 的系统,人工决策来不及,架构必须从一开始就采用可自动仲裁的多站点协议,并接受其延迟与成本。目标与机制要一致。
六、流量切换有 DNS、连接和缓存传播窗口
DNS failover 简单通用,但 TTL 不是准确切换时间。递归解析器、客户端和 JVM 可能有自己的缓存策略;已有 HTTP/2、gRPC 和数据库连接不会因为 DNS 记录变化自动断开;移动网络还可能使用过期解析。旧入口需要主动拒绝或排空连接,客户端也要在失败后重新解析。
Anycast、全局负载均衡或边缘代理可以更快调整新连接,但控制面仍可能在灾难中失效。备用流量配置要提前下发,证书和健康检查平时持续验证。事故发生后临时创建全局入口,RTO 会被权限、配额和配置错误占满。
切流不能一步从 0% 到 100%。备用系统平时若只运行 10% 容量,应先扩容、预热连接池与缓存,再按 1%、10%、50%、100% 逐步放量,观察错误率、延迟、数据库连接和复制状态。健康主机房的回源流量与积压任务也要限速。
七、控制面要在主机房消失后仍能使用
故障时最尴尬的情况是备用资源存在,却无法登录、部署或改路由。身份认证、MFA、堡垒机、密钥管理、DNS 权限和制品仓库都要有跨域可用路径。紧急账号应最小权限、离线保管并定期演练,不能等事故时才发现审批系统也在故障机房。
基础设施即代码能缩短重建时间,但模板本身不代表可部署。镜像、依赖包、参数、证书、数据库初始化脚本和配额必须一起验证。恢复流水线应从备用控制面运行,输出每一步证据并支持幂等重试。
监控也要独立。若指标、日志和告警全部存在主机房,团队在切换时失去观察能力。至少保留跨域聚合的核心 SLI、复制位置、全局流量和审计日志;高容量明细可以在恢复后补传。
八、依赖图决定真实恢复顺序
应用启动顺序不能靠服务名列表。恢复要沿依赖图从底层事实到入口展开:网络与身份、密钥与配置、数据库和队列、服务发现、核心服务、边缘入口、非核心异步任务。每一步有验收条件,失败时停止扩大流量。
缓存通常不作为权威恢复源,但空缓存会把所有读压到刚恢复的数据库。可以提前复制热点数据、用快照预热,或者切流时严格限速。缓存内容若携带权限、库存等敏感事实,还要验证陈旧边界。
消息队列要确定消费位置。主机房生产成功但消息尚未复制,备用侧可能缺事件;消息已复制但消费结果未复制,会重新消费。Consumer 使用业务幂等键,切换时记录每个 topic/partition 的可用 offset 与积压。不要为了快速追平而让补偿流量挤占在线请求。
第三方依赖也可能按源 IP、Region 或证书做白名单。备用侧平时不发生产流量,这些配置最容易腐烂。合成交易应持续从备用环境验证认证和最小业务路径,同时避免产生真实资金副作用。
九、支付链路怎样从主机房切到备用机房
假设支付系统主机房 A 承担全部写入,B 机房运行 20% 规模的温备。MySQL 通过异步日志复制到 B,目标 RPO 为 30 秒、核心查询 RTO 为 10 分钟、扣款 RTO 为 20 分钟。订单使用全局 trade_order_no,钱包是独立系统。
故障前
B 持续部署同版本应用,执行只读合成请求;数据库复制 lag 告警阈值低于 RPO;配置、密钥、消息 topic 和服务账号同步;流量入口已有 B 的健康目标但权重为 0;每季度做一次不影响生产的切换演练,每年至少做一次带真实容量的完整演练。
检测与决策
12:00 外部探针、跨区 RPC 和 A 的数据库监控同时失联。值班人员冻结发布,确认并非单一监控故障,读取 B 的最后应用位置为 11:59:48,潜在 RPO 为 12 秒。仲裁流程撤销 A 的写入资格,并将新数据库 epoch 提升。
恢复数据与服务
B 停止复制,校验日志和表状态,提升数据库为主。应用扩容并等待 readiness,核心接口先以受限模式开放:订单查询可用;新支付请求写入 B;对 11:59:48 到 12:00 之间在 A 返回过成功的请求标记为待对账。异步报表、批量扫描和通知暂缓。
渐进切流
全局入口先送 1% 合成和内部流量,再送少量真实流量。观察错误率、P99、数据库连接、锁等待、缓存回源和钱包调用。容量稳定后逐级提高。旧长连接被入口强制排空,客户端对超时请求使用原业务号查询或重试。
收敛未知结果
事故窗口内,客户端可能看到 A 返回超时而扣款已成功,也可能看到 A 成功但数据库日志未复制到 B。系统从网关日志、钱包流水、订单业务号和 MQ 记录建立差异清单。能够自动证明的记录由补偿状态机推进,资金差异进入对账与人工复核。RPO 12 秒不等于这 12 秒内所有交易永久丢失,它表示本地恢复点的缺口,其他业务证据可能帮助重建。
十、回切比切换更容易被低估
A 机房恢复后,它的数据停在故障时刻,不能直接重新加入并接受流量。先确认故障根因和修复,再把 A 作为新的备用侧,从当前主 B 做全量或增量重建。复制追平、校验通过后,才选择继续让 B 做主,或者执行一次新的受控切换。
回切期间仍要 fence 旧 epoch。若 A 上残留的任务和消息消费者自动启动,它们可能用旧状态产生副作用。恢复脚本应默认禁用业务 Worker,先完成数据重建和身份更新,再逐项启用。
不要急于恢复原拓扑。第二次切换本身有风险,业务低峰、复制稳定和人员齐备比“主机房名字必须回到 A”更重要。某些系统选择长期运行在 B,下一次演练再验证反向切换。
十一、数据损坏与机房宕机要用不同恢复路径
Region 宕机时,远端最新副本通常是最好恢复点;逻辑误删或软件 bug 已复制到远端时,最新副本同样错误。此时要从事故前 point-in-time 备份恢复到隔离环境,验证数据,再决定回滚、前向修复或选择性重放。
因此灾备 runbook 的第一个判断应是“基础设施不可用,还是数据已经错误”。自动把流量切到一份同样损坏的数据,只会扩大影响。勒索、凭证泄露和供应链问题还可能要求启用隔离账号与干净制品,普通热备无法覆盖。
十二、怎样把 RTO 分解成可测步骤
一个 20 分钟 RTO 可以分成:2 分钟检测,3 分钟确认与隔离,4 分钟提升数据,5 分钟扩容预热,4 分钟渐进切流,2 分钟业务验收。每段都有负责人、自动化入口、最长时间和失败分支。任何一步无法在演练中稳定达标,整体 RTO 就只是愿望。
RPO 也要测量。定期写入带全局序号的探针记录,记录主侧提交时间与备用侧可见时间;故障演练后读取最大连续序号和缺口。数据库 lag 指标可以辅助,业务记录才能证明端到端复制点。
演练至少覆盖:主 Region 完全不可达、控制面不可用但数据面仍服务、复制长时间落后、DNS 部分客户端不刷新、备用容量不足、消息与数据库恢复点不一致、旧主未完全隔离、回切中断、逻辑数据损坏。每次演练保留时间线和证据,更新自动化与依赖清单。
演练不能依赖事故时不存在的人
runbook 应让当班人员在授权范围内执行,关键决策有明确升级链路。若每一步都要找原系统作者解释,RTO 受人员响应时间控制。脚本要打印当前阶段、输入、输出和回滚方式,避免值班人员在压力下复制不明命令。
十三、常见的伪容灾
“数据库有跨区副本”可能没有测试提升权限;“应用部署两地”可能共享单一配置中心;“DNS TTL 是 30 秒”可能忽略客户端缓存和长连接;“每天备份成功”可能从未做过恢复;“双活”可能只有读流量,写入仍是单点;“RPO 为 0”可能只覆盖数据库,没有覆盖消息与对象存储。
另一类问题是备用环境长期缩容且无人使用。证书过期、配额不足、schema 不兼容、白名单缺失和部署脚本失效都会积累。持续合成流量、定期从备份重建和轮换主备角色,才能暴露这些漂移。
多机房也可能降低日常可靠性。跨区同步增加延迟,共享全局控制面扩大爆炸半径,复杂流量策略引入更多配置错误。多数工作负载可以在单 Region 多 AZ 达成目标;AWS 的多 Region 基础指南同样建议先按工作负载定义目标,再判断是否值得承担多 Region 成本。
十四、评审多机房方案的顺序
先写业务目标:哪些能力必须恢复,各自允许丢多少数据、停多久。再列事实数据与依赖图,选择复制和备份方式。随后定义故障判据、旧主隔离、提升、切流、未知结果收敛和回切。最后用演练证明每一步的时间和数据恢复点。
可以用以下问题做设计审查:
- RPO/RTO 是否按业务能力定义,恢复完成条件是什么?
- 哪些数据是权威事实,哪些可以重建,消息与数据库恢复点怎样对齐?
- 备用侧是否具备独立的身份、密钥、配置、制品、监控和流量入口?
- 切主前怎样证明旧主不能继续写,epoch 或 fencing 在哪里校验?
- DNS 缓存、长连接、缓存冷启动和 backlog 会把 RTO 拉长多少?
- 故障窗口内的成功、超时和结果未知请求怎样对账?
- 数据损坏是否有独立于在线复制的恢复路径?
- 最近一次完整演练的实际 RPO、RTO 和失败步骤是什么?
多机房架构最终交付的是一条经过验证的恢复路径。备用资源、复制链路和流量开关只是组成部分;只有旧主被安全隔离、业务事实可恢复、依赖按顺序启动、未知结果可以收敛,RPO 与 RTO 才从图纸上的数字变成系统能力。
参考资料
如果这篇文章对你有帮助