Cassandra是否在读取墓碑?这个跟踪信息是什么意思?

3
我会进行带有跟踪的查询并查看:

最初的回答


Skipped 0/1 non-slice-intersecting sstables
included 0 due to tombstones [ReadStage-<N>]

所以忽略墓碑是否有效?最初的回答如下:

那么忽略墓碑是否起作用呢?跟踪:

Read 0 live rows and 2 tombstone cells

最初的回答很明确:它正在读取墓碑。

1
“墓碑”是Cassandra在删除数据时使用的标记,因为删除操作需要在网络中进行分布。考虑以下情景:我们尝试对一个存在于六个存储中的记录进行删除,然后其中一个“删除”操作失败了。系统无法轻易判断那个剩下的记录是一个失败的删除,因此它可能会认为该记录是有效数据并重新分发它。墓碑标记表示该记录正在被删除,直到所有副本都消失,然后墓碑将被删除。这是正常的。 - Ted Wrigley
2个回答

0
假设有一个A列。
你向A列添加了值x。
然后你删除了A列。
Cassandra不会立即删除值x,而是会为A列添加一个叫做墓碑的标记。墓碑本身也是一条独立的记录,就像原始的值x一样。
假设这两个更新在不同的sstables(Cassandra存储)中写入。
现在当你读取该值时,Cassandra会获取值x和A列的墓碑。它会发现墓碑是在值x之后写入的,所以不会返回任何值。
跳过0/1个非交集切片的sstables,因为存在墓碑。
这基本上确认了相同的情况。

1
对于Cassandra来说,所有的记录都是不可变的,没有“为称为tombstone的Column A添加一个标记”的操作。相反,C*会创建一个带有tombstone标记和更近的时间戳的新记录。当发出查询时,引擎将找到2条记录(一条是创建时的记录,另一条是删除时的记录),并根据最新的时间戳决定该记录的当前状态是什么。 - Carlos Monroy Nieblas
我所指的“marker”是指一个新的记录,但也许我可以用更清晰的语言表达。谢谢你的指出。 - Abhishek Garg

0
根据与一些Cassandra管理员的讨论:

“跳过sstables是Cassandra告诉我们它有效地消除了墓碑,这是可以的。

“通常情况下,删除分区中的所有内容有助于确保Cassandra不会被墓碑拖累。


删除分区通常有助于确保Cassandra不会被墓碑拖累。 即使您删除了一个分区,它仍然会创建一个墓碑。 - Abhishek Garg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接