在构建亿级向量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)