为什么不在卡桑德拉创造墓碑?

时间:2016-02-18 22:36:48

标签: cassandra datastax upsert tombstone

根据Question regarding Tombstone,为什么没有upserts创建墓碑? 根据datastax文档,How is data updated ?对于每个upsert,cassandra认为删除后跟insert,因为插入的新时间戳会覆盖旧时间戳。必须将旧时间戳数据标记为与墓碑相关的删除。

  

为什么我们有矛盾的陈述?或者我在这里遗漏了什么?

USECASE: 在Cassandra中使用唯一键(uuid)插入数据,并且此数据中的某些列会不断更新。你推荐哪种方法?

  1. 使用新的列值插入相同的数据 插入查询。
  2. 根据给定的uuid更新现有记录 使用更新查询中的新列值。
  3. 哪种方法可以创建或不创建墓碑? Cassandra如何处理这两个查询?

1 个答案:

答案 0 :(得分:4)

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

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

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

当您描述更新/ upsert时,您创建的单元格SHADOWS(废弃)前一个单元格,将在压缩时删除。前一个单元格不是墓碑,即使它不再是活动/活动 - 只要压缩允许,它就会被压缩并完全被新的,实时的,最高时间戳的值取代。

要记住的最重要的事情是:墓碑不一定要通过压缩来移除 - 它们会被保留(持久/重写)至少gc_grace_seconds,甚至可能长时间需要阴影/覆盖尚未压缩的sstables中的其他单元格。因此,墓碑会长时间停留,但是一旦他们进入的sstable被压缩,阴影/覆盖的单元格就会变成gc< dc。