使用默认的TTL列,但卡桑德拉的墓碑数量很多

问题描述:

我使用Cassandra 3.0.12。使用默认的TTL列,但卡桑德拉的墓碑数量很多

而且我有一个卡桑德拉柱族,或与下面的模式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?

我使用一些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为真?

另一个问题,我选择的数据的订购相同的秩序, 为什么卡桑德拉击中这么多的墓碑?

为什么卡桑德拉仍然警告墓碑,因为我设置了default_time_to_live?

TTL在Cassandra中的工作方式是一旦记录过期,其标记为墓碑(删除记录的同一个过程)。因此,Cassandra不是在RDBMS世界中手动进行清除工作,而是可以根据其TTL清除旧记录。但是它仍然通过与DELETE相同的过程并因此遵循墓碑。由于您的TTL值为'2592000'(30天),表中超过30天的任何内容都会过期(标记为逻辑删除)。

现在警告的原因是您的SELECT语句正在查找活动(未删除)的记录,并且警告消息是在过程中遇到了多少个逻辑删除(过期/删除)记录。因此,在尝试提供9999个活着的记录时,表格沿途有X个墓碑。

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

这是文档参考,以防您想要阅读更多内容。

自列创建超过TTL值以来的秒数后,TTL数据被视为已过期并包含在结果中。在读取路径上的下一次读取之后,到期的数据将标记为逻辑删除,但最多保留gc_grace_seconds。

高于参考值是从这个link

它似乎我可以设置unchecked_tombstone_compaction为真?

它与你所得到的警告没有任何关系。您可以考虑减少gc_grace_seconds值(默认10天)以更快地清除墓碑。但是这个价值有10天是有原因的。

请注意,DateTieriedCompactionStrategy已被删除,一旦升级到3.11 Apache Cassandra或DSE 5.1.2,就会有TimeWindowCompactionStrategy,它在处理逻辑删除方面做得更好。

+0

谢谢。 “但是当一个记录超过表级TTL时,Cassandra会立即删除它,而不会进行墓碑或压缩。”它说,数据应立即删除,不得墓碑... – hopex40

+0

这是你的误解,我试图澄清。如果您想阅读更多内容,请在我的答案中添加相应的文档参考。 – dilsingi

+0

我会在理解之前减少gc_grace_seconds。我需要在30天内查询此表中特定cust_id的所有数据。我认为TimeWindowCompactionStrategy可能需要为我的查询扫描所有sstables,所以也许不是一个好的选择。 – hopex40