2012-07-17 95 views
2

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

回答

3

来自Aaron Morton的article应该详细解释墓碑和删除的工作原理。信用应该是真正属于他的。如果您想查看逻辑删除实现,请参阅this以获取更多信息。下面是从网站提取的一些要点来回答这个问题。

当一列被删除时,DeletedColumn又名Tombstone创建于 Cassandra。该DeletedColumn将有:

名称:列的名称删除

值:当前服务器时间为自Unix纪元(整数)秒。这被称为 作为localDeleteTime,并在(cassandra)GC过程中使用。

时间戳:作为由客户端

提供的突变然后被施加到的memTable以两种方式中的一种。如果 memtable不包含该行的命名列,则它只是简单地添加到memtable中的 。如果存在一个现有的列,则它是 reconcile()'与删除的列。新的DeletedColumn将 替换现有的列,如果它具有更高的(客户端提供的) 时间戳。 localDeleteTime不用于对帐。在此 点,memtable中的任何以前的列值都会丢失,并且不会将 持久保存到磁盘。

我们现在有一个墓碑。如果没有其他突变,则DeletedColumn稍后将保留到SSTable,就像其他任何 其他列一样。

所以它是记录表有墓碑标记。解释继续;从网站摘录。

在本地读取行值期间,运行删除请求期间使用的同一个对帐过程 。多个行片段 从当前memtable,memtables挂起的flush和 磁盘上的SSTables中检索。这些碎片被缩小,同名的列被调和以达到当前值。

例如,如果有一个行片段中的关键“foo”的 一个的SSTable,上面写着列“酒吧”是“巴兹”,而在另一个 的SSTable一个DeletedColumn具有较高的时间戳,当他们重归于好 DeletedColumn将“赢”。该行的当前视图将会删除 “栏”列。