system.log 中的墓碑扫描

Tombstone scanning in system.log

我有一个删除用例较少的 cassandra 集群。我在 system.log 中发现“Read 10 live and 5645464 tombstones cells in keyspace.table”这是什么意思?请帮忙理解。

谢谢。

对于Cassandra来说,记录的所有信息都是immutable。这意味着当您进行删除操作时(使用删除语句或使用 Time To Live [TTL] 子句显式),数据库将添加另一条带有名为 tombstone 的特殊标志的记录。所有这些记录将保留在数据库中,直到 gc_grace_seconds 期结束;默认为 10 天。

在您的情况下,引擎发现检索到的大部分记录已被删除,但它们仍在等待 gc_grace_seconds 通过,让压缩回收 space。解决此问题的一种可能选择是减少 gc_grace_seconds 的 table。

更多信息,请参考《最后的泡菜》中的this article

在使用 Cassandra 时要牢记的另一件事是,逻辑删除单元与删除不直接相关。

当您在执行插入时向属性插入 null 值时,Cassandra 会在内部将 attribute/cell 标记为墓碑。因此,即使您没有进行大量删除操作,您最终也可能会得到大量的墓碑。简单易行的解决方案是在插入时不插入属性的 null 值。

按照此语句 Read 10 live and 5645464 tombstones cells in keyspace.table 的说法,可能会针对正在扫描 10 单元格和 5645464 数量的墓碑(单元格)的查询进行 table 扫描与 null 值)同时这样做是我的猜测。需要了解正在执行什么类型的查询才能更深入地了解它。