备份成功不等于系统可恢复。BitzOrcas 的业务事实、对象、消息进度、Data Protection 密钥环和配置彼此有关,恢复方案必须把它们放在同一时间线中验证。
关键路径图
下图展示了系统高可用容灾与灾难恢复(DR)架构:包含主从数据库实时复制、异地冷备、故障自动切换与 RPO/RTO 保障机制。
先定义目标
- RPO:故障后最多允许丢失多少数据;
- RTO:从宣布灾难到恢复核心服务允许多久;
- 恢复范围:单租户、单库、区域级还是供应商级故障;
- 一致性点:数据库、对象和消息怎样回到可解释的共同时间点。
不同数据可以有不同目标,但客户承诺必须以最慢、最难恢复的关键依赖为准。
需要保护的资产
| 资产 | 最低要求 |
|---|---|
| SQL Server/PostgreSQL | 全量 + 日志/增量备份,定期恢复到隔离环境 |
| S3/MinIO | 版本、生命周期、跨区域或离线副本;记录对象与数据库引用关系 |
| Redis | 区分可丢缓存与不可丢 Data Protection 密钥环、幂等状态 |
| RabbitMQ/CAP | 持久化、死信和积压监控;恢复后允许重投并依赖幂等 |
| 配置与 Secret | 版本化配置、Secret 重新签发能力和访问审计 |
| 发布制品 | 镜像、包、SBOM、provenance 和数据库迁移同版本保存 |
推荐恢复顺序
- 冻结写入并记录故障时间、最后可信提交和消息位置。
- 恢复网络、Secret、数据库和 Data Protection 密钥环。
- 恢复对象存储并执行引用完整性检查。
- 以受控消费速率恢复 Broker、CAP 和后台任务。
- 启动只读验证,检查租户隔离、认证、关键查询和工作流状态。
- 恢复写入并监控重复消息、缓存重建、计数漂移和通知积压。
数据库恢复早于对象或消息并不自动安全。删除、工作流完成和集成事件可能需要重放或补偿,必须预先写出判断规则。
演练验收
- 使用生产同级加密备份,而不是开发快照;
- 恢复到全新环境,避免依赖原机器残留;
- 测量真实 RPO/RTO,并记录人工步骤;
- 抽查多个租户、跨日期数据、文件下载、登录、审批和通知;
- 演练后把发现转为自动化、监控或明确的风险接受。
SQL Server 备份与验证
源码提供 BitzOrcas.DatabaseMaintenance,支持 Full、Differential、Log、VERIFYONLY 和带确认的 Restore。备份目录必须同时被 SQL Server 进程与 CLI 看见;远程数据库不会自动把文件下载到运行 CLI 的机器。
# ① 生成全量备份;连接串来自受控运维身份。dotnet run --project src/Tooling/BitzOrcas.DatabaseMaintenance -- \ --backup-database --backup-type Full \ --connection "$DB_MAINT_CONNECTION" --backup-dir "$BACKUP_DIR"
# ② VERIFYONLY 只证明备份集可读,不能代替真实恢复和应用 smoke。dotnet run --project src/Tooling/BitzOrcas.DatabaseMaintenance -- \ --verify-backup --connection "$DB_MAINT_CONNECTION" \ --backup-dir "$BACKUP_DIR" --backup-file "$BACKUP_FILE"SIMPLE recovery 下日志备份会以退出码 0 返回 Skipped=true。自动化必须监控 skipped 状态,否则会在没有日志链时误报备份健康。
隔离恢复演练
# 仅对隔离实例执行;Restore 使用 WITH REPLACE 且没有 dry-run。dotnet run --project src/Tooling/BitzOrcas.DatabaseMaintenance -- \ --restore-database --connection "$ISOLATED_RESTORE_CONNECTION" \ --backup-dir "$BACKUP_DIR" --backup-file "$BACKUP_FILE" \ --database BitzOrcas_RestoreDrill --confirm RESTORERestore 前工具会创建 pre-restore full snapshot;若后续恢复失败,该 snapshot 会保留。操作者必须记录部分状态,并验证目标实例的外部连接、Broker、邮件、Webhook 全部不会指向生产。
恢复后的业务核对
| 范围 | 核对 |
|---|---|
| 身份与租户 | 多租户登录、权限、跨租户拒绝 |
| 文件 | 数据库引用与对象版本一致,可下载 |
| 消息 | Outbox/Inbox 状态、积压、重复消费 |
| 工作流 | 运行实例、待办、Timer、时间线 |
| 审计 | 当前及跨时间桶记录完整 |
| License/密钥 | DeploymentId、缓存、Data Protection 可用 |
演练报告
报告记录故障假设、备份链、Hash、SQL 版本、开始/结束、实测 RPO/RTO、人工步骤、失败点、数据抽样和 Owner。恢复成功但超过客户 RTO 仍是不通过。
完成清单
- 备份、VERIFYONLY 与真实 Restore 是三份独立证据;
- 数据库、对象、消息、密钥和配置的时间点可解释;
- 隔离环境不会发送生产副作用;
- 恢复后执行多租户、文件、工作流、审计和消息 smoke;
- 演练发现进入自动化 backlog 并有完成日期。
下一次演练日期、Owner 和未关闭风险必须进入同一报告,避免一次成功被永久当作恢复能力。