根据Question regarding Tombstone,为什么没有upserts创建墓碑? 根据datastax文档,How is data updated ?对于每个upsert,cassandra认为删除后跟insert,因为插入的新时间戳会覆盖旧时间戳。必须将旧时间戳数据标记为与墓碑相关的删除。
为什么我们有矛盾的陈述?或者我在这里遗漏了什么?
USECASE: 在Cassandra中使用唯一键(uuid)插入数据,并且此数据中的某些列会不断更新。你推荐哪种方法?
哪种方法可以创建或不创建墓碑? Cassandra如何处理这两个查询?
答案 0 :(得分:4)
正如Russ指出的那样,您可能希望阅读有关此主题的其他类似问题。然而,
upsert / overwrite只是另一个单元格,带有名称,时间戳和值。
墓碑就像覆盖一样,除了它有一个额外的字段表明它已被删除,因此它不会作为有效输出返回。墓碑通常有害的原因是它们可能在不良数据模型中累积,即使人们认为数据已经消失 - 而跳过它们以获取实时数据实际上需要内存。
当您描述更新/ upsert时,您创建的单元格SHADOWS(废弃)前一个单元格,将在压缩时删除。前一个单元格不是墓碑,即使它不再是活动/活动 - 只要压缩允许,它就会被压缩并完全被新的,实时的,最高时间戳的值取代。
要记住的最重要的事情是:墓碑不一定要通过压缩来移除 - 它们会被保留(持久/重写)至少gc_grace_seconds,甚至可能长时间需要阴影/覆盖尚未压缩的sstables中的其他单元格。因此,墓碑会长时间停留,但是一旦他们进入的sstable被压缩,阴影/覆盖的单元格就会变成gc< dc。