用恢复演练记录实测 RPO 与 RTO 并写复盘
目标
在备份副本清单中找出违反 3-2-1 的,用备份作业记录和故障记录测出实际的数据丢失时间(RPO)和恢复时间(RTO)并与目标比较,把恢复出来的数据与清单对照,然后撰写不追究个人责任的事后分析和有负责人、期限的改进措施。
为什么重要
“RPO 1 小时、RTO 90 分钟”只是文档中的目标。如果备份一直在悄悄失败,实际损失就会是几倍;如果只测恢复命令的时间,检测和决策所花的时间就漏掉了。恢复演练就是把这个差距用数字暴露出来,而事后分析是把这些数字变成下一次改进的文档。一旦开始写是谁错了,事实就会被隐瞒,条件依然留在那里。
材料在 /opt/lab/capacity/dr/ 中,评分器根据原始材料计算期望值。
步骤
- 把
/opt/lab/capacity/dr/中的全部内容复制到/root/dr/。 - 把违反 3-2-1 规则(3 份副本、2 种介质、2 个地点)的数据,以
violations=写到/root/dr/01-321.txt。 - 在
/root/dr/02-rpo.txt中写入last_good=、loss_min=、meets_rpo=。 - 在
/root/dr/03-rto.txt中写入rto_min=、meets_rto=、longest_phase=。 - 把恢复出来的数据与
MANIFEST.sha256对照,在/root/dr/04-verify.txt中写入missing=、mismatch=。 - 在
/root/dr/postmortem.md中写摘要、影响、时间线、根本原因、改进措施五节(时间线六个时刻,影响中的两个数字,不含负责人姓名的根本原因)。 - 写出三条以上改进措施,每条都附上
담당:和기한: YYYY-MM-DD(韩文,依次意为“负责人”“期限”),并且要涵盖检测、备份、3-2-1 的缺口。
参考
- 时间计算:
datetime.strptime(s, '%Y-%m-%d %H:%M'),两个时刻之差.total_seconds() // 60。 - 恢复验证:
cd restored && sha256sum -c MANIFEST.sha256。 - 常见错误 1:把失败的备份当作 last_good——那是无法恢复的点。
- 常见错误 2:把 RTO 从恢复开始算起——对用户来说,服务从故障那一刻起就停了。
复制材料
把 /opt/lab/capacity/dr/ 中的全部内容(包括 restored/ 目录)复制到 /root/dr/。
整个目录一起搬要用 cp -r。请先读 incident.log 和 backup_jobs.log。
检查 3-2-1 规则
查看 backups.json 中每份数据的副本列表(含原件),把违反副本 3 份以上、介质(media)2 种以上、地点(site)2 处以上中任何一条的数据,以 violations=<이름들, 쉼표로>(占位符为以逗号分隔的名称)写到 /root/dr/01-321.txt。
对每份数据统计 len(副本)、不同 media 的个数、不同 site 的个数。同一地点的三个快照,即使有三份副本也违反规则。
实际数据丢失时间
根据 incident.log 的 failure 时刻和 backup_jobs.log,在 /root/dr/02-rpo.txt 中写三行:last_good=<장애 이전에 OK 로 끝난 마지막 백업, YYYY-MM-DD HH:MM>、loss_min=<장애 시각 − last_good, 분>、meets_rpo=<targets.env 의 RPO_MIN 이하면 yes, 아니면 no>(占位符依次为:故障之前以 OK 结束的最后一次备份;故障时刻减去 last_good 的分钟数;不超过 targets.env 中 RPO_MIN 则为 yes,否则为 no)。
是最后一次成功的备份,而不是最后一次备份。以 FAILED 结束的作业不能成为可恢复的点。
实际恢复时间与最长的区间
根据 incident.log,在 /root/dr/03-rto.txt 中写三行:rto_min=<failure 부터 verified 까지, 분>、meets_rto=<RTO_MIN 이하면 yes, 아니면 no>、longest_phase=<detect·decide·prepare·restore·verify 가운데 가장 긴 구간>(占位符依次为:从 failure 到 verified 的分钟数;不超过 RTO_MIN 则为 yes,否则为 no;detect、decide、prepare、restore、verify 中最长的区间)。各区间依次是 failure→detected、detected→declared、declared→restore_start、restore_start→restore_end、restore_end→verified。
不只是恢复命令运行的时间,而是从故障开始的那一刻算起。对用户来说,服务从那时起就停了。
验证恢复出来的数据
把 /root/dr/restored/ 中的文件与 MANIFEST.sha256 对照,在 /root/dr/04-verify.txt 中写两行:missing=<목록에는 있는데 복원본에 없는 파일, 쉼표로>、mismatch=<있지만 해시가 다른 파일, 쉼표로>(占位符依次为:清单中有但恢复出来的数据里没有的文件,以逗号分隔;存在但哈希不同的文件,以逗号分隔)。
在 restored 目录中运行 sha256sum -c MANIFEST.sha256,每个文件会给出 OK、FAILED 或不存在。即使以错误结束,也要把输出读完。
不追究个人责任的事后分析
撰写 /root/dr/postmortem.md。必须有 ## 요약、## 영향、## 타임라인、## 근본 원인、## 개선 조치(韩文,依次意为“摘要”“影响”“时间线”“根本原因”“改进措施”)五节。时间线中要把 incident.log 的六个时刻全部抄入,影响中要用数字写出第 3、4 步测得的实际损失分钟数和恢复分钟数。根本原因中不要写负责人的账号名称,而要写引发故障的条件和拖慢恢复的条件。
不写是谁失误了,而写让那个人只能那样做的条件(没有告警、没人看余量)。改进措施一节可以在第 7 步再填,但节标题现在就必须有。
有负责人和期限的改进措施
在 postmortem.md 的 ## 개선 조치(韩文,意为“改进措施”)一节中,写三条以上以 - 开头的条目。每条都必须有 담당: <누구> 和 기한: YYYY-MM-DD(韩文,依次意为“负责人”“期限”;占位符为负责人),并且针对这起事件暴露出的三个缺口——检测(告警)、备份(失败悄无声息)、3-2-1(第 2 步找到的违规)——每个至少有一条措施。
没有负责人的措施没有人会去做。比起“备份失败时告警”,“最后一次成功的备份超过 N 分钟就告警”连作业根本没有运行的情况也能抓到。