【问题标题】:How default_time_to_live would delete rows without tombstones in Cassandra?default_time_to_live 如何在 Cassandra 中删除没有墓碑的行?
【发布时间】:2019-02-16 08:20:45
【问题描述】:

来自How is data deleted?

Cassandra 允许您为整个表设置 default_time_to_live 属性。用常规 TTL 标记的列和行按上述处理;但是当一条记录超过表级 TTL 时,Cassandra 会立即将其删除,不会进行逻辑删除或压缩

这也是回答here

如果表上有 default_time_to_live,则超过此时间限制的行将立即删除,而不写入墓碑

并在 LastPickle 的帖子中评论About deletes and tombstones

另一个需要探索的线索是使用 TTL 作为默认值(如果合适的话)。在表级别使用“default_time_to_live”设置的 TTL 在 C*3.0+ 中根本不应该生成任何墓碑。没有在我手上测试过,但我读到过这个。

我使用LeveledCompactionStrategy 进行了我能想象到的最简单的测试:

CREATE KEYSPACE IF NOT EXISTS temp WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};

CREATE TABLE IF NOT EXISTS temp.test_ttl (
    key text,
    value text,
    PRIMARY KEY (key)
) WITH  compaction = { 'class': 'LeveledCompactionStrategy'}
  AND default_time_to_live = 180;
  1. INSERT INTO temp.test_ttl (key,value) VALUES ('k1','v1');
  2. nodetool flush temp
  3. sstabledump mc-1-big-Data.db
  4. 等待 180 秒(default_time_to_live)
  5. sstabledump mc-1-big-Data.db 墓碑尚未创建
  6. nodetool compact temp
  7. sstabledump mc-2-big-Data.db tombstone 已创建(由于 gc_grace_seconds 而不会在压缩时删除)

测试是使用 apache cassandra 3.0.13 进行的

从示例中我得出结论,default_time_to_live 不需要墓碑,至少对于 3.0.13 版本来说是不正确的。 然而,这是一个非常简单的测试,我正在强制使用nodetool compact 进行主要压缩,所以我可能不会重新创建 default_time_to_live 魔法发挥作用的场景。

但是如果没有墓碑,C* 怎么删除呢?为什么这与每次插入都使用 TTL 不同?

【问题讨论】:

标签: cassandra cassandra-3.0


【解决方案1】:

我被您在我们的博客 (The Last Pickle Blog) 上回答这个问题时提到的文档愚弄了。我可能回答得太快了,尽管我写了一个“探索”的东西,甚至说我没有明确地尝试过。

另一个探索的线索是使用 TTL 作为默认值,如果 这很合适。在表级别设置的 TTL 'default_time_to_live' 根本不应该生成任何墓碑 C*3.0+。没有在我手上测试过,但我读到过这个。

所以我上面的句子是错误的。基本上,默认值可以在查询级别被 TTL 覆盖,我看不出 Cassandra 如何在没有墓碑的情况下处理这个问题。

从示例中我得出结论,这不是真的 default_time_to_live 不需要墓碑,至少对于版本 3.0.13.

另外,我很高兴看到您不相信我或 Datastax 文档,而是自己尝试了。这绝对是正确的方法。

但是如果没有墓碑,C* 怎么删除呢?为什么这应该是一个 每次插入使用 TTL 的不同场景?

是的,正是这个,

C*heers.


Alain Rodriguez - @arodream - alain@thelastpickle.com 法国/西班牙

最后的泡菜 - Apache Cassandra 咨询 http://www.thelastpickle.com

【讨论】:

    【解决方案2】:

    AFAIK 墓碑记录与 TTL 过期的记录之间没有太大区别。在您的情况下,强制主要压缩将 TTL 过期记录转换为墓碑,但由于 gc_grace_seconds 未清除它。根据这个presentation,tombstones/ttl-expired-records 消失了:

    • gc_grace_seconds 之前从未有过
    • 在压缩期间,对于超过 gc_grace 的 tombstone/ttl,它的分区键会针对给定表的所有其他 SSTables 的布隆过滤器进行检查
    • 如果存在布隆过滤器冲突,墓碑将保留,即使冲突是误报。
    • 如果任何 SSTable 中有任何数据,甚至该分区的其他 tombstone,则 tombstone 不会被清理
    • 如果布隆过滤器表明该分区键上没有重叠的可能性,则墓碑将被清理。

    所以从技术上讲,tombstone/ttl 可能会在 gc_grace 之后消失,但不能保证。

    【讨论】:

    • 问题是关于 default_time_to_live 不需要墓碑的前提,而不是关于显式删除与 ttl 删除的前提。你说的是真的,但没有回答我的问题。
    猜你喜欢
    • 2015-06-04
    • 2017-10-03
    • 1970-01-01
    • 2018-10-16
    • 2014-10-16
    • 2023-03-08
    • 2019-07-09
    • 2015-02-25
    • 2015-11-18
    相关资源
    最近更新 更多