如何在Cassandra中使用default_time_to_live删除没有墓碑的行?

8

数据如何删除?

Cassandra允许您为整个表设置default_time_to_live属性。标记有常规TTL的列和行将按上述描述进行处理;但是,当记录超过表级TTL时,Cassandra会立即删除它,而不会生成墓碑或压缩

这也在这里回答了

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

并在LastPickle的帖子关于删除和墓碑中发表评论

探索的另一个线索是使用TTL作为默认值(如果适合)。在表级别设置的TTL与'default_time_to_live' 在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 enter image description here
  4. 等待180秒(默认的TTL)
  5. sstabledump mc-1-big-Data.db enter image description here 这时没有生成墓碑(tombstone)
  6. nodetool compact temp
  7. sstabledump mc-2-big-Data.db enter image description here 这时生成了墓碑(但由于gc_grace_seconds而在压缩时未被删除)

本例使用的是apache cassandra 3.0.13进行测试。

从例子中我们可以得出结论,在3.0.13版本中,使用default_time_to_live并不意味着不需要墓碑(tombstone)。然而这只是一个非常简单的测试,并且使用nodetool compact来强制进行了主压缩,因此可能并没有重新创建默认TTL所适用的情形。

但是,C*如何在没有墓碑的情况下进行删除呢?这样与每次插入时使用TTL有何不同呢?


你看过这篇博客文章吗?http://thelastpickle.com/blog/2016/07/27/about-deletes-and-tombstones.html - Alex Ott
是的,它在问题中被引用。 - gabrielgiussi
2个回答

7
我被你在博客上回答问题时提到的那篇文档所骗了(The Last Pickle Blog)。我可能回答得太快了,即使我写了这个东西“去探索”,甚至说我没有明确尝试过。
另一个值得探索的线索是,如果适用的话,使用TTL作为默认值。在表级别设置的TTL(使用 'default_time_to_live')在C*3.0 +中不应该产生任何墓碑。虽然我没有亲自测试过,但我读过这个。
所以我的上面的话是错的。基本上,TTL可以被查询级别的TTL覆盖,并且我不知道Cassandra如何在没有墓碑的情况下处理此类情况。
从示例中我得出结论,对于版本3.0.13,default_time_to_live不需要墓碑并不是真的。
此外,我很高兴看到你没有相信我或Datastax文档,而是自己尝试了一下。这绝对是正确的方法。
但是,C *要如何删除而不使用墓碑呢?为什么这应该是使用每个插入的TTL的不同情况呢?
是的,就是这样。
致意。
阿兰·罗德里格斯 - @arodream - alain@thelastpickle.com 法国/西班牙
The Last Pickle - Apache Cassandra咨询 http://www.thelastpickle.com

2
据我所知,墓碑记录和已过期TTL的记录之间没有太大区别。在您的情况下,强制进行主要压缩将TTL过期的记录转换为墓碑记录,但由于gc_grace_seconds的存在,它并未被清除。根据这个presentation,墓碑记录/ TTL过期记录会在以下情况下消失:
  • 在gc_grace_seconds时间内不会消失
  • 在压缩期间,对于已经过了gc_grace的墓碑记录/TTL,它的分区键将与给定表的所有其他SSTable的布隆过滤器进行比较
  • 如果有布隆过滤器冲突,则即使冲突是错误的阳性,墓碑记录也将保留。
  • 如果在任何SSTable中存在该分区的其他墓碑记录或数据,则该墓碑记录将不会被清理
  • 如果布隆过滤器表明该分区键不存在重叠的可能性,则墓碑记录将被清理。
因此,从技术上讲,在gc_grace之后,墓碑记录/TTL可能会消失,但不能保证。

这个问题是关于一个前提,即默认的生存时间不需要墓碑,而不是显式删除与ttl删除之间的区别。 你说的是对的,但并没有回答我的问题。 - gabrielgiussi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接