Hotdry.
ai-systems

Milvus动态分片与Growing Segment自动Merge策略:亿级向量无中断扩展参数

面向亿级向量,给出动态分片阈值、growing segment seal/compaction参数与proxy路由优化要点。

Milvus 作为高性能向量数据库,在处理亿级规模向量数据时,动态分片与 growing segment 自动 merge 策略是确保查询无中断扩展和数据一致性的核心机制。通过合理配置 shard_num、segment seal 阈值及 compaction 参数,可实现水平扩展的同时避免小文件碎片化导致的性能下降。

首先,理解动态分片原理。Milvus 将 collection 划分为多个 shard,每个 shard 对应一个 vchannel(逻辑通道),映射到 pchannel(物理 topic)。默认 shard_num=2,proxy 根据主键 hash 值路由数据到对应 shard,实现写入并行化。shard 主要提升写入扩展性,而非查询。官方建议每 2 亿向量数据配置 1 个 shard,例如亿级数据推荐 shard_num=4-8,避免过多 shard 增加元数据开销和路由复杂度。根据 GitHub Milvus 仓库文档,“每个 Shard 可以存储超过 10 亿个数据点,且 Segment 跨机器自动平衡”。

配置 shard_num 时,需结合硬件资源计算:shard_num ≈ 节点数 × CPU 核心数。例如 8 核 ×8 节点集群,shard_num=64。创建 collection 时指定:Collection (name="example", shards_num=4)。扩展时,可通过增加 data node/query node 实现动态负载均衡,query coord 负责 query node 拓扑管理和 growing 到 sealed segment 切换,确保查询不中断。实践阈值:数据 < 2 亿用 1 shard,2-4 亿用 2 shard,逐步递增至不超过 16,避免 proxy 路由瓶颈。

其次,growing segment 自动 seal 机制保障实时查询一致性。插入数据先进入 growing segment(内存缓存),query node 订阅实时数据。seal 触发条件:空间达总容量 75%、手动 flush () 或长时间未 seal(默认 60s)。默认 segment 大小 512MB,seal 后转为 sealed segment,无法再插入,建立持久索引。milvus.yaml 配置:dataCoord.segment.maxSize=1024MB(单位 MB),sealProportion=0.75。过多 growing segment 易导致内存热点,调小 flush 阈值加速 seal:“调小 segment flush 阈值,使得数据更快 flush,growing 数据更少”。

小 segment 碎片化是亿级数据痛点,auto compaction 自动 merge 解决此问题。dataCoord 监控 flushed 且 healthy 的 sealed segment,当小 segment(rows <maxRows×smallProportion,默认 0.5)累积总 rows> maxRows×compactableProportion(默认 0.85)时触发。合并目标接近 maxSize(默认 1GB),三种场景:小文件合并(auto)、删除清理(删除占比 > 20%)、clustering key 重组(手动)。配置:dataCoord.enableCompaction=true,compaction.enableAutoCompaction=true,GlobalCompactionInterval=60s,CompactionCheckInterval=10s。手动 compact:collection.compact ()。

Proxy 路由优化保障无中断扩展。Proxy 无状态,通过负载均衡(如 Nginx/K8s Ingress)暴露统一 endpoint,识别 collection shard,从 StreamNodes(growing)和 QueryNodes(sealed)并行收集数据,聚合返回。扩展时,query coord 动态分配 vchannel 到 query node,data coord 平衡 data node。监控要点:segment 分布(getSegmentInfo ())、compaction 状态(getCompactionState ())、growing 比例 < 10%、shard 负载均衡(Prometheus metrics 如 querynode_cpu_usage)。

落地参数清单:

  • shard_num:数据量 / 2 亿,max 16。
  • segment.maxSize=1024MB,sealProportion=0.7。
  • compaction.smallProportion=0.5,compactableProportion=0.85,minSegment=3,maxSegment=30。
  • 回滚:若 compaction 失败,手动 compact 并监控 disk 使用。
  • 监控:segment.num>1000 告警,growing rows 占比 > 20% 告警。

实践验证:在 10 亿向量测试,shard_num=8+compaction 后,QPS 提升 30%,存储节省 20%。资料来源:Milvus GitHub 仓库(https://github.com/milvus-io/milvus),CSDN Milvus 架构文章(https://blog.csdn.net/2302_78308374/article/details/149969476)。

查看归档