【问题标题】:Overwrite row in cassandra with INSERT, will it cause tombstone?用 INSERT 覆盖 cassandra 中的行,会导致墓碑吗?
【发布时间】:2015-09-12 05:46:18
【问题描述】:

考虑到数据量和速度,在我们的案例中,将数据写入 Cassandra 而不导致其创建墓碑至关重要。目前我们只写了一次行,然后再也不需要更新行,只需要再次获取数据。

现在出现了一种情况,我们实际上需要写入数据,然后用更多的数据完成它,过一段时间就完成了。 它可以由任何一个制作;

  1. 使用 INSERT 再次覆盖一行中的所有数据(所有数据都可用),或者

  2. 仅对新数据执行更新。

最好的方法是什么,记住速度而不是创建墓碑很重要?

【问题讨论】:

    标签: cassandra cassandra-2.0 tombstone


    【解决方案1】:

    只有在删除数据或使用 TTL 值时才会创建墓碑。

    Cassandra 确实与您描述的用例非常吻合。增量添加数据适用于 INSERT 和 UPDATE 语句。 Cassandra 会将数据存储在不同的位置,以防随着时间的推移为相同的分区键添加数据。定期运行的压缩将再次合并单个键的数据,以优化访问和释放磁盘空间。这将根据写入值的时间戳发生,但不会创建任何新的墓碑。 您可以了解有关 Cassandra 如何存储数据的更多信息,例如here.

    【讨论】:

    • 创建墓碑的好方法是更新大约 1000 种类型的相同分区键,其中有 2 或 3 个集合类型列,并且每次更新 1 个 100 个元素的集合
    • 不仅删除或TTL会导致TS。来自 datastax 文档:“一些生成墓碑的操作:使用 CQL DELETE 语句使数据过期并具有生存时间 (TTL) "
    【解决方案2】:

    进行更新以添加新的或更改的数据会更有效。没有变化的旧数据不需要重写,让 Cassandra 重写效率低下。

    当您进行插入或更新时,Cassandra 会为每列的修改时间保留一个时间戳。当您进行读取时,Cassandra 会根据一致性设置从内存、磁盘和其他副本中收集该密钥的所有写入。然后它将合并列数据,以便为每一列使用最新的值。

    当数据在磁盘上被压缩时,如果一行的不同列有单独的更新,这些更新将在压缩数据中合并为一行。

    除非您使用更新来设置 TTL(生存时间)值,否则您无需担心通过更新来创建墓碑。在您的应用程序中,听起来您永远不会删除数据,因此您永远不会有任何墓碑。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2023-03-08
      • 2017-08-16
      • 2017-10-03
      • 2019-05-25
      • 2021-04-22
      • 2019-07-09
      • 2015-06-04
      • 2015-06-14
      相关资源
      最近更新 更多