正如我所知,Cassandra使用"tombstone"作为删除标记。因为SSTable是不可变的,所以它使用tombstone标记已删除的记录。那么,在SSTable文件中,tombstone标记在哪里呢?它是否标记在SSTable或其他地方的索引文件中?我想了解墓碑标记流的具体逻辑。
Aaron Morton的这篇文章应该对tombstone和删除的工作原理进行彻底的解释。功劳应该归于他。如果您想查看tombstone实现,请阅读本文以获取更多信息。以下是从网站上提取的一些要点来回答这个问题。
删除列时,会在中创建DeletedColumn(又名Tombstone)卡桑德拉。DeletedColumn将具有:
name:已删除列的名称
value:自unix epoch以来的当前服务器时间(秒)(整数)。这是已知的作为localDeleteTime,并在(cassandra)GC过程中使用。
时间戳:由客户端提供
然后以两种方式之一将突变应用于记忆表。如果memtable不包含其所在行的命名列只是简单地添加到memtable中。如果存在现有列,则为reconcile()'d与Deleted列。新的DeletedColumn将如果现有列具有更高的列(客户端提供),则替换该列时间戳。localDeleteTime不用于对账。此时点memtable中任何以前的列值都将丢失,并且不会将持久化到磁盘。
我们现在有了一块墓碑。如果没有其他突变DeletedColumn稍后将像任何其他列。
因此,memtable具有tombstone标记。解释仍在继续;摘录自网站。
在对行值进行本地读取期间,执行相同的对账过程在删除请求运行期间使用的。多行碎片从当前memtable中检索,memtables挂起flush和SS磁盘上的表。碎片被减少,具有相同的名称已调和以达到当前值。
例如,如果键"foo"的SSTable中有一个行片段上面写着列"bar"是"baz",另一个列中有一个DeletedColumnS当它们被对账时,具有更高时间戳的表格DeletedColumn将"获胜"。行的当前视图将是"栏"列被删除。