记录一下那天晚上的排查过程。按 doc_id 删除 30 万条向量后,query 已经查不到这些数据,但集合的 row_count 仍是原来的数字,容量没释放,监控告警一直说磁盘快满。

刚开始盯着「删除条件没带分区,只删了一个分区」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。删除是标记删除,要等压缩后才真正回收。还有一种是统计接口读的是段元数据,不是实时结果。

少数情况下是索引没重建,旧段仍被引用。

第一件事是确认删除后的行数与段状态

curl http://localhost:9091/api/v1/collections/kb -d '{"dbName":"default"}'

触发一次手动压缩

python milvus_compact.py --collection kb --wait

然后核对删除条件覆盖的分区

python milvus_count.py --collection kb --filter 'doc_id in [1,2]'

剩下的就是重建索引后复核磁盘占用

python milvus_index.py --collection kb --rebuild

改完先别撤,确认这几项。压缩完成后 row_count 下降到预期值,磁盘占用同步释放,告警恢复。

标记删除不会立刻回收空间,容量类告警要看压缩进度而不是只看删除接口返回值。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189