墓碑在卡桑德拉的实际位置

时间:2012-07-17 04:57:59

标签: cassandra tombstone

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

1 个答案:

答案 0 :(得分:3)

来自Aaron Morton的这个article应该对墓碑和删除的工作方式给出彻底的解释。信用应该真正归功于他。如果您想查看逻辑删除实现,请阅读this以获取更多信息。以下是从网站上提取的一些点来回答这个问题。

  

删除列后,将创建DeletedColumn aka Tombstone   卡桑德拉。 DeletedColumn将具有:

     

name:已删除列的名称

     

value:当前服务器时间为自unix时期(整数)以来的秒数。这是众所周知的          作为localDeleteTime并在(cassandra)GC过程中使用。

     

时间戳:由客户提供

     

然后以两种方式之一将变异应用于记忆。如果   memtable不包含该行的命名列   只需添加到记忆中。如果存在现有列   与删除列协调()'d。新的DeletedColumn会   如果现有列具有更高的值,则将其替换(提供客户端)   时间戳。 localDeleteTime不用于对帐。在这   指出memtable中任何先前的列值都将丢失,而不会丢失   坚持到磁盘。

     

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

所以这是具有墓碑标记的记忆。解释继续;摘自该网站。

  

在本地读取行值期间,执行相同的对帐过程   在删除请求运行期间使用的。多行碎片   从当前的memtable中检索,memtables等待刷新和   磁盘上的SSTables。碎片被缩小,柱子用了   相同名称已对帐以达到当前值。

     

例如,如果SSTable中存在用于键“foo”的行片段   列“bar”是“baz”,而DeletedColumn是另一个   SSTable在调和时具有更高的时间戳   DeletedColumn将“赢”。该行的当前视图将是   “bar”列已删除。