误区一:把架构图画成两地,就等于具备容灾

很多方案评审时展示了两地部署,但深入问下去会发现:数据库只是每天备份一次,密钥没有复制,DNS 切换靠人工登录控制台,队列消费者在备用区域没有启动脚本。这种架构在图上是高可用,在故障中是低可用。

容灾要定义 RTO 和 RPO。RTO 是多久能恢复服务,RPO 是最多丢多久数据。没有这两个数字,就无法判断复制频率、备用规模、自动化程度和演练投入是否合理。

目标RTO 大致要求RPO 大致要求常见方案
个人内容站小时级可接受小时级丢失版本化备份,可重建部署
一般在线服务分钟到小时级分钟级定时快照加日志复制
关键交易系统分钟级接近零持续复制、多活、自动切换

误区二:数据库能复制,状态就能恢复

应用状态不只在数据库里。对象存储中的文件、消息队列中未消费的事件、缓存中的会话、搜索索引、定时任务执行进度、外部系统回调地址,都可能影响恢复后的服务行为。

我现在的做法是把状态列成清单,并给每项标注恢复方式:可重建、需备份、需复制、可丢弃。这个清单比“我们用了托管数据库”更能说明真实恢复能力。

# 状态清单模板
database:      备份周期 / 保留期 / 恢复演练时间
object files:  版本化 / 跨区复制 / 权限策略
queue:         是否持久化 / 死信 / 重放策略
cache:         允许丢失 / 预热方式
search index:  重建耗时 / 数据来源
secrets:       复制方式 / 轮换流程
dns records:   导出备份 / 变更审批

误区三:DNS 切换很简单

DNS 切换涉及 TTL、客户端缓存、运营商递归解析、健康检查和流量比例。TTL 设置得长,故障时切换慢;设置得太短,正常状态下解析压力和稳定性又会受影响。某些客户端和库并不严格遵守 TTL,这也是常见意外。

更稳妥的方式是先在入口层做健康检查和自动摘除,DNS 只负责粗粒度调度。如果必须人工切换,要确保账号权限、操作步骤、验证指标和回滚方式写在一页纸内,而不是散落在聊天记录里。

检查方法:随机问值班同学“今晚区域不可用时,第一步做什么、看哪个指标、谁来确认切流”,如果回答不一致,演练价值已经大于继续购买资源。

误区四:演练只验证资源能启动

启动资源和恢复服务是两件事。演练至少要覆盖:从备份恢复数据、启动应用、接入流量、验证关键交易、观察监控、执行回滚。演练结束后,还应记录哪些步骤依赖人工,哪些参数只在某个人的终端里存在。

对小团队来说,可以先做季度桌面演练加半年技术演练。桌面演练检查决策链、联系方式和依赖清单;技术演练在隔离环境恢复数据并跑通关键路径。比完全不做强得多,也比追求全年多活更现实。

依赖服务也要进入容灾范围

  • 身份认证:备用区域能否验证用户,管理员能否登录。
  • 支付或回调:外部系统地址是否需要变更。
  • 邮件短信:配额、域名和发信配置是否可用。
  • 监控告警:备用环境的指标是否接入同一视图。
  • 密钥证书:能否在备用区域自动获取和轮换。

这些依赖常常是故障恢复时间的主要来源。应用容器启动只要十几秒,管理员无法认证或证书无法签发却可能消耗一小时。

一份务实的改进顺序

  1. 写下服务的 RTO/RPO 和最低可用功能。
  2. 备份 DNS、数据库、对象文件、密钥和基础设施代码。
  3. 每季度检查备份是否可恢复,而不是只看任务成功。
  4. 把启动脚本、环境变量和权限固化到版本控制。
  5. 建立一页应急手册,明确判断指标、负责人和回滚条件。
  6. 半年做一次隔离环境演练,修复人工步骤。

跨地域容灾的收益来自约束清晰的架构和重复验证的流程。资源复制只是结果,能够按预期恢复服务才是目标。