【问题标题】:Using default TTL columns but high number of tombstones in Cassandra在 Cassandra 中使用默认 TTL 列但墓碑数量较多
【发布时间】:2018-01-06 05:11:45
【问题描述】:

我使用 Cassandra 3.0.12。

我有一个 cassandra 列族,或具有以下架构的 CQL 表:

CREATE TABLE win30 (
    cust_id text,
    tid timeuuid,
    info text,
    PRIMARY KEY (cust_id , tid )
) WITH CLUSTERING ORDER BY (tid DESC) 
and compaction = {'class': 'DateTieredCompactionStrategy', 'max_sstable_age_days': 31 };

alter table win30 with default_time_to_live = '2592000';

我已经为整个表设置了 default_time_to_live 属性,但是当我查询该表时,

select * from win30 order by tid desc limit 9999

卡桑德拉警告

Read xx live rows and xxxx tombstone for query  xxxxxx (see tombstone_warn_threshold).

根据这个文档How is data deleted

Cassandra 允许您设置 default_time_to_live 属性 整张桌子。处理标有常规 TTL 的列和行 如上所述;但是当一条记录超过表级TTL时, Cassandra 会立即将其删除,无需立碑或压缩。

“但是当一条记录超过表级别的 TTL 时,Cassandra 会立即将其删除,无需立碑或压缩。”

既然我设置了 default_time_to_live,为什么 Cassandra 仍然对墓碑发出警告?

我使用类似 CQL 的方式插入数据,而不使用 TTL。

insert into win30 (cust_id, tid, info ) values ('123', now(), 'sometext'); 

a similar question but it does not use default_time_to_live

看来我可以将 unchecked_tombstone_compaction 设置为 true?

另一个问题,我选择排序与聚类顺序相同的数据, 为什么卡桑德拉撞了这么多墓碑?

【问题讨论】:

    标签: cql3 cassandra-3.0


    【解决方案1】:

    既然我设置了 default_time_to_live,为什么 Cassandra 仍然对 tombstone 发出警告?

    TTL 在 Cassandra 中的工作方式是,一旦记录过期,它就会被标记为墓碑(删除记录的过程相同)。因此,Cassandra 可以让您根据旧记录的 TTL 清理旧记录,而不是在 RDBMS 世界中手动执行清除作业。但它仍然遵循与删除相同的过程,因此是墓碑。由于您的 TTL 值为“2592000”(30 天),因此表中超过 30 天的任何内容都会过期(标记为墓碑 - 已删除)。

    现在发出警告的原因是您的 SELECT 语句正在寻找活动(未删除)的记录,而警告消息是关于在该过程中遇到了多少条墓碑(过期/删除)的记录。因此,在尝试提供 9999 条活着的记录时,该表在途中遇到了 X 个墓碑。

    由于 TTL 是在表级别设置的,因此任何插入到该表的记录都将具有 30 天的默认 TTL。

    这里是文档参考,如果您想了解更多信息。

    在列创建后的秒数超过 TTL 值后,TTL 数据被视为过期并包含在结果中。过期数据在读取路径上的下一次读取之后用墓碑标记,但最多保留 gc_grace_seconds。

    以上参考来自这个link

    看来我可以将 unchecked_tombstone_compaction 设置为 true?

    它与您收到的警告无关。您可以考虑减少 gc_grace_seconds 值(默认为 10 天)以更快地摆脱墓碑。但是这个值是 10 天是有原因的。

    请注意,DateTiieredCompactionStrategy 已被弃用,一旦升级到 3.11 Apache Cassandra 或 DSE 5.1.2,TimeWindowCompactionStrategy 可以更好地处理墓碑。

    【讨论】:

    • 谢谢。 “但是当一条记录超过表级 TTL 时,Cassandra 会立即将其删除,无需进行墓碑化或压缩。”它说应该立即删除数据而不用墓碑...
    • 这是您的误解,我想澄清一下。如果您想阅读更多内容,还添加了对我的答案的相应文档参考。
    • 在我理解这一点之前,我会减少 gc_grace_seconds。我需要在 30 天内查询此表中特定 cust_id 的所有数据。我认为 TimeWindowCompactionStrategy 可能需要为我的查询扫描所有 sstables,所以可能不是一个好的选择。
    • 如果没有其他问题可以接受我的回答
    • 我知道 tombstone、TTL 和 compaction。我只是想知道为什么 Cassandra 的行为不像 default_time_to_live 属性描述的文档那样——“立即删除它,没有 tombstoneing 或 compaction”。DTCS 删除整个SSTable 一旦 SSTable 中的所有数据都过期了,但是我找不到任何关于“立即删除”的实现。 datastax.com/dev/blog/datetieredcompactionstrategy, "一旦 SSTable 中的所有数据都过期,让我们删除整个 SSTable"
    猜你喜欢
    • 2014-11-06
    • 2019-07-09
    • 2023-03-08
    • 2018-10-16
    • 2018-12-11
    • 2019-02-21
    • 2014-09-09
    • 2015-06-14
    • 2017-08-22
    相关资源
    最近更新 更多