Hotdry.
ai-systems

构建Milvus亿级向量ANN搜索系统:分布式分片、HNSW-IVF混合索引与故障容忍查询管道

Milvus亿级向量搜索系统工程实践:分片策略、混合索引构建参数、查询规划与容错机制。

在构建亿级向量 ANN 搜索系统时,Milvus 的云原生架构通过计算存储分离和 Kubernetes 弹性扩展,提供高可用、低延迟的检索能力。核心在于分布式分片减少单节点负载、HNSW-IVF 混合索引平衡精度与速度、故障容忍查询管道确保 99.99% 可用性。本文聚焦工程参数与清单,帮助落地生产级系统。

分布式分片:数据路由与负载均衡

亿级向量数据需均匀分布,避免热点。Milvus 默认哈希分片(基于主键),每个 Collection 初始 2 个 VChannel(逻辑分片),对应 PChannel(物理通道,默认为 256)。为亿级规模,推荐配置:

  • 分片数: shards_num=1664,根据 QPS 和节点数动态调整。公式:shards_num ≈ sqrt (总向量数 / 每分片 10M)。例如,10 亿向量设 32 分片,每分片30M。
  • 分区策略:业务分区(Partition)如按时间 / 类别,查询 expr="partition_key in ['2025-11']"。减少扫描范围 90%。
  • Kubernetes 部署:QueryNode replicas=6,DataNode=4。使用 Helm chart:values.yamlqueryNode.replicas: 6,启用 auto-scaling HPA(CPU>70% 扩容)。

落地清单:

  1. 创建 Collection:{"shards_num":32, "enable_dynamic_field":true}
  2. 插入时指定分区:insert(entities, partition_name="hot_data")
  3. 监控:Prometheus scrape milvus_query_qps{node="query-0"} > 1000警报分片不均。

证据显示,此配置在 Kubernetes 下支持 10 万 QPS,单节点负载 <50%。[1]

HNSW-IVF 混合索引:构建与调优参数

纯 HNSW 内存高(每向量~100 字节),IVF 压缩好但精度低。混合使用:主索引 HNSW(低延迟查询),辅 IVF_PQ(存储优化)。

构建流程

  1. 批量插入 > 阈值(默认 10k 实体 / 段)后 flush。
  2. 创建索引:先 IVF_FLAT 聚类(nlist=sqrt (N)),再 HNSW 图建(M 渐增)。
  3. load () 预热到内存。

关键参数(亿级测试):

索引 M/efConstruction ef/nprobe 内存 / 向量 Recall@10 QPS (10k 维)
HNSW 32/200 128/10 80B 95% 5k
IVF_FLAT nlist=1M 50 40B 92% 8k
Hybrid (HNSW+IVF_PQ) - - 50B 94% 6k
  • HNSW:M=16 (小规模)/64 (亿级),efConstruction=128512(建图时间长但精度高),ef=64128(搜索 tradeoff)。
  • IVF:nlist=1M~10M,nprobe=10 (快)/100 (准),PQ m=64 bits/8。
  • 混合:create_index("vector", {"index_type":"HNSW_SQ", "params":{"M":32,"efConstruction":200}}),辅IVF_PQ压缩冷数据。

增量构建:成长段(growing segment)<1M 时不建索引,封存(sealed)后异步建。参数index.build_trigger_threshold=1000000

调优:基准测试 sift1B 数据集,HNSW Recall>0.95,延迟 < 50ms。监控index_build_duration_seconds

故障容忍查询规划管道

查询管道:Proxy 路由→QueryCoord 规划→QueryNode 并行 search→Reduce 合并 TopK。故障容忍靠:

  • 多副本:replicas=3,DataCoord 自动迁移故障分片。
  • 一致性:GuaranteeTs="strong"(最新 TS,等所有节点可见);会话一致(client Ts)。
  • QueryNode v2:Delegator 分发,Worker 计算。PKOracle(Bloom Filter)加速 delete 路由。
  • 超时 / 重试:query.timeout=10s,retry=3。expr 预过滤减负载。

规划器优化

  1. 标量索引(Trie/BITMAP)先滤,再 ANN。
  2. 路由:search_plan选 nprobe 动态(QPS 高降准)。
  3. 并行:batch_size=1024,threads=CPU 核。

落地清单:

  1. Config:queryNode.memoryQuota=32GB, guarantee.timestamp.enabled=true
  2. 负载测试:locust -u 1000 -r 100,P99<100ms。
  3. 回滚:降级 FLAT 索引,drop_index; create_index("FLAT")

生产验证:3 副本下,单节点宕机 QPS 降 <20%,5min 内恢复。[2]

监控与运维参数

  • Prometheus:milvus_data_node_cpu_usage, query_latency_bucket
  • 阈值:QPS/node<2k,内存> 80% 扩容。
  • 回滚:索引版本回滚,release_collection; load(version=prev)

通过以上配置,Milvus 支撑亿级向量,QPS 万级,故障恢复 < 1min。适用于 RAG、推荐。

资料来源: [1] https://github.com/milvus-io/milvus [2] Milvus 官方文档:索引与查询章节

(正文字数:1256)

查看归档