【问题标题】:Ensure previous version of a cell is removed after 10 minutes确保在 10 分钟后删除以前版本的单元格
【发布时间】:2024-01-18 01:54:01
【问题描述】:

在 Cassandra 中,我想在处理完一行后更新一行以删除一些敏感数据。 一行有以下过程。

  1. 插入记录
  2. 处理记录(更新)
  3. 设置要处理的行并从该行的一列中删除敏感数据

我知道更新实际上并没有根据 Cassandra 的设计更新磁盘上的数据。但是,我想确保在不太长的一段时间后,数据实际上会从磁盘中删除。没有从该表中显式删除行(使用 CQL 语句),只有插入和更新语句。

据我了解,我必须使用相对较短的@​​987654321@,比如10分钟。

您能告诉我这种配置是否可行吗?这种策略有什么影响?

我正在使用 Cassandra 3.11.1,并且该表的 TTL 为一天。表中每天插入大约 100k 到 1M 条记录。

【问题讨论】:

    标签: cassandra cassandra-3.0


    【解决方案1】:

    让我回答这两个部分的问题:-

    gc_grace_seconds 是 Cassandra 在清理具有墓碑数据的 SSTable 之前必须等待的时间(由 TTL/Deletes 引起)。因此,在您的情况下,该表的 TTL 为 1 天,默认情况下 gc_grace_seconds 为 864000(秒)= 10 天。这意味着在一天内过期的数据会再等待 10 天(默认情况下)才能被清理。

    默认 gc_grace_seconds 高的原因是为了确保在显式删除期间,如果集群中的任何节点关闭,删除(墓碑)会在节点恢复时传播。换句话说就是避免僵尸数据。

    在您的情况下,由于没有任何显式删除并且只有墓碑,因此 gc_grace_seconds 的较小值是安全的,例如 90000(25 小时)。

    另一个风险更大的选择是,如果保证应用程序永远不会进行显式删除并仅依赖 TTL,则将 gc_grace_seconds 设置为零。将其设置为零具有系统中没有墓碑的优点。数据一旦 TTL 就会被清除

    问题的第二部分:

    为了使列在处理后 10 分钟内过期,我们可以如下设置列级别 TTL。下面我建议使用更短的 gc_grace_seconds 以及 TWCS,这将有助于在 10 + 1 分钟内驱逐这一行并且不会造成墓碑压力。

    更新 CQL 以设置列级别 TTL

    UPDATE test USING TTL 600 
      SET status = 'PROCESSED' 
      WHERE primary_key = ? ;
    

    另外,关于表压缩策略:-

    我假设这些行是按顺序处理的(或者换句话说,这个表被视为一个队列)。处理这种情况的更简洁的方法是使用“时间窗口压缩策略”。通常建议将 TimeWindow 切片的数量保持在 50 个以下。

    命令是

    CREATE TABLE test (
    ........
    ) WITH 
        AND gc_grace_seconds = 60
        AND default_time_to_live = 86400
        AND compaction = {'compaction_window_size': '30', 
                          'compaction_window_unit': 'MINUTES', 
                          'class': 'org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy'}
    

    此设置将为我们提供以下保证:

    • 停止压缩超过 30 分钟的数据,从而降低 I/O 消耗。如果压缩是最新的,针对 30 分钟时间范围内的行的查询将主要命中有限数量的 SSTables
    • 使用 TTL 插入,删除文件会清除墓碑(在这种情况下,在原始写入后 1 天 1 分钟后不久)
    • 通过提示或修复发送到原始时间窗口之外的数据仅与当前窗口的 SSTables 进行压缩,防止写入放大
    • 磁盘上的最大压缩开销是上次创建的存储桶的 50%
    • 磁盘空间使用增长很容易预测

    TWCS 的精彩阅读。

    【讨论】:

    • 感谢您的回答!我刚收到一些问题,为什么宽限期为 0 的风险更大?它看起来像一个队列,但我不能保证所有记录都以正确的顺序处理(可以重试某些元素),我认为它不包括 TWCS。是这样吗?听说 TTL by column 使用 tombstone 会降低性能,是不是这个用例的情况和问题?
    • 只要没有明确的 DELETE cql 并且只有 TTL,那么将 gc_grace_seconds 设置为低(如 1 分钟)就不是问题。只有当有删除时它的风险更大。按顺序处理行无关紧要,只要它们在 24 小时 TTL 窗口内完成。 TWCS 不应成为约束。 TTL 按列会降低具有较高 gc_grace_seconds(如默认 10 天)的表的性能。在上面的示例中,我们将其设置为 1 分钟并结合 TWCS,因此它不会影响这种特殊情况下的性能。
    • 当您的意思是“按顺序处理行无关紧要,只要它们在 24 小时 TTL 窗口内完成”,它是压缩窗口而不是 TTL 对吗?非常感谢您的深入回答!
    • 1天的TTL,会使数据过期24小时。因此,如果一天之内不处理,您的数据就会消失。
    最近更新 更多