AI系统“挂了”这件事,我经历的场面不算少:模型服务超时、向量检索全部卡死、批量推理任务堆在队列里一动不动。事故群里消息狂闪,所有人都在刷“服务不可用”,但真正让人头皮发麻的往往是接下来那句——“赶紧把备机切上来,把备份拉起。”
这句话我听了太多次。对传统数据库业务来说,拉备份、切备机是一条走得通的成熟路径。但AI系统完全不是这么回事。模型权重文件、向量索引、特征配置、推理超参、运行时环境,甚至GPU驱动版本,任何一个对不上,服务都起不来,或者起来了也是错的。更麻烦的是,就算全部恢复了,你也没法像对数据库账一样直接验证——模型推理结果对不对,得拿一批固定样本跑一遍才知道。
这篇文章我想写给所有实际在搞AI系统的人。不管你是算法工程师、平台开发还是运维,只要你的系统里跑着模型推理、向量检索、批处理任务,灾备这件事你就绕不开。我会把AI系统灾备方案设计里最常见的思路、实操细节和踩坑记录梳理出来,尽量都是可以直接拿回去用的东西,不是纯概念。
1. 设计AI系统灾备方案前,先理清四类资产
1.1 AI系统比普通应用多了一层“可变资产”
传统的IT灾备,核心是数据和配置。数据库做主备复制,文件系统做快照,配置文件放进版本库,基本就覆盖了绝大多数场景。AI系统比这多出了一个很特别的东西:模型层。它是最容易被忽略、同时也是最致命的一层。
我见过一个真实事故。某推理服务的模型权重放在共享存储上,存储故障以后,运维很熟练地从备份里恢复了文件,服务也启动成功了,但线上推理结果的质量明显下降。排查到最后才发现,备份里那份模型权重是两周前的,而这期间模型刚做过一次精调,线上的效果提升全部丢了。这件事的根子就在于:普通运维同学是按“文件能跑就行”的标准去做恢复的,他根本没有意识到模型版本本身就是需要被校验的业务资产。
所以设计AI系统灾备方案,第一步不是选工具,而是把系统里需要保护的东西拆开来看。我习惯把AI系统里的资产分成四类:
- 模型资产:权重文件、tokenizer词表、推理超参配置、模型输入输出schema。
- 数据资产:训练样本、评测集、标注结果、向量数据库里的文档与索引。
- 运行环境:Python版本、深度学习框架版本、依赖包列表、GPU驱动、CUDA版本。
- 编排配置:推理服务的部署描述、路由规则、限流阈值、资源配额、监控告警策略。
只有先把资产清单列出来,后面的备份策略才有对象。很多团队偷懒,直接拿传统整机备份工具把服务器整个镜像一遍,表面上省事,实际上模型和代码混在一起,版本隔离做不好,恢复的时候反而更难定位问题,真正到切换时刻全是手忙脚乱。
1.2 状态视角:哪些服务可以无脑重启,哪些不行
第二个关键视角是“状态”。传统应用设计时大多追求无状态化,重启就能恢复。AI系统不一样,一部分服务确实可以做到无状态,比如模型推理API——请求进来,模型做前向计算,返回结果,不落本地状态。但很多AI系统的核心组件是带状态的,最典型的就是向量库。
向量索引在内存中建立后,属于“易失但重建成本极高”的状态。如果只是把磁盘上的快照恢复了,索引不一定同步,检索结果可能不完整甚至错误。还有会话型推理服务,如果上下文存在进程内,服务一重启,用户就跟“失忆”一样,而用户可不在乎你是什么原因,体验一崩,口碑就很难救回来。
我自己的做法是:把系统里的组件全部过一遍,逐项打标签,区分无状态、有状态可重建、有状态不可丢失。无状态的走容器重建;有状态可重建的(比如向量索引)优先采用“定期快照+增量同步”的组合策略,快照保证下限,增量日志缩短数据丢失窗口;有状态不可丢失的(比如业务数据库、标注库)就按标准数据库灾备方案处理。这个分类看起来基础,但能把后面所有技术决策的复杂度降低一大半。
1.3 恢复不是重启,验证逻辑完全不同
备份的意义在于恢复,而恢复是否成功的关键在于“可验证”。AI系统恢复之后的验证,比传统系统复杂得多。
数据库恢复后可以跑一致性检查、对账、抽样查询。AI服务恢复了,能启动和能用完全是两件事。模型可能加载了旧权重而不自知;向量库恢复了但最近一天新增的文档缺失;特征工程版本和模型不匹配,导致线上推理时的特征分布和训练时不一致。这些问题都不是“进程起来了”能暴露出来的。
所以我在每次灾备演练里,都强制加一步“模型质量回放”:准备一份固定的评测集,恢复完成后完整跑一遍,比对关键指标(比如精确率、召回率、检索Top5命中率)和基准值的偏差。这一步不能省。它相当于给AI灾备上了一道质量门禁,没有这道门禁,恢复动作只能算“文件还原”,不能算“业务恢复”。
2. 灾备指标怎么定:从拍脑袋到算出来
2.1 把业务切成三块:在线推理、离线任务、模型训练
AI系统灾备设计的第一步不是技术指标,而是业务分级。我通常把AI业务切成三大类,优先级完全不同。
在线推理服务,比如对话系统、推荐系统、搜索里的向量召回,这类挂了直接影响用户体验和业务收入,RTO的目标一般都压在分钟级甚至更短。离线批量任务,比如定时跑的特征计算、样本生成、报表预测,这类任务能容忍一定程度的延迟,RTO可以放宽到小时级。模型训练任务,尤其是长时间运行的大模型训练,灾难发生后最核心的是训练进度不丢,关键在checkpoint的可靠存储和多副本冗余,RTO反而不是第一优先级。
不同级别对应完全不同的投入。给在线推理做同城双活,成本高但值得;给离线任务做低成本的目标副本可能就够用;给训练任务设计的重点,是全套checkpoint的同步策略和存储保障。一上来不分级,所有业务都按最高标准设计,预算先爆掉,后面反而什么都落不了地。
2.2 先做“最慢恢复路径推演”,再定RTO和RPO
RTO和RPO这两个词大家都会说,但落到具体数字上经常是拍脑袋。我见过不少团队把RTO直接定成5分钟,一问才知道,整个体系里根本没有分钟级切换的条件,纯粹是领导拍的数字。
我的建议是先做一次“最慢恢复路径推演”。把系统里所有的依赖项列出来,从故障发生到服务恢复,把每一步的实际耗时都估算一遍:拉取备份数据要多久、加载模型权重要多久、重建向量索引要多久、预热推理缓存要多久、流量切换要多久、质量回放验证要多久。每一步都可能卡住,把这些时间垒起来,得到的才是你当前架构下真实的RTO基线,而不是凭空想出来的目标值。
RPO同理,要看数据变更的速度和容忍度。比如向量库每天的增量只有几万条文档,每小时做一次增量同步完全够用,RPO设定1小时就行。如果在线写入非常频繁,就得考虑日志级别的同步,RPO压缩到几十秒甚至更短。但RPO越短,对同步链路和存储系统的要求越高,成本也是成倍地涨。别盲目追求极限指标,业务能接受、预算能扛住,才是合理的。
2.3 用一张表明确各业务级别的目标
我习惯在灾备设计文档的前三页就放一张分级指标表,让所有人对齐,避免后面争论。参考结构大概是这样的:
| 业务类型 | 典型场景 | RPO建议 | RTO建议 | 降级策略 |
|---|---|---|---|---|
| 在线推理 | 对话、推荐、搜索召回 | 分钟级以内 | 分钟级 | 降级到更小模型+限流 |
| 离线批量 | 特征计算、报表、样本生成 | 小时级 | 小时级 | 延迟跑批+手动补跑 |
| 模型训练 | 大模型/精调训练 | 分钟级(checkpoint) | 数小时 | 从最近checkpoint续训 |
这张表每个季度至少重新审视一次。业务变了、数据量变了、模型迭代频率变了,指标也要跟着变。别把文档写完之后扔进抽屉,那是给自己看的,不是给审计看的。
3. 模型与数据备份的实操:从文件复制到可验证恢复
3.1 模型备份目录:一份能让人照做的五件套
模型文件拷贝,谁都会。但真正能用于灾备恢复的模型备份,至少要包含五样东西:权重文件、tokenizer配置、模型配置文件、依赖版本清单、训练参数记录。
为什么依赖版本那么重要?我踩过坑。某次恢复时,权重文件是好的,但恢复环境里的深度学习框架版本比导出时高了一个小版本,加载模型直接报结构不兼容的错误,一堆莫名其妙的报错信息。最后折腾了几个小时重建环境,才把服务拉起来。这个时间如果发生在灾备窗口里,就是事故叠加事故。
所以我推荐每个模型版本都做成一个独立目录,里面的内容如下:
models/20250101_finetune_v3/ ├── model.weights ├── tokenizer.json ├── config.json ├── requirements.txt ├── train_meta.json └── eval_report.jsonrequirements.txt记录环境依赖,train_meta.json记录训练数据范围、超参数、精调基线,eval_report.json记录当时的评测结果。有条件的话,把模型上传到对象存储并开启版本管理,设置合理的保留周期。我一般保留近30天每小时快照和近90天每日版本,具体节奏跟着模型迭代频率走,迭代快就多保留几档,迭代慢就可以放宽。
3.2 向量库同步与恢复:快照加日志的组合拳
向量库是AI系统灾备里最棘手的一块。它的数据不只包含原始文本,还包括embedding结果和索引结构。索引重建的耗时非常高,尤其是百万级以上的向量,光重建就可能要几十分钟甚至更久,这对RTO是致命的。
实操策略是一套组合拳:定期做全量快照,作为恢复基线;同时持续把增量变更日志同步到灾备端;恢复时先加载最近的基线快照,再按时间顺序回放增量日志。这样做下来,RPO能压到数据写入延迟级别,RTO也能控制在加载快照和回放日志的总耗时以内。
我有一次做线上向量库恢复演练,源端有大约千万级向量,全量快照恢复大概花了十几分钟,增量日志回放只用了两分多钟,整体RTO落在20分钟以内,基本符合业务预期。这里要特别提醒:向量库恢复完成后,一定要做两层校验。第一层是文档数校验,对比源端和备端的文档总量是否一致;第二层是抽样查询校验,随机抽几篇文档做一次向量检索,看召回结果是否合理。很多人把备份做完就以为万事大吉,结果恢复完过了几天才发现少了一段增量,那才叫欲哭无泪。
3.3 数据分级存储与保留周期怎么设计
AI系统里的数据量通常很大,训练样本、中间特征、向量数据、线上日志,不可能无限期全量保留。我的经验是按“价值密度”分级。
第一类是核心标注数据、评测集、线上关键特征,这类数据丢了很难重建,必须做多副本冗余,并且放在可靠性更高的存储上。第二类是中间产物,比如训练过程中的临时特征文件,属于可再生物,保留一份做短期留存就够了。第三类是可再生数据,比如原始日志转储,放低成本对象存储,按合规要求保留一段时间后删除即可。
备份保留周期也要和业务节奏挂钩。模型每月精调一次,模型快照保留月级就够用;向量库每天有持续新增,那就按“近7天每小时快照+近90天每日快照”的节奏做;如果某个业务上线了大版本迭代,那在迭代前强制增加一个手动快照,别依赖自动周期。自动快照永远覆盖的是常规场景,关键节点要靠人来补。
4. 推理服务与训练任务的高可用落地
4.1 多活、主备、冷备:三种模式怎么选
AI系统的高可用方案,核心是分场景选型。我用一个很朴素的标准来判断:这个服务挂了,业务损失有多大,用户能不能等。
在线推理服务,我推荐多活。把推理服务做成无状态容器,多副本部署在不同可用区,前端负载均衡按健康检查做流量分发。某一个副本挂了,流量自动转发到健康副本,用户几乎无感。这里最核心的前提,是服务必须真的无状态,否则一切免谈。
关键离线任务,用主备加自动重试。调度器记录每个任务的执行状态,主链路失败后自动切换到备用计算资源重新执行。离线任务的用户感知是延迟而不是中断,所以不追求秒级切换,但一定要保证任务最终能跑完。
模型训练任务,重点是checkpoint多副本。训练过程中持续把checkpoint同步到独立存储,或者定时拷贝到对象存储,避免训练节点故障导致进度全部归零。训练跑一整天,结果一个节点宕机全没了,这种痛经历过一次就再也不想经历。
4.2 无状态化改造是推理服务高可用的前提
很多AI推理服务一开始设计的时候没有做无状态化,请求上下文和结果缓存都存在进程内存里。这时候谈多活和灾备,基本是无解——流量一切,用户之前的会话上下文全没了,体验断崖式下跌。
我的经验是:把所有需要跨请求保留的信息外置到独立存储,比如Redis、数据库或对象存储,推理服务本身只做计算,不保有状态。缓存可以加,但要接受重建的代价,而且最好放在共享缓存层而不是本地进程里。
这个改造短期会引入一些性能开销,多一跳网络访问,但长期看,它是多活架构和灾备切换能跑通的基础。我常说一句话:无状态化改造是AI系统高可用设计里最不性感、但最值钱的一步。没有这一步,后面所有高可用设计都是在沙滩上盖城堡。
4.3 降级策略:恢复不了全貌时,先保住核心
灾备方案里最高境界不是完美恢复,而是可控降级。设计阶段就要想清楚:如果备端资源不足,哪些功能可以关掉,哪些功能可以简化?
举个例子,向量检索支撑不住全量数据的时候,可以先退化为“标签过滤+倒排召回”模式,牺牲一部分召回率,但保住基本可用性。模型推理压力大的时候,可以降精度——切换到量化模型,能省不少显存;再不行就限流,让有限资源优先服务重要用户;极端情况下甚至可以给部分请求返回缓存结果,保证系统不雪崩。
降级策略一定要提前写进系统配置,最好做成开关,切换的时候一键生效,而不是临时开会让一群人围在屏幕前改参数。我见过太多现场“人肉降级”的场景,十几个工程师同时改配置,结果互相覆盖,越改越乱。预案这种东西,只有写下来、验证过,才有价值;存在于脑子里的预案,等于没有预案。
5. 灾备演练和故障排查:把文档变成能救命的真方案
5.1 每季度做一次故障注入演练,别让方案只活在PPT里
灾备方案如果从未演练过,本质上等于没有方案。每年写份文档然后束之高阁,真出了事指望这份文档救火,那纯属心理安慰。
我强烈建议每个季度至少做一次随机故障注入演练,哪怕只是在隔离环境。演练至少要覆盖这几个点:备端环境能否快速拉起、数据同步链路是不是卡在某个时间点、模型质量回放是否通过、流量切换是否平滑、复盘文档有没有按时更新。
演练的时候不要客气,故意制造乱子。比如把同步链路断掉几个小时再恢复,看看系统能不能自动追平;比如把备份存储的权限改掉,看看恢复脚本会不会因为权限问题直接挂掉。演练中暴露出来的问题,才是这套方案里真正值钱的东西。平时发现越早,真出事的时候代价就越小。
5.2 常见问题速查:我踩过的坑,你绕着走
以下这个表里记录的都是我在实际灾备建设和演练中踩过的坑,看到就能少走弯路:
| 问题表现 | 根因 | 排查思路与解法 |
|---|---|---|
| 备端恢复后模型精度下降 | 备份里的权重不是最新版本 | 恢复后必须跑固定评测集,比对指标偏差,确认没问题再放流量 |
| 服务起来了但推理报错 | 框架版本或依赖与模型不兼容 | 模型备份时连同依赖清单一起固化,恢复时按蓝本重建环境 |
| 向量库恢复后缺数据 | 增量日志丢失或未同步 | 恢复后先做文档数校验,再做抽样查询校验,两层缺一不可 |
| 流量切换后会话全部丢失 | 上下文存在进程内存里 | 提前做无状态化改造,或把会话状态外置到独立存储 |
| 自动切换导致误切 | 健康检查策略太粗糙 | 增加多维度健康检查(进程、接口、依赖),提高误判阈值 |
| 备份存储被误删 | 备份和源共用同一份存储 | 灾备存储独立隔离,权限最小化,一次操作二次确认 |
每次看到团队里有人在同一个坑里反复栽,我都想强调:灾备不是做完就“毕业”了,它是一个持续运转的体系。每一次故障和演练的复盘,都会让这个体系往更稳的方向走一步,前提是你真的把问题闭环掉,而不是记完笔记就继续下一个需求。
5.3 演练汇报模板:证据、问题清单、改进项
我要求每次演练输出三样东西,缺一不可。证据,也就是截图、日志、监控曲线,确保所有结论有据可查。问题清单,标注好严重级别,哪些是阻断性的必须立即修复,哪些是优化项可以排期。改进项,精确到谁来做、什么时候做完。
复盘会上不要讲故事,只看事实。某个环节耗时超预期,那要看具体是哪个依赖项拖慢的,把这个依赖项单独拎出来专项优化。某个校验指标没过,那就追溯到数据源头,修复完重新跑一遍再闭环。复盘的价值不在于总结,“这次演练很顺利”没有任何意义,真正有意义的是找到那个“下次可能让你翻车”的点。
我个人在实际操作中最深的体会是:AI系统灾备方案的复杂性,往往不在技术上有多难,而在业务优先级、资产清单和验证标准这三个问题有没有在设计最前期对齐。把这三个问题想清楚,技术选型自然而然就浮出来了;反过来,一上来就选工具、配存储,后面大概率会陷入“备份倒是有了,恢复却恢复不了”的尴尬局面。
最后再分享一个小技巧。每次做季度演练的时候,故意换一个人来当现场指挥。这样做的好处是避免整套方案过度依赖某一个人——有的人熟悉模型部署,有的人熟悉数据链路,但真正出大事的时候,需要的是一个对全局都清楚的人。轮换几次之后,你会发现整个团队对这套体系的理解深度明显上了一个台阶。到这个时候,灾备方案才算是真正“活”起来了。