在 AI 应用中,向量相似性搜索已成为核心组件,如推荐系统、RAG 检索和多模态搜索。生产级近似最近邻(ANN)系统需同时满足高吞吐量(QPS 数万)、低延迟(P95 亚毫秒)和高召回率(>95%),同时支持动态数据更新和持久化。本文聚焦单一技术点:通过混合内存 - 磁盘索引、WAL 持久化与背景合并,实现可靠的生产部署。
混合内存 - 磁盘索引架构
传统纯内存 ANN(如 HNSW)受限于 DRAM 容量,无法处理亿级向量。生产系统采用混合架构:热数据驻留内存,冷数据落盘 SSD。
- 内存层(Hot Index):使用 HNSW 或 IVF-PQ 存储最近活跃的前 10%-20% 向量(数百万级)。参数建议:HNSW 的 M=16-32(出边度),ef_construction=200,确保构建质量;搜索时 ef_search=64-128,平衡延迟与召回。
- 磁盘层(Cold Index):采用 DiskANN 或 SPANN 图索引,节点连续布局优化顺序读。内存仅缓存顶层路由表(<1% 数据)和热门节点。查询流程:先内存粗搜得半径界,限读 SSD 4-8 页精炼 top-k。
- 分层路由:维护分片元数据表,查询根据向量哈希或租户路由到分片。每个分片独立混合索引,避免单点瓶颈。
此设计确保 90% 查询纯内存服务,尾部延迟 < 1ms。Big ANN Benchmarks 中,顶级系统如 Pinecone 在过滤搜索 track 达 85k QPS@90% recall。
动态增删机制
生产环境数据实时变动,需支持每秒万级 upsert/delete,同时不中断查询。
- 写路径:增删操作先追加 WAL(Write-Ahead Log),再更新内存 delta 索引(小 HNSW,<1M 向量)。WAL 条目:{op: insert/delete, id, vector (compressed), timestamp, payload}。组提交每 10ms 或 1k 条 fsync,吞吐 > 10k ops/s。
- 可见性:新向量立即入 delta,查询 union (主索引 + delta - tombstones)。删除用 tombstone 位图内存驻留,按分段稀疏数组。
- 内存限流:delta 超阈值(e.g., 5% 总规模)触发 flush:从 WAL 重建小段落盘,原子替换主索引 manifest。
此 LSM-tree 风格避免锁争用,写延迟 < 1ms。
WAL 持久化与故障恢复
耐久性是生产关键。WAL 确保 0 数据丢失。
- WAL 实现:循环多文件(每个 1GB),压缩 vector(PQ 64 维)。Checkpoint 间隔 1h:dump 内存索引 + manifest 快照,截断前 WAL。
- 恢复流程:启动加载最新 checkpoint,重放后 WAL 重建 delta(<5min)。分片副本异步复制 WAL,RPO<1s。
- 参数:fsync_interval=10ms, wal_size=1GB, snapshot_threshold=1h。监控 WAL 积压(lag<100ms)。
开源如 RocksDB 启发,但 vector 需自定义序列化。
背景合并与优化
避免碎片与召回衰减,背景线程执行:
- 段合并:选删除率 > 30% 或年龄 > 1 天的冷段,读存活向量重建新 HNSW/DiskANN 段。合并因子 4-8,off-peak 执行,限 CPU<20%。
- 热冷迁移:LFU 缓存追踪访问,热门向量 promote 内存(阈值 QPS>1k / 向量)。分布漂移时重训 PQ 码本(周频)。
- 质量维护:ef/M 参数自适应,shadow 流量测真实召回,目标 > 95%。如召回降 < 97%,增 ef_search+20%。
合并在线:manifest 版本控制,查询见一致视图。
性能调优与监控要点
达标高 QPS 低延迟:
- 硬件:NVMe SSD (IOPS>1M),DRAM > 索引规模 2x,AVX512 CPU。分片 per-node 10M 向量。
- 查询优化:SIMD 距离核,协程 overlap I/O-CPU。限访邻数:HNSW max_layer=64,disk_pages=8。
- 监控:Prometheus 指标:p95_latency<0.8ms, qps>50k/node, recall@95%>0.97, wal_lag<50ms, merge_queue<10。警报:tail_lat>2ms 或 recall<0.95,回滚参数。
- 回滚策略:manifest 版本回退,A/B 流量测试新索引。
落地清单:
- 选库:hnswlib (内存)+diskann (盘),自建 WAL。
- 分片:一致哈希,RF=3。
- 初始建索引:bulk load 并行,12h 限。
- 测试:BigANN 数据集,调至 QPS@recall 目标。
- 部署:Kubernetes,HPA on QPS。
Jashwanth Thatipamula 在 HN 分享生产 ANN 经验:强调内存足迹、剪枝与近似精确混合,避免维度诅咒。
此实践已在亿级向量系统验证,可直接落地扩展。
资料来源: