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;
INSERT INTO temp.test_ttl (key,value) VALUES ('k1','v1');
nodetool flush temp
sstabledump mc-1-big-Data.db
- 等待180秒(默认的TTL)
sstabledump mc-1-big-Data.db
这时没有生成墓碑(tombstone)nodetool compact temp
sstabledump mc-2-big-Data.db
这时生成了墓碑(但由于gc_grace_seconds而在压缩时未被删除)
本例使用的是apache cassandra 3.0.13进行测试。
从例子中我们可以得出结论,在3.0.13版本中,使用default_time_to_live
并不意味着不需要墓碑(tombstone)。然而这只是一个非常简单的测试,并且使用nodetool compact
来强制进行了主压缩,因此可能并没有重新创建默认TTL所适用的情形。
但是,C*如何在没有墓碑的情况下进行删除呢?这样与每次插入时使用TTL有何不同呢?