【问题标题】:Reduce cassandra tombstones减少卡桑德拉墓碑
【发布时间】:2021-10-27 07:23:54
【问题描述】:

我有一个表来存储无法处理的消息,我正在通过调度程序每 5 分钟重试一次处理消息。

当消息被成功处理后,表中的相应行被删除,因此相同的消息不应该再次被处理。

从表查询中获取行是SELECT * FROM <table_name> ,因此如果大量行被删除,我们将面临墓碑问题。 表以时间戳作为分区键,message_name(TEXT) 作为集群键,TTL 为 7 天,gc_grace_second 为 2 天

根据我的要求,我需要删除记录,否则将处理重复记录。有什么办法可以避免墓碑问题?

【问题讨论】:

    标签: cassandra cassandra-3.0 tombstone


    【解决方案1】:

    所以我在这里看到了两个问题。

    1. Cassandra 被用作一种排队机制,这是一种既定的反模式。
    2. 所有分区都使用SELECT * FROM <table_name> 查询,因为没有WHERE 子句。

    因此,对于 Cassandra,一些数据模型和用例生成墓碑。到那时,除了设计数据模型以便不查询它们之外,没有太多工作要做。

    所以我的想法是对表进行不同的分区。

    CREATE TABLE messages (
        day TEXT,
        message_time TIMESTAMP,
        message_text TEXT,
        PRIMARY KEY ((day),message_time))
    WITH CLUSTERING ORDER BY (message_time DESC);
    

    使用此模型,您可以查询特定day 的所有消息。您还可以对daymessage_time 运行范围查询。例如:

    SELECT * FROM messages
    WHERE day='20210827'
    AND message_time > '2021-08-27 04:00';
    

    这将构建自2021-08-27 04:00 以来所有消息的结果集。在请求的时间范围之外(在本例中为 04:00 之前)生成的任何墓碑都不会被查询。

    请注意(基于删除模式)您仍然可以在给定的时间范围内拥有墓碑。但这里的想法是,WHERE 子句限制了“爆炸半径”,因此查询较少数量的墓碑应该不是问题。

    【讨论】:

    • 恐怕不能在 WHERE 子句中使用大于特定时间。我正在处理比当前时间早 5 分钟的表中的数据。目前我正在处理我的代码中的逻辑。但是对于新的表结构,根据您的建议,我需要使用 WHERE 子句作为SELECT * FROM messages WHERE day='20210827' AND message_time < current_timestamp - 5 minutes 进行查询,但我看到这将扫描当天的大部分记录,因为我们随着时间的推移而前进。
    • @CKP 即使您从 WHERE 子句中删除了 message_time 过滤器,您仍然只能扫描一天的消息,而不是来自多个分区(如您的原始查询所示) .无论我的回答中的具体细节如何,这里的主要目标是进行调整,以便您不会查询太多的墓碑。继续努力,您应该会看到一些改进。
    • 是的,亚伦,我同意。只是想看看WHERE子句是否有任何改进,以便我们可以扫描更少的墓碑。另外,我计划将 gc_grace_seconds 减少到 1 天。你觉得它有什么问题吗?
    【解决方案2】:

    很遗憾,没有快速解决您的问题的方法。

    您面临的挑战是您将 Cassandra 用作队列,这不是一个好主意,因为您正好遇到了墓碑地狱。我相信您现在已经看到 this blog post 谈到队列和类似队列的数据集是 Cassandra 的反模式。

    如果您在存储桶中对数据进行不同的建模,并且每个存储桶都映射到一个表,则可以避免生成大量墓碑。处理完存储桶中的所有项目后,TRUNCATE 表。这个想法来自 Ryan Svihla 在他的博客文章Understanding Deletes 中,他在其中经历了“分区表”的想法。干杯!

    【讨论】:

    • 我之前曾想过类似的方法,但我看到我们在代码级别增加了更多复杂性。此外,我们不想在生产中截断表,因为如果在处理表中的数据时出现任何问题,可能会导致数据丢失。显然我们可以通过多种方法来处理它,但是我们将再次增加代码的复杂性,并且更多的数据库调用意味着它更容易出错。
    • 复杂性来自这样一个事实,即您的用例是 Cassandra 的反模式,因此您需要进行必要的调整以使其工作。干杯!
    猜你喜欢
    • 2018-09-06
    • 2019-06-24
    • 2019-06-18
    • 2013-01-14
    • 2019-07-10
    • 2018-04-15
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    相关资源
    最近更新 更多