跳到主要内容

故障转移、演练与恢复验证

故障转移把流量和写入权交给健康副本,演练和恢复验证用于确认切换后业务与数据都处于可接受状态。

1. 先定义触发条件

故障转移需要区分进程故障、节点故障、网络分区、依赖故障和性能退化。单一心跳失败不足以覆盖这些情况,也容易因短暂抖动误切换。

触发判断可以组合:

  • 多个位置的主动健康检查;
  • 用户请求错误率和延迟;
  • 复制状态与数据新鲜度;
  • 节点租约或共识状态;
  • 运维确认和变更上下文。

检测阈值需要平衡发现速度和误报。连续失败次数、恢复迟滞和最短稳定时间可以防止两个节点之间反复切换。

2. 写入切换需要 fencing

网络分区时,旧主节点可能仍在运行,只是无法与控制面通信。直接让备用节点开始写入,可能形成两个主节点。

fencing 通过租约、任期、仲裁、存储令牌或断电隔离,确保旧主无法继续提交写入。每次领导权变化都带上单调递增的 epoch,下游只接受当前 epoch 的请求,也是一种常见做法。

只有健康检查、没有写入权协议的主备系统,无法可靠处理网络分区。故障转移设计必须说明谁拥有最终裁决权。

3. 数据就绪后再接管

备用节点可连接,不代表适合接管。切换前至少检查:

  • 复制延迟是否满足 RPO;
  • 日志是否完整、校验是否通过;
  • 应用版本和数据库 schema 是否兼容;
  • 缓存、索引和本地状态是否预热;
  • 剩余容量能否承担目标流量。

同步复制系统还要确认多数派和提交位置;异步复制系统需要明确会丢失或重复哪些写入。恢复后通过业务幂等键、流水和对账修复边界数据。

4. 流量切换按阶段执行

一次可控切换可以分为:

  1. 冻结高风险变更并建立事件指挥;
  2. 确认目标节点、数据位置和容量;
  3. 先切少量探测或内部流量;
  4. 检查错误、延迟、数据和下游状态;
  5. 分批扩大流量;
  6. 宣布新拓扑并更新监控与值班信息。

DNS 切换要考虑 TTL 和客户端缓存,连接型协议还要处理已有长连接。即使控制面显示流量已经迁移,也要从多个用户位置确认真实路径。

5. 恢复验证覆盖业务结果

基础设施健康检查通常只验证端口、进程或简单查询。恢复验证还需要:

  • 创建、查询和更新一条测试业务记录;
  • 确认消息发布与消费继续推进;
  • 比较关键账务、库存或状态机不变量;
  • 检查异步积压、定时任务和第三方回调;
  • 从用户入口执行端到端合成探针。

验证数据要有独立标识并能安全清理。涉及真实资金或通知时,使用沙箱账户和无副作用路径。

6. 演练从小故障开始

演练应有假设、范围、停止条件和观察指标。可以逐级覆盖:

  • 终止单个实例;
  • 隔离一个节点或可用区;
  • 限制依赖延迟和带宽;
  • 暂停复制或使备用节点落后;
  • 模拟区域不可用并执行恢复计划。

首次演练先在预生产或小流量环境验证自动化。生产演练控制爆炸半径,准备立即终止和人工接管渠道。演练目的是验证系统假设和团队协作,不追求制造更大的故障。

7. Runbook 必须可以直接执行

有效 runbook 包含前置检查、命令或控制台路径、每一步预期结果、负责人、超时和回退动作。关键凭据和工具不能只存在于故障区域。

演练时让非作者按 runbook 操作,最容易发现隐含知识。每次系统版本、拓扑、证书或组织责任变化后,都要更新并重新验证相关步骤。

自动化脚本同样需要 dry-run、审计、幂等和权限最小化。一个未经演练的自动切换脚本只是另一项风险。

8. Failback 是独立迁移

原主节点恢复后,不应立即抢回流量。需要先确定当前权威数据源,修复旧主状态,重新建立复制并追平,再按普通灰度流程切回。

有时继续使用新主比立即回切更安全。Failback 的时机由风险、性能、运维窗口和长期拓扑决定,不能只因为旧节点“恢复绿色”就执行。

9. 用数据评估演练

每次演练记录:

  • 检测时间、决策时间和切换时间;
  • 实际 RTO、RPO 和用户影响;
  • 人工步骤、权限阻塞和沟通延迟;
  • 告警是否准确、文档是否可执行;
  • 恢复后数据差异和积压清理时间。

发现项转为有负责人、优先级、期限和验收方式的任务,并安排复测。只保存演练报告,没有关闭行动项,不能提高下一次恢复能力。

10. 面试题

10.1 怎样设计并验证数据库主备故障转移

出现公司:字节跳动

考察重点

  • 故障检测、仲裁和 fencing。
  • 复制位置、RPO、接管容量与流量切换。
  • 业务验证、failback 和演练闭环。

相关内容:第 1 节“先定义触发条件”至第 9 节“用数据评估演练”。

参考回答

我会先定义主机故障、网络分区和性能退化的检测信号,使用多点探测、用户错误和复制状态综合判断,并设置迟滞防止抖动。写入切换必须经过多数仲裁、租约或 epoch fencing,确保旧主不能继续提交。

备用节点接管前检查复制位置、版本、容量和数据完整性,再从探测流量逐步扩大。切换后通过端到端业务探针、关键不变量、消息积压和数据对账验证。原主恢复后先追平和校验,再单独安排 failback。最后定期做受控故障演练,记录实际 RTO/RPO,把文档、权限和自动化缺口转成可验收任务并复测。