Milvus 源码学习系列 | 第 20 章:删除、TTL、可见性与 Compaction
📅 2026/7/9 16:24:19
👁️ 阅读次数
📝 编程学习
上一章我们沿着 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 章回答的是:
编程学习
技术分享
实战经验