线上 RAG 系统零停机重建向量库
...About 4 min
线上 RAG 系统零停机重建向量库
线上RAG系统绝对不能直接删除/覆盖正在使用的向量库,否则会导致服务报错、查询失败、业务中断。核心思路是:双库切换 + 流量无缝迁移,全程不影响线上服务。
我给你一套生产环境可直接落地的标准方案,步骤清晰、无风险、零停机。
核心原理
- 线上始终有一个可用的「活跃向量库」 提供服务
- 后台静默重建一个「新向量库」
- 重建完成后,原子切换配置/路由,让流量切到新库
- 验证无误后,再删除旧库(安全兜底)
一、准备工作(必须先做)
给向量库加「版本/别名标识」
不要用固定名字(如
rag_db),改用带版本/时间戳的名字:线上在用:
rag_v20260301重建新库:
rag_v20260327
准备独立的重建任务:使用celery 异步任务
二、零停机重建完整步骤(最安全)
步骤1:锁定当前线上活跃库(记录名称)
先确认线上正在用哪个向量库/集合,例如:
当前活跃库:rag_v1
服务配置指向这个库,全程不动。
步骤2:后台静默创建全新向量库
- 创建新库:
rag_v2 - 加载全部原始文档
- 重新分块、向量化、批量插入
- 建立索引(IVF_FLAT / HNSW 等)
关键点:
- 这个过程完全离线,不影响线上流量
- 可以做校验:数据条数、向量维度、索引状态
步骤3:新库预热 & 功能验证
新库建好后不要立刻切换,先做验证:
- 用测试接口查询新库,确保召回正常
- 检查RAG回答准确性
- 检查QPS、延迟、内存占用是否正常
步骤4:原子切换(零停机核心)
切换方式有 3 种,推荐优先级从高到低:
方法1:使用向量库官方「别名/别名路由」(最稳)
几乎所有向量库都支持 别名 Alias:
- 给线上服务配置别名:
rag_active - 别名指向旧库:
rag_v1 - 重建完成后,一条命令把别名指向新库
rag_v2 - 切换是原子操作,毫秒级生效,无断服
示例(Milvus):
utility.create_alias(collection_name="rag_v1", alias="rag_active")
utility.alter_alias(collection_name="rag_v2", alias="rag_active")
方法2:服务优雅重启(兜底方案)
如果没有别名/配置中心:
- 准备新版本服务,指向新库
- 滚动发布(先起新实例 → 流量切过去 → 再停旧实例)
- Kubernetes / 云服务 都支持滚动更新
步骤5:观察监控 + 确认稳定
切换后观察 5~10 分钟:
- 查询成功率
- 响应延迟
- 错误率
- RAG 回答准确率
步骤6:安全删除旧向量库(不要急删)
确认新库稳定运行 至少30分钟 后,再删除旧库:
rag_v1 # 旧库,可删除
三、超大数据量优化(防止重建太慢)
如果向量库上亿条、TB级,直接全量重建太慢,用这些优化:
1. 增量重建 + 全量重建结合
- 日常用增量更新(只更新变更文档)
- 每周/每月做一次全量重建(本方案)
2. 批量并行插入
- 开启多线程/多进程导入
- 向量库关闭实时索引,导入完成后再批量建索引(速度提升10~100倍)
3. 分离服务资源
- 重建用独立机器/独立队列
- 不占用线上RAG服务CPU/GPU/内存
四、严禁操作(避坑指南)
- ❌ 不要直接删除线上正在使用的向量库
- ❌ 不要直接往线上库覆盖写入
- ❌ 不要在高峰期重建/切换
- ❌ 不要不验证就切流量
五、极简流程图(一眼看懂)
线上服务 → 旧向量库(正常运行)
↓
后台创建 → 新向量库(静默重建)
↓
新库验证通过
↓
别名/配置 原子切换 → 流量切到新库
↓
监控稳定 → 删除旧库
六、生产环境推荐架构
[用户请求] → [RAG服务] → [向量库别名] → [当前活跃库]
↓
新库就绪 → 原子切换
总结
- 核心方案:双库共存 + 别名原子切换,真正零停机
- 全程线上服务不中断、不报错、无感知
- 大库优化:批量导入、离线重建、关闭实时索引
- 安全底线:先验证、再切换、最后删旧库
Powered by Waline v2.15.8