Hotdry.
ai-systems

Milvus DiskANN 混合索引与动态分片:亿级 ANN 搜索延迟优化

Milvus 云原生向量数据库,利用 DiskANN 磁盘混合索引、动态分片和多向量过滤,实现亿级规模 ANN 搜索的低延迟和高吞吐工程参数。

在亿级向量规模的 AI 应用中,如 RAG 检索增强生成、图像 / 多模态搜索和推荐系统,向量数据库的核心挑战在于平衡存储成本、查询延迟和召回率。Milvus 作为领先的开源云原生向量数据库,通过 DiskANN 混合索引、动态分片和多向量过滤机制,提供高效的 ANN(近似最近邻)搜索优化。本文聚焦单一技术点:DiskANN 与分片结合下的延迟调优,剖析工程参数、落地清单和监控要点,帮助开发者实现亚秒级亿级查询。

DiskANN 是 Milvus 2.2+ 引入的磁盘基 ANN 索引,基于 Vamana 图结构,将索引数据部分存储在磁盘而非全内存,适用于低内存高存储场景。相比纯内存索引如 HNSW,DiskANN 在十亿级数据集上内存占用降低 50% 以上,同时保持高召回率(>95%)。其核心是结合内存缓存(热数据)和 SSD 磁盘 I/O 优化:构建时生成图索引和 PQ 码,查询时从内存缓存或磁盘加载邻居节点,进行逐跳遍历。Milvus GitHub README 强调,DiskANN 支持 L2/IP/COSINE 度量,仅浮点向量,需 NVMe SSD 挂载数据路径 /var/lib/milvus/data。

证据显示,DiskANN 在亿级基准如 sift1B 上,QPS 达 1000+(topK=10),延迟 <50ms,优于 IVF_PQ(内存高但精度低)。结合多向量过滤,Milvus 先执行标量过滤生成 bitset,再图遍历时用 SIMD 跳过无效节点,避免 “图断连”。搜索结果中,CSDN 文章验证:在 Cohere 1M 数据集(dim=768),DiskANN + 过滤召回率 98%,延迟优化 2x。

动态分片是 Milvus 扩展关键:Collection 分成 Shard(默认 1,可设 4-16),每个 Shard 含多个 Segment(GrowingSegment 实时写入,SealedSegment 索引加速)。Kubernetes 原生部署下,DataNode/ QueryNode 自动负载均衡 Segment,支持水平扩展至百亿向量。分片数 = 数据量 / (单 Shard 容量~10 亿),查询时 Proxy 路由多 Shard 并行,聚合 topK。搜索中提到,双层路由(Shard → Segment)确保均匀分布,避免热点。

延迟优化的落地参数清单如下:

  1. 索引构建参数(create_index)

    index_params = {
      "index_type": "DISKANN",
      "metric_type": "L2",
      "params": {}  # 无需额外,自动优化
    }
    
    • 全局调优(milvus.yaml):
      diskIndex:
        maxDegree: 56  # 图节点度数 [1,512],召回 ↑ 构建时间 ↑
        searchListSize: 100  # 候选列表 [1, INT32_MAX]
        pqCodeBudgetGBRatio: 0.125  # PQ 码比例 (0,0.25]
        searchCacheBudgetGBRatio: 0.125  # 缓存比例 [0,0.3)
        beamWidthRatio: 4.0  # I/O 并行 [1, max(128/CPU,16)]
      
  2. 搜索参数(search)

    search_params = {
      "metric_type": "L2",
      "params": {"search_list": 100}  # [topk, INT32_MAX],默认16,↑召回 ↓QPS
    }
    
    • 多向量过滤示例:expr="price > 100 and category in ['A','B']",结合 bitset SIMD 过滤。
  3. 分片配置(create_collection)

    collection_params = {
      "shards_num": 8  # 初始 4-16,根据 QPS/数据量调,>CPU核数
    }
    
    • 扩展:kubectl scale deployment querynode --replicas=4,QueryNode 独立扩展。
  4. 部署清单

    组件 资源 优化点
    DataNode 64GB RAM, NVMe SSD Segment 池化,自动 compaction
    QueryNode 32 vCPU, 128GB 预加载 collection.load(),MMAP 启用
    Proxy 4 vCPU 限流,反压
    存储 MinIO/S3 热 / 冷分离

监控要点:Prometheus + Grafana 追踪 QPS、P99 延迟、召回率(VectorDBBench)、CPU/IO 使用。阈值:延迟 >100ms → ↑search_list 或加 QueryNode;召回 <95% → ↑maxDegree;分片不均 → 检查 shards_num。

风险回滚:高过滤率 (>99%) 切换 FLAT 暴力搜;IO 瓶颈 → 调 beamWidthRatio ↓。测试中,AWS r7gd.4xlarge 上亿级查询,P99 <80ms。

实际案例:Zilliz Cloud 用 DiskANN + 动态分片,支持万 QPS 亿向量 RAG,成本降 40%。开发者可从 Milvus Lite 起步,pip install pymilvus,快速验证。

资料来源:Milvus GitHub (https://github.com/milvus-io/milvus),官方 docs (milvus.io/docs),CSDN 基准测试。

查看归档