【问题标题】:Best Cassandra data model for maintaining bounded lists per user用于维护每个用户的有界列表的最佳 Cassandra 数据模型
【发布时间】:2020-06-18 14:52:40
【问题描述】:

我有 Kafka 流,其中包含用户与网站的交互,因此每个事件都有一个时间戳和有关该事件的信息。对于每个用户,我想将最后 K 个事件存储在 Cassandra 中(例如 100 个事件)。

我们的网站不断遇到机器人/重度用户,这就是我们想要限制事件的原因,只是为了考虑“普通”用户。

我目前在 Cassandra 中有当前的数据模型:

 user_id, event_type, timestamp, event_blob 

在哪里

 <user_id, event_type> = partition key,   timestamp = clustering key

现在,一旦有新事件发生,我们就会在 Cassandra 中写入一条新记录,然后我们会清理“较重”的分区(即事件计数 > 100)。 这不会实时发生,除非我们不清理繁重的分区,否则我们有时会在读取时遇到很差的延迟。

对于这种情况,您对更好的桌子设计有什么建议吗? 有没有办法告诉 Cassandra 最多只存储 K 个元素进行分区并以 FIFO 方式使旧元素过期?或者我可以选择更好的桌子设计吗?

【问题讨论】:

  • 您是否尝试使用 LIMIT 来读取查询?如果您只需要 100 条最新记录,则可以选择

标签: cassandra cql key-value-store


【解决方案1】:

您现有实现的问题是删除创建墓碑,最终导致读取延迟。不建议创建过多的墓碑。

基于计数(每个分区的行数)的 FIFO 实现是不可能的。对于您的用例,更好的方法是不要删除同一个表中的记录。使用 Spark 将表迁移到新的临时表中,并在迁移过程中删除多余的记录。比如:

1) 创建一个新表

2) 使用 Spark ,从原始表中读取,迁移所有需要的记录(过滤多余的记录)并写入新的临时表。

3) 截断原始表。请注意,截断操作不会创建墓碑。

4) 使用 Spark 将临时表中的所有内容迁移回原始表。

5) 截断临时表。

您可以在应用程序的维护窗口中执行此操作(例如每月一次),直到那时您可以使用每个分区的 Limit 100 来限制读取。

【讨论】:

    【解决方案2】:

    对于这种情况,您对更好的桌子设计有什么建议吗?

    当为这样的场景进行数据建模时,我推荐使用三件事的模式:

    • 在桌子上设置了默认 TTL。
    • 按降序对时间组件进行聚类。
    • 调整查询以使用时间戳范围,从不查询超过 TTL 的数据。

    TTL:

    稍后我们会清理“较重”的分区

    清理发生前多久(平均)?我会做的一件事是在该表上使用 TTL,将其设置为您的团队通常必须清理它们之前的最长时间。

    聚类键,降序:

    所以您的 PRIMARY KEY 定义如下所示:

    PRIMARY KEY ((user_id,event_type),timestamp)
    

    确保您也在时间戳上按降序进行聚类。

    WITH CLUSTERING ORDER BY (timestamp DESC)
    

    这对于与您的 TTL 一起使用很重要。在这里,您的墓碑位于分区的“底部”(当按timestamp descinding 排序时),最近的数据(您关心的数据)位于分区的“顶部”。

    范围查询:

    最后,确保您的查询在timestamp 上有一个范围组件。

    例如:如果今天是11号,我的TTL是5天,那么我可以在不拉回墓碑的情况下查询最近4天的数据:

    SELECT * FROM events
    WHERE user_id = 11111 AND event_type = 'B'
    AND timestamp > '2020-03-07 00:00:00';
    

    【讨论】:

    • 谢谢!聚类关键部分特别有帮助!不幸的是,我的 TTL 更高(我们希望每个用户保留最近 2 个月的事件,最多 2k)并且分区很快就会填满。所以我正在考虑一个用于删除的 cron 作业以及一个分区的实时计数器以避免写入
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2016-06-12
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2011-01-27
    相关资源
    最近更新 更多