Milvus 源码学习系列 | 第 20 章:删除、TTL、可见性与 Compaction

发布时间:2026/7/9 16:18:48

Milvus 源码学习系列 | 第 20 章:删除、TTL、可见性与 Compaction 上一章我们沿着 Search 请求一路进入 QueryNode 和 C++ segcore,重点看了单个 Segment 内部如何执行过滤、向量检索和结果构造。在第 19 章结尾,我们留下了一个更隐蔽的问题:如果一条数据已经被删除,或者已经因为 TTL 过期, 为什么 Search / Query 不会再看到它?直觉上,很多人会以为删除就是把文件里的一行移掉。但在 Milvus 这样的向量数据库里,数据已经被写成 binlog、deltalog、statslog、索引文件,并且还要支持时间戳一致性、QueryNode 增量消费、Segment 加载、故障恢复和后台 Compaction。所以删除不是一个瞬间完成的物理动作。它更像下面这个过程:1. 先写入一条删除记录,也就是 tombstone。 2. QueryNode 消费 tombstone,并在查询时屏蔽对应实体。 3. deltalog / L0 Segment 保存这些删除记录,供重启和加载恢复。 4. 后台 Compaction 读取 insert binlog + deltalog,把已删除或已过期的数据过滤掉。 5. DataCoord 用新的 Segment 元数据替换旧 Segment,旧文件后续被清理。本章就围绕这条链路展开。如果第 18 章和第 19 章回答的是:

相关新闻