2

根据关于 Tombstone的问题,为什么 upserts 不创建墓碑?根据 datastax 文档,如何更新数据?对于每个 upsert,cassandra 认为是删除后插入,因为插入的新时间戳会覆盖旧时间戳。旧的时间戳数据必须标记为删除,这与墓碑有关。

为什么我们有自相矛盾的说法?或者我在这里错过了什么?

用例:在 Cassandra 中使用唯一键 (uuid) 插入数据,并且此数据中的某些列经常更新。您推荐哪种方法?

  1. 在插入查询中插入具有新列值的相同数据。
  2. 在更新查询中使用新列值根据给定 uuid 更新现有记录。

哪种方法创建或不创建墓碑?Cassandra 如何处理这两个查询?

4

1 回答 1

6

正如 Russ 指出的那样,您可能想阅读有关此主题的其他类似问题。然而,

upsert/overwrite 只是另一个单元格,具有名称、时间戳和值。

墓碑就像一个覆盖,除了它有一个额外的字段指示它已被删除,因此它不会作为有效输出返回。墓碑通常有害的原因是它们可以在糟糕的数据模型中积累,即使人们认为数据已经消失 - 跳过它们以获取实时数据实际上需要内存。

当您按照您的描述更新/更新时,您创建的单元格 SHADOWS(过时)前一个单元格,该单元格将在压缩时被删除。先前的单元格不是墓碑,即使它不再活动/活动 - 只要压缩允许,它将被压缩并完全由新的、活动的、最高时间戳值替换。

要记住的最重要的事情是:墓碑不一定通过压缩删除 - 它们至少保留(持久/重写)gc_grace_seconds,如果它们需要遮蔽/覆盖 sstables 中的其他单元格,则可能甚至更长-尚未压缩。因此,墓碑会保留很长时间,但是一旦它们所在的 sstable 被压缩,被阴影/覆盖的单元格就会被 gc'd。

于 2016-02-19T04:33:22.173 回答