Files
ai-ticket-platform/docs/operations/recovery-drill-2026-07-27.md
2026-07-27 19:08:08 +08:00

2.7 KiB
Raw Blame History

隔离恢复演练记录(2026-07-27)

结论

状态:通过

PostgreSQL 与 MinIO 已在独立 Docker Compose 项目中完成一致性备份、破坏和恢复。恢复后, 工单、附件元数据与对象内容均可读取,Django 系统检查通过。演练没有复用或修改现有开发 容器、网络和数据卷。

演练环境

  • Docker Engine:29.6.1
  • Docker Compose:5.3.0
  • PostgreSQL:pgvector/pgvector:pg16
  • MinIO:minio/minio:latest
  • 归档辅助镜像:alpine:3.21
  • 隔离 Compose 项目:ai-ticket-restore-drill-5124
  • 备份编号:20260727T092235Z
  • 总耗时:106.57 秒

执行步骤与证据

  1. 启动独立 PostgreSQL 与 MinIO 数据卷,构建当前后端镜像。
  2. 执行所有 Django 迁移与治理基线初始化。
  3. 创建工单 RESTORE-DRILL-001、关联附件元数据和 MinIO 标记对象。
  4. 生成 PostgreSQL custom-format dump、结构清单、MinIO 数据归档及 SHA-256 清单。
  5. 删除演练工单与 MinIO 对象,确认进入破坏后状态。
  6. 校验备份哈希,重建数据库并恢复对象存储数据。
  7. 通过 Django ORM 验证工单及附件关系,通过 mc cat 验证对象内容。
  8. 执行 python manage.py check,结果为 0 个问题。
  9. 销毁本次演练的容器、网络、数据卷和临时后端镜像。

最终自动化结果:

{
  "status": "passed",
  "backup_id": "20260727T092235Z",
  "duration_seconds": 106.57,
  "database_smoke": "ticket_and_attachment_restored",
  "object_storage_smoke": "marker_restored",
  "django_check": "passed"
}

演练中发现并修复的问题

  • Windows PowerShell 缺少 sh,已增加与 Linux 脚本等价的备份、校验和恢复入口。
  • Windows 原生命令参数可能改变多行脚本编码或引号,隔离演练改用无引号 UTF-8 字节表达式。
  • 当前 MinIO 镜像不包含 tar,对象归档与恢复改由固定辅助容器挂载同一数据卷完成。
  • 生产备份默认冻结当时正在运行的 backend、worker 与 beat,并在退出时恢复原运行集合, 避免 PostgreSQL 和 MinIO 分别快照期间继续发生跨存储写入。
  • 对象卷归档和覆盖期间显式停止 MinIO,只有 MinIO 重新通过健康检查后才恢复业务服务, 避免从活跃数据卷读取或在运行进程下替换存储文件。
  • Linux 恢复脚本增加跳过应用服务启停的隔离演练开关,避免演练误启动业务进程。

仍需生产执行

本记录证明当前代码和脚本能够恢复一致的数据库与对象数据,不替代生产环境的定期演练。 上线前仍需使用真实加密异地备份、正式告警接收方和业务账号执行完整登录、渠道、Agent 与附件下载冒烟,并记录生产 RTO/RPO。