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