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 章回答的是: