故障域、RTO/RPO 和切换:恢复目标要像契约一样验收
"有副本"不等于可自动切换,"能切换"不等于不丢已确认数据。本页定义故障域、把 RTO/RPO 写成可验收的恢复契约,并推导切换与回切的完整时间线。可用性/耐久性/正确性三目标的区分见可用性、耐久性和正确性是不同质量目标;租约与 fencing 的授权裁决见租约和 fencing 令牌。本页是方法专题,使用算例与状态机,不绑定单一组件源码。
故障域:可能共同失效的一组资源
故障域是可能共同失效的一组资源:主机、机架、可用区、区域、控制面、身份系统、发布流水线、证书服务、DNS。多副本若共享同一故障域,对该类故障没有独立保护。三副本若共用机架、电源、网络控制面或凭据,并不是三个独立故障域。列出共享依赖要覆盖数据面之外的支撑系统:一次"数据库可用"的切换可能因为密钥服务或 DNS 缓存仍然不可服务。
识别方法:对每个支撑组件问"它坏了,我的副本还能构成法定多数吗?还能完成认证、路由和发布吗?"把答案画成依赖图,图上任何单点都是隐藏的共同故障域。异步副本、备份与跨区日志各提供不同恢复能力,先定义容忍的单节点、单区或全地域故障,再谈方案。
RTO/RPO 是绑定情景的契约
RTO 定义服务恢复的目标时间,RPO 定义可接受的数据丢失范围。两者要对应具体故障情景、备份/复制方案、切换步骤和验证指标,脱离情景的"RTO 5 分钟"无法验收。同一个系统对不同故障可以有不同目标:单节点故障 RTO 60 秒,单区故障 RTO 15 分钟、RPO ≤ 5 秒,全地域故障走降级预案。
推导切换时间线:假设发现30秒、确认隔离20秒、提升副本40秒、路由/连接更新30秒、预热及校验60秒,端到端RTO至少180秒。只计提升40秒会严重低估——用户路径要等发现、授权、容量、校验全部完成。若异步复制落后5秒且落后窗口内已向客户确认写成功,故障时存在丢失风险;RPO=0需要与成功应答契约匹配的耐久/复制协议,不由副本距离决定。
切换的状态机与旧主隔离
切换按固定顺序推进,每步有可检查的完成条件:
故障发现 → 确认主权可疑 → 隔离旧主(拒绝其写)→ 提升新主
→ 更新路由/连接 → 预热与数据校验 → 宣布恢复(进入观察期)安全顺序通常是确认主权、拒绝旧主写、提升新主、切路由、验证。网络分区时无法联系旧主不等于它已停止,旧连接可能继续写。隔离可以由存储仲裁、租约/fence、受控网络或平台能力实现,但须说明资源端真正拒绝的位置——fence 必须在效果提交点生效,反例见租约和 fencing 令牌。
恢复旧主不能直接挂回并接受写;它可能有分叉历史。需按产品协议截断/重建并核对提交水位,再以副本身份加入。回切是另一次迁移,不是DNS改回去;旧客户端缓存、池内连接和重试会拖长混合主权窗口。回切前要回答:分叉写如何裁决、正在途的旧请求如何识别、回切期间双主窗口是否存在。
热备、备份与恢复窗口的算例
1TiB数据以200MiB/秒恢复,单数据阶段约87.4分钟,目标RTO30分钟就需要热备、并行恢复或更小关键集。热备平时成本高,但缩短恢复;备份便宜,却要承受对象获取、日志回放与校验。选择依据是恢复契约而不是存储单价。
还需对勒索、误删和凭据失陷设计不可变备份与隔离权限——副本会忠实复制误操作,快照链共享根凭据会一起失陷。演练在隔离数据集验证恢复耗时,记录截止水位、丢失操作范围、业务探针与对账;不要对生产节点执行破坏。演练只恢复空库或小样本,不能宣称证明全量RTO。协议参考关键状态与共识,本页具体预算是教学模型。
多地域架构与恢复责任
主动-被动以较少写冲突换取切换时延和待机成本;主动-主动提高区域本地可用性,但要解决并发写、冲突合并、全局唯一性和跨区因果关系。同步跨区复制增加写入 RTT 并受广域网络尾延迟影响;异步模式降低写延迟但有数据丢失窗口。区域级服务自治需要处理身份、配置、密钥和控制面依赖。
多地域还涉及数据驻留、隐私、跨境流量和区域失效期间的业务降级。应用路由策略和数据一致性策略应与法律和恢复目标一致;把"另一区域"当作免费备份时,要先确认该区域的数据复制范围与恢复授权。
可执行推演与验收
本页算例用纸面或电子表格完成,结果标为"模型推演";可用性乘积等演算可对照 python3 labs/quality_models.py availability(完整脚本,与主题其他算例共用)。
推演一(RTO 分解):把 180 秒切换时间线逐段填写实际测量来源——哪些段有演练证据、哪些段是估计;对"发现"段补充监控覆盖假设,说明告警静默时 RTO 如何劣化。
推演二(RPO 核验):异步副本落后 5 秒、写入 1,500 次/秒,按"已确认而未复制的事务集合"列出丢失集合的构成,说明 5 秒与 7,500 次两个数字各自依赖的假设(均匀写入、事务大小相近),不能互相替代。
推演三(恢复矩阵):对"提交前、提交后响应前、副本接收前、副本应用前、通知完成后"五个状态分别注入进程崩溃、主机损毁、区域丢失,填写"数据在哪、客户端知道什么、能否安全重试";矩阵必须区分本地持久化与远端确认。
交付产物:故障域依赖图、按情景的 RTO/RPO 契约表、切换与回切状态机、恢复演练记录(含未运行项)。通过条件是每个数字有来源、每个步骤有完成条件、旧主隔离在资源端可验证。仅有部署图或"我们有三副本"不构成恢复方案。
演练分级与恢复契约验收表
RTO 是一个端到端时间线,必须逐段给出证据类型,否则 180 秒只是加法。把切换过程拆成五段并标注来源:发现 30 秒(监控覆盖假设,告警静默时会劣化)、确认隔离 20 秒(是否有自动仲裁,人工确认的排队时间另计)、提升副本 40 秒(演练过还是估算)、路由与连接更新 30 秒(旧客户端缓存与连接池会拖长)、预热与校验 60 秒(抽样校验的漏检风险)。合计 30+20+40+30+60=180 秒;若业务 RTO 为 60 秒,必须逐段说明压缩手段与新风险,而不是把总数改小。
备份与热备是两种恢复契约。1TiB 数据以 200MiB/秒恢复,纯数据阶段 1024⁴/(200×1024²)/60≈87.4 分钟,已超过 30 分钟 RTO;日志回放、校验与密钥获取还会增加。热备平时成本高但缩短恢复,备份便宜却要承受对象获取、回放与校验。选择依据是恢复契约与可接受的丢失范围,不是存储单价。演练还必须验证旧主隔离在资源端生效:只改 DNS 或等待缓存过期,不能阻止旧主继续写。
执行 python3 labs/quality_models.py recovery:输入五段耗时(30/20/40/30/60 秒)、目标 60 秒、数据量 1TiB、恢复带宽 200MiB/秒。预期输出 rto_s=180、backup_minutes=87.4、target_s=60、gap_s=120,以及段级证据表(哪些段有演练证据、哪些是估算)。脚本是算术与证据标注模型,不执行真实切换;多区故障与备份恢复本轮未运行。
两个方案:A 预置热备与自动仲裁,把发现和提升压到秒级,代价是常备容量与误切换风险(仲裁分区时可能双主);B 保留人工确认与备份恢复,成本低但 RTO 依赖值班与恢复带宽,且 87.4 分钟的恢复阶段已排除 30 分钟目标。若业务只能接受 30 分钟,B 不可行,必须改 A 或缩小关键数据集。回切是另一次迁移:旧主可能持有分叉历史,需按协议截断重建、核对提交水位,再以副本身份加入,不能把 DNS 改回去当作恢复。
架构师变化条件
把 RTO 从 180 秒收紧到 60 秒:发现段需要自动化仲裁(成本是误切换风险),预热段需要常备热备,校验段要接受抽样校验——每段压缩都要说明新风险。区域故障升级为"两地同时受控维护",主动-主动方案的冲突合并与唯一性约束成为恢复路径的一部分。若备份密钥与生产凭据同域,勒索情景使 RPO 目标失效,需要独立密钥域。每次变化重填契约表并指出哪些演练证据失效。
闭卷验收
本页 8 道闭卷题收进了下方自测面板:先回忆,再展开参考答案与评分点,最后给三档自评。