延迟从 1685ms 压到 68ms:Milvus 聚类压缩背后的 25 倍加速
【免费下载链接】milvusMilvus is a high-performance, cloud-native vector database built for scalable vector ANN search项目地址: https://gitcode.com/GitHub_Trending/mi/milvus
当查询条件精确命中user_id == 1000时,2000 万向量集群的平均延迟从 1685ms 降到 68ms,存储占用同步缩减 45%——干这件事的是 Milvus 的聚类压缩(Clustering Compaction)。它面向 768 维这类高维特征向量,把存储和查询速度一起优化,且不需要改变向量检索精度。
Milvus 聚类压缩是怎么快的:数据进来后的三次重排
新数据写入后,DataCoord 先判断增量是否超过newDataSizeThreshold,达标才拉起压缩任务。接下来 DataNode 按聚类键(Clustering Key)对记录做全局重排,让相同键值的行落到同一段;随后把分散的小数据段(Segment)合并成大文件,压低元数据开销,并在落盘过程中生成分区统计信息(partitionStats),记下每个段覆盖的键值区间。查询进来时,QueryNode 拿过滤条件去比对这些统计信息,整段不命中的数据段直接跳过、不参与扫描——扫描范围变短,就是延迟数字变小的全部原因。
5 分钟上手:启用 Milvus 聚类压缩
功能需要 Milvus 2.4.7+ 版本。改完 configs/milvus.yaml 后执行./scripts/stop.sh && ./scripts/start_standalone.sh重启即可。
dataCoord: compaction: clustering: enable: true autoEnable: true triggerInterval: 600 newDataSizeThreshold: 512m queryNode: enableSegmentPrune: trueenableSegmentPrune是查询侧开关,漏掉它裁剪不生效。建集合时把查询里高频过滤的标量字段标为聚类键,支持的类型有 Int8/16/32/64、Float、Double、VarChar,基数控制在 100~10000 比较合适:
from pymilvus import FieldSchema, CollectionSchema, DataType, Collection fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="user_id", dtype=DataType.INT64, is_clustering_key=True), FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768), ] collection = Collection("user_behavior", CollectionSchema(fields), shards_num=4) collection.compact(is_clustering=True) collection.wait_for_compaction_completed(is_clustering=True, timeout=3600)任务日志在logs/data_coord.log里搜 "clustering compaction" 可跟进进度。
四组数据说清楚:聚类压缩实测对比
测试集为 LAION-400M 子集,2000 万条 768 维向量,4 节点 CPU 集群(Intel Xeon 8375C、256GB RAM):
| 查询条件 | 数据裁剪率 | 平均延迟(ms) | QPS 提升 | 存储减少 |
|---|---|---|---|---|
| 无过滤条件 | 0% | 1685 | 1x | 32% |
| user_id > 200 AND <800 | 40.2% | 1045 | 1.6x | 38% |
| user_id > 200 AND <400 | 79.5% | 550 | 3.1x | 42% |
| user_id == 1000 | 99% | 68 | 25x | 45% |
快的关键在 partitionStats:查询的过滤条件与聚类键区间对得越准,能被整体跳过的数据段就越多,条件精确命中时 99% 的段不用碰。所以提升幅度与过滤精度正相关——即便不加任何过滤条件,合并小段本身也带来了 32% 的存储缩减。
坑与旋钮:Milvus 压缩参数怎么调
⚙️ 五项高频场景,按「场景 → 症状 → 解法」对照:
- 查询性能未提升→ 裁剪率指标为零 → 确认
queryNode.enableSegmentPrune: true,再看milvus_query_prune_ratio是否生效。 - 压缩任务卡住→ data_coord.log 出现资源竞争 → 用
dataCoord.compaction.clustering.timeout延长超时。 - 存储未见缩减→ 向量本身已高度压缩 → 调
dataNode.clusteringCompaction.memoryBufferRatio(默认 0.3)改变内存缓冲策略。 - 压缩触发太频繁→ 写入密集导致反复重排 → 调大
newDataSizeThreshold(默认 512m)并拉长triggerInterval(默认 600s)。 - 已有分区键不想重复指定→ 手动维护聚类键繁琐 → 设置
common.usePartitionKeyAsClusteringKey: true自动以分区键作为聚类键。
接下来:roadmap 与行动清单
按 roadmap,下一版本会引入自适应压缩算法(依据向量分布自动选择压缩策略)和增量聚类(减少重复计算),细节可看 20230511-collection_level_autocompaction_switch.md。配合 TTL 自动清理过期数据,存储优化可以闭环:
collection.set_properties(properties={"collection.ttl.seconds": "2592000"})🚀 落地三步:
- 先在测试集群验证裁剪率:跑上文四种查询条件,确认 QPS 提升与裁剪率匹配。
- 接入 Prometheus 盯指标:跟踪
milvus_compaction_clustering_total与milvus_query_prune_ratio,长期观察压缩成功率与裁剪生效情况。 - 回查聚类键选择:核对线上过滤条件是否命中聚类键区间,基数是否落在 100~10000。
🔍 更多场景参考 tests/integration/compaction/ 下的集成用例。
【免费下载链接】milvusMilvus is a high-performance, cloud-native vector database built for scalable vector ANN search项目地址: https://gitcode.com/GitHub_Trending/mi/milvus
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考