default_time_to_live如何删除Cassandra中没有逻辑删除的行?

gab*_*ssi 4 cassandra cassandra-3.0

如何删除数据?

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

这里也回答

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

并在LastPickle的帖子中有关删除和墓碑中进行了评论

探索的另一个线索是,如果合适的话,可以使用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;
Run Code Online (Sandbox Code Playgroud)
  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 在此处输入图片说明墓碑创建(而不是由于gc_grace_seconds下降压实)

该测试是使用Apache Cassandra 3.0.13进行的

从示例中,我得出结论,default_time_to_live至少在3.0.13版中,不需要逻辑删除是不正确的。但是,这是一个非常简单的测试,我将对其进行强制压缩,nodetool compact因此我可能不会重新创建default_time_to_live魔术发挥作用的场景。

但是,如果没有墓碑,C *将如何删除?为什么与插入每个TTL使用不同的场景?

小智 5

当您在我们的博客(The Last Pickle Blog)上回答这个问题时,您被提到的那篇文档迷住了我。我可能对此回答得太快,即使我写了“探索”这件事,甚至说我没有明确尝试。

探索的另一个线索是,如果合适的话,可以使用TTL作为默认值。在表级别使用'default_time_to_live'设置的TTL 在C * 3.0 +中根本不会产生任何逻辑删除。尚未经过我的测试,但我读到了这件事。

所以我上面的句子是错误的。基本上,默认值可以在查询级别由TTL覆盖,并且我不知道Cassandra如何在没有逻辑删除的情况下进行处理。

从示例中,我得出结论,default_time_to_live至少在3.0.13版中,不需要逻辑删除是不正确的 。

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

但是,如果没有墓碑,C *将如何删除?为什么与插入每个TTL使用不同的场景?

是的,正是这样,

干杯。


阿兰·罗德里格斯(Alain Rodriguez)-@arodream-alain@thelastpickle.com法国/西班牙

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