【发布时间】:2019-02-16 08:20:45
【问题描述】:
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;
INSERT INTO temp.test_ttl (key,value) VALUES ('k1','v1');nodetool flush temp-
sstabledump mc-1-big-Data.db - 等待 180 秒(default_time_to_live)
-
sstabledump mc-1-big-Data.db墓碑尚未创建 nodetool compact temp-
sstabledump mc-2-big-Data.dbtombstone 已创建(由于 gc_grace_seconds 而不会在压缩时删除)
测试是使用 apache cassandra 3.0.13 进行的
从示例中我得出结论,default_time_to_live 不需要墓碑,至少对于 3.0.13 版本来说是不正确的。
然而,这是一个非常简单的测试,我正在强制使用nodetool compact 进行主要压缩,所以我可能不会重新创建 default_time_to_live 魔法发挥作用的场景。
但是如果没有墓碑,C* 怎么删除呢?为什么这与每次插入都使用 TTL 不同?
【问题讨论】:
-
您看过这篇博文吗? thelastpickle.com/blog/2016/07/27/…
-
是的,问题中引用了。