2

据我所知,Cassandra 使用“墓碑”作为删除标记。因为 SSTable 是不可变的,所以它使用 tombstone 标记已删除的记录。那么,墓碑在 SSTable 文件中被标记在哪里呢?它是否在 SSTable 或其他地方的索引文件中标记?我想了解墓碑标记流的具体逻辑。

4

1 回答 1

3

Aaron Morton 的这篇文章应该对墓碑和删除的工作原理进行彻底的解释。信用应该真正归功于他。如果您想查看 tombstone 实现,请阅读内容以获取更多信息。以下是从网站中提取的一些要点来回答这个问题。

当一列被删除时,在 Cassandra 中会创建一个 DeletedColumn aka Tombstone。DeletedColumn 将具有:

name:删除列的名称

value:当前服务器时间,自 unix 纪元以来的秒数(整数)。这称为 localDeleteTime,在 (cassandra) GC 过程中使用。

时间戳:由客户端提供

然后以两种方式之一将突变应用于内存表。如果 memtable 不包含该行的命名列,则只需将其添加到 memtable 中。如果存在现有列,则它与已删除列 reconcile() 'd。如果新的 DeletedColumn 具有更高的(客户端提供的)时间戳,它将替换现有的列。localDeleteTime 不用于协调。此时,memtable 中的任何先前列值都将丢失,并且不会持久化到磁盘。

我们现在有一块墓碑。如果没有其他突变,DeletedColumn 稍后将像任何其他列一样持久保存到 SSTable。

因此,具有墓碑标记的是memtable。解释继续;摘自该网站。

在本地读取行值期间,将运行在删除请求期间使用的相同协调过程。从磁盘上的当前 memtable、待刷新的 memtables 和 SSTables 中检索多个行片段。片段被减少并且具有相同名称的列被协调以达到当前值。

例如,如果键“foo”的 SSTable 中有一个行片段表示列“bar”是“baz”,而另一个 SSTable 中的 DeletedColumn 具有更高的时间戳,则当它们被协调时,DeletedColumn 将“获胜”。该行的当前视图将是“bar”列被删除。

于 2012-07-17T08:28:45.283 回答