清除Cassandra DB的旧数据策略

我们根据类别将事件存储在多个表中.

每个事件都有一个id,但包含多个子元素.

我们有一个查找表来使用subelement_id查找事件.

每个子元素最多可参加7个活动.

因此分区最多可容纳7行.

在5年的时间里,我们将在eventlookup中拥有30-50亿行.

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

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

到目前为止调查的方法:

> X年的TTL(表现良好,但TTL需要事先知道,每列8个额外字节)
>没有删除 – 只是忽略问题(别人的问题:0)
>速率限制单行删除(完成表扫描和潜在的数十亿删除语句)
>将表拆分为多个表 – > “CREATE TABLE eventlookupYYYY”.不需要一年一次,只需放下它. (问题是每次读取都应该查询所有表)

我们可以考虑其他任何方法吗?

我们现在可以制定一个设计决策(我们还没有生产),这将减轻未来的问题吗?

最佳答案 如果它值得额外的空间,请在单独的表/列中查找subelement_id的记录时间范围.

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

但请记住,要使这种跟踪分布良好,只需一个日期就会在您的群集和非常宽的行中生成热点,所以请考虑一些分区键,如(日期,块),其中我使用0-10中的随机数过去的大块头.您也可以查看TimeWindowCompactionStrategy – 这是一篇关于它的博客文章:http://thelastpickle.com/blog/2016/12/08/TWCS-part1.html

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

点赞