如何在旧的 SSTables 中删除 Cassandra 墓碑?

How are Cassandra Tombstones deleted in old SSTables?

如果我启用了压缩,例如 SizeTieredCompaction,我的 SSTables 会被压缩,直到达到特定大小级别。当我 "delete" 一个位于 SSTable 分区中的旧条目非常旧且在不久的将来不会再次压缩时,何时进行删除?

假设您删除了 100 个条目,并且所有条目都是一个非常旧的 SSTable 的一部分,该 SSTable 被压缩了几次,没有热数据并且已经相当大了。它需要很长时间才能再次压缩并移除墓碑,对吗?

当逻辑删除与压缩中的数据合并时,数据将从磁盘中删除。何时发生取决于添加新数据的速率和您的压缩策略。墓碑直到 gc_grace_seconds 之后才会被清除,以防止数据复活(确保修复在这段时间内完成)。

如果您大量覆盖或删除数据并且磁盘上有大量过时数据不正常,您可能应该改用 LeveledCompactionStrategy(如果使用 ssds,我建议始终默认为 LCS)。如果使用 STCS,最大的 sstables 可能需要 long 时间才能压缩。 STCS 更适合不断附加数据(如日志或事件)。如果条目随时间过期并且您严重依赖 TTL,您可能希望使用定时 window 策略。