【发布时间】:2018-05-09 02:52:24
【问题描述】:
据我所知,Cassandra 使用“墓碑”作为删除标记。 因为 SSTable 是不可变的,所以它使用 tombstone 标记已删除的记录。 那么,墓碑在 SSTable 文件中被标记在哪里呢? 它是否在 SSTable 或其他地方的索引文件中标记? 我想了解墓碑标记流的具体逻辑。
【问题讨论】:
据我所知,Cassandra 使用“墓碑”作为删除标记。 因为 SSTable 是不可变的,所以它使用 tombstone 标记已删除的记录。 那么,墓碑在 SSTable 文件中被标记在哪里呢? 它是否在 SSTable 或其他地方的索引文件中标记? 我想了解墓碑标记流的具体逻辑。
【问题讨论】:
来自 Aaron Morton 的 article 应该对墓碑和删除的工作原理进行彻底的解释。信用应该真正归功于他。如果您想查看 tombstone 实现,请阅读this 了解更多信息。以下是从网站中提取的一些要点来回答这个问题。
当一列被删除时,将创建一个 DeletedColumn aka Tombstone 卡桑德拉。 DeletedColumn 将具有:
name:已删除列的名称
值:当前服务器时间,自 unix 纪元以来的秒数(整数)。这是众所周知的 作为 localDeleteTime 并在 (cassandra) GC 过程中使用。
时间戳:由客户端提供
然后以两种方式之一将突变应用于内存表。如果 memtable 不包含它所在行的命名列 简单地添加到内存表中。如果有一个现有的列,它是 reconcile() 'd 与已删除的列。新的 DeletedColumn 将 如果现有列更高(客户提供),则替换现有列 时间戳。 localDeleteTime 不用于协调。在这 指向 memtable 中的任何先前列值都将丢失并且不会 持久化到磁盘。
我们现在有一个墓碑。如果没有其他突变 DeletedColumn 稍后将像任何其他内容一样持久保存到 SSTable 其他栏目。
所以它是具有墓碑标记的memtable。解释继续;摘自该网站。
在本地读取行值期间,相同的协调过程 在删除请求运行期间使用的。多行片段 从当前的内存表中检索,待刷新的内存表和 磁盘上的 SSTables。碎片被减少并且具有 同名协调以达到当前值。
例如,如果 SSTable 中存在键“foo”的行片段 说列“bar”是“baz”,另一个是 DeletedColumn SSTable 在它们被协调时具有更高的时间戳 DeletedColumn 将“获胜”。该行的当前视图将是 “bar”列被删除。
【讨论】: