使用默认的 TTL 列,但 Cassandra 中的墓碑数量很多

Using default TTL columns but high number of tombstones in Cassandra

我使用的是 Cassandra 3.0.12。

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

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';

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

select * from win30 order by tid desc limit 9999

Cassandra 警告

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

根据此文档 How is data deleted

Cassandra allows you to set a default_time_to_live property for an entire table. Columns and rows marked with regular TTLs are processed as described above; but when a record exceeds the table-level TTL, Cassandra deletes it immediately, without tombstoning or compaction.

"but when a record exceeds the table-level TTL,Cassandra deletes it immediately, without tombstoning or compaction."

为什么我设置了 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?

另外一个问题,我select数据的排序和CLUSTERING ORDER一样, 为什么Cassandra会撞那么多墓碑?

Why Cassandra still WARN for tombstone since I have set a default_time_to_live?

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

现在出现警告的原因是您的 SELECT 语句正在寻找活动的(未删除的)记录并且警告消息是关于在过程。因此,在尝试为 9999 条存活记录提供服务时,table 沿途命中了 X 数量的墓碑。

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

这里是文档参考,如果您想阅读更多内容。

After the number of seconds since the column's creation exceeds the TTL value, TTL data is considered expired and is included in results. Expired data is marked with a tombstone after on the next read on the read path, but it remains for a maximum of gc_grace_seconds.

以上参考来自此link

And it seems that I could set the unchecked_tombstone_compaction to true?

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

请注意,DateTieriedCompactionStrategy 已被删除,升级到 3.11 Apache Cassandra 或 DSE 5.1.2 后,TimeWindowCompactionStrategy 可以更好地处理墓碑。