【问题标题】:Purge old data strategy for Cassandra DB清除 Cassandra DB 的旧数据策略
【发布时间】:2018-02-08 18:58:13
【问题描述】:

我们根据类别将事件存储在多个表中。 每个事件都有一个 id,但包含多个子元素。 我们有一个查找表来使用 subelement_id 查找事件。 每个子元素最多可以参加 7 个活动。 因此,该分区最多可容纳 7 行。 在 5 年内,我们将在 eventlookup 中有 30-500 亿行。

CREATE TABLE eventlookup (
    subelement_id text,
    recordtime timeuuid,
    event_id text,
    PRIMARY KEY ((subelement_id), recordtime)
)

问题:一旦达到 5(或其他数字)年标记,我们如何删除旧数据。 我们希望以特定的时间间隔清除“尾巴”,比如每周或每月。

目前调查的方法:

  • TTL X 年(性能不错,但需要事先知道 TTL,每列多出 8 个字节)
  • 不删除 - 只需忽略问题(其他人的问题:0)
  • 速率受限的单行删除(执行完整的表扫描并可能执行数十亿条删除语句)
  • 将表拆分为多个表 -> “CREATE TABLE eventlookupYYYY”。不需要一年一次,只需放弃它。 (问题是每次读取都可能查询所有表)

还有其他我们可以考虑的方法吗?

是否有我们现在可以做出的设计决策(我们还没有投入生产)来缓解未来的问题?

【问题讨论】:

  • 嗨@Mumi,你如何设置“X 年的 TTL”?

标签: cassandra cassandra-3.0


【解决方案1】:

如果值得额外的空间,请在单独的表/列中跟踪 recordtimessubelement_id 的范围。

然后,如果您不想先验设置 ttl,则可以轻松获取要删除具有特定年龄的记录的 ID。

但请记住,要使此跟踪分布良好,只需一个 date 将在您的集群中生成热点和非常宽的行,因此请考虑一些分区键,例如 (date,chunk),其中我使用 0- 之间的随机数chunk 过去 10 次。你也可以看看 TimeWindowCompactionStrategy - 这是一篇关于它的博客文章:http://thelastpickle.com/blog/2016/12/08/TWCS-part1.html

您的分区键仅设置为subelement_id,因此所有记录时间的 7 个事件的所有元组都将位于 一个 分区中。

【讨论】:

    【解决方案2】:

    鉴于您的表结构,您需要知道所有数据的所有subelement_id 才能获取单行。所以,有了这个假设,你的表结构可以通过recordtime DESC对数据进行排序来改进一点:

    CREATE TABLE eventlookup (
        subelement_id text,
        recordtime timeuuid,
        eventtype int,
        parentid text,
        partition bigint,
        event_id text,
        PRIMARY KEY ((subelement_id), recordtime)
    )
    WITH CLUSTERING ORDER BY (recordtime DESC);
    

    现在您的所有数据都按降序排列,这将为您带来很大的优势。

    假设您有多年的数据(例如,从 2000 年到 2018 年)。假设您只需要保留过去 5 年,您需要通过以下方式获取数据:

    SELECT * FROM eventlookup WHERE subelement_id = 'mysub_id' AND recordtime >= '2013-01-01';
    

    此查询非常有效,因为 C* 将检索您的数据,并将停止扫描您想要的分区:5 年前。最大的好处是,如果你在那之后有墓碑,那么它们根本不会影响你的阅读。这意味着您可以在该点之后安全地“安全地”修剪,方法是发出删除与

    WHERE subelement_id = 'mysub_id' AND recordtime < '2013-01-01';
    

    请注意,此删除将创建将被您的读取跳过的墓碑,但它们将在压缩期间被读取,因此请记住这一点。

    或者,如果您不需要回收存储空间,您可以直接跳过删除部分,您的系统将始终运行顺畅,因为您将始终有效地检索数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2020-11-17
      • 2023-03-31
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多