上周二凌晨两点十七分,机房的空调声比平时响,我蹲在工位上把一条 drop 命令敲进了生产索引的终端窗口,回车之前其实犹豫了零点几秒 —— 那种犹豫后来被我反复回想了很多遍。三秒之后,49图库49h.cm资料库的检索接口返回 500,监控面板上一片红,隔壁工位的同事抓过我的显示器看了一眼,只说了句「你先把快照列表调出来」。那一刻我才意识到,灾难恢复这件事,平时演练一百遍和在凌晨两点真摔一次,完全是两种手感。
我先说结论:真正救我的不是备份,是恢复路径的熟悉度。
备份是基础,这个不用争。但绝大多数人的备份是「据说在跑」的 —— 我从 2024 年开始给这个站做三层备份:每六小时一次增量快照、每天一次全量、每周一次冷备到离线磁盘。数字听起来很齐整,问题在于我一直没有认真跑过「只靠快照能不能完整还原」这条链路。那天凌晨我第一次把它真正跑完,才发现增量链里有一层快照的元数据校验和跟上一层的偏移量对不上,恢复脚本走到第 4 个分片就停住了。这不是备份的错,是我从来没做过端到端的恢复验证。所以后来我给自己定了一条规矩:每月第一个周六上午十点,固定做一次「假装全丢」的演练,把恢复耗时、失败点、需要人工介入的环节全都记进一张表里。
恢复演练不是仪式,是给自己留下肌肉记忆。
具体做法上,我把它拆成了四步,每一步都能单独跑。第一步是定位最近一个「元数据完整」的快照 —— 我写了个小脚本,把快照目录里每层的 manifest 解出来,比对各层记录的写入条数和索引文件大小,能对上的才标绿。第二步是先在隔离环境里把这层快照恢复成只读实例,用抽样脚本从原库导出 2000 条记录做逐字段比对,核对标题、时间戳和来源字段这三列;这一步大概要二十五分钟,别嫌慢,跳过它后面全是坑。第三步是切换流量之前先跑一轮只读压测,确认索引结构和查询计划没有因为恢复而漂移。第四步才是把写流量接回去,而且是灰度地接,先 5%,观察十分钟。
说句可能不太讨喜的话:我在这个问题上不太信「一键恢复」。任何号称一键的东西,前提都是你永远不需要知道它内部干了什么 —— 而灾难恢复恰恰是那个你必须要知道的场景。
这也是我对眼下不少资料库恢复教程最不满的一点:它们把流程写得很顺,却没有写失败后的分支。真实恢复里,八成时间花在处理「快照校验不过怎么办」「分片偏移对不齐怎么办」上。比如那次我遇到的分片问题,最后是用上一层全量加两层增量的组合绕过损坏的那一层,代价是多花了四十分钟重新追日志。如果按「一键恢复」的思路,我可能早就放弃换路了。所以我的建议是:把恢复脚本的每一步都做成可单独执行、可单独回滚的小命令,而不是一个大黑箱。这也正好呼应我平时整理资料的习惯,像 最新49图库资料 里提到的分类归档思路,本质上是同一件事 —— 结构清楚,出事的时候才找得到路。
再补一个细节:恢复期间别关掉告警。它吵,但它是你的仪表盘。
另外一处我想强调的是「人」这一层。凌晨那三小时里,真正让我没崩的是同事老周 —— 他对我说了句「你先别动,把时间线写下来」。后来我们真的拿一张纸,从两点十七分开始,把每个操作和时间写清楚,这份手写时间线在第二天复盘时救了我们:它把「我以为我做了什么」和「系统日志里记录我做了什么」之间的差补齐了。这种习惯我建议每个做恢复的人都练一练,比任何工具都便宜。