最近我一直在努力让自己熟悉Cassandra,但是在删除数据后从磁盘中删除数据时并不太清楚。特别感兴趣的用例是使用DTCS使时间序列数据到期。例如,请考虑下表:
CREATE TABLE metrics (
metric_id text,
time timestamp,
value double,
PRIMARY KEY (metric_id, time),
) WITH CLUSTERING ORDER BY (time DESC) AND
default_time_to_live = 86400 AND
gc_grace_seconds = 3600 AND
compaction = {
'class': 'DateTieredCompactionStrategy',
'timestamp_resolution':'MICROSECONDS',
'base_time_seconds':'3600',
'max_sstable_age_days':'365',
'min_threshold':'4'
};
据我所知,Cassandra将在24小时(86400秒)后为插入此表的所有行创建一个墓碑。这些墓碑将首先写入内存中的Memtable,然后在Memtable达到一定大小时作为SSTable刷新到磁盘。我的问题是,现在过期的数据何时会从磁盘中删除?是下次包含数据的SSTable被压缩了吗?因此,在DTCS和min_threshold
设置为4的情况下,我们将等到至少三个其他SSTable与过期数据在同一时间窗口中,然后这些SSTable将被压缩为SSTable。在此压缩过程中是否会删除数据?在我看来,这将需要Cassandra维护一些已删除行的元数据,因为较新的逻辑删除可能不会在正在压缩的旧SSTable中。
或者,包含逻辑删除的SSTables是否必须使用包含要删除的数据的过期数据的SSTable进行压缩?在我看来,这可能导致Cassandra在过期后持有过期数据,因为它等待新的墓碑用旧的过期数据压缩。
最后,我还不确定何时删除了墓碑本身。我知道Cassandra直到gc_grace_seconds
之后才删除它们,但它不能删除墓碑,直到它确定过期数据已被删除为止?否则,它会看到过期数据有效。因此,在我看来,删除墓碑的问题与上述问题密切相关。谢谢!
如果它有助于我自己尝试使用2.0.15版本。
答案 0 :(得分:3)
有两种方法可以明确地删除Cassandra中的数据。
1:当gc_grace_seconds到期时。在您的表中,gc_grace_seconds设置为3600.这意味着当您在行上执行delete语句时。在从所有群集中明确删除数据之前,您必须等待3600秒。
2:当压缩进入时。在压缩过程中,Cassandra会查找标记有墓碑的所有数据,并在编写新的SSTable时忽略它,以确保新的SSTable尚未删除数据。
但是,如果某个节点的停机时间超过gc_grace_seconds,或者在压缩过程中,您可能会在Cassandra documentation.
中找到更多信息答案 1 :(得分:1)
经过一些进一步的研究和其他人的帮助,我意识到我在原来的问题中有一些误解。具体来说:" TTL删除的数据与发布删除不同 - 每个到期的单元格内部都有一个ttl / timestamp,它将被转换为逻辑删除。没有墓碑添加到记忆中,或刷新到磁盘 - 它只是将过期的单元格作为墓碑一旦超过该时间戳即可。"
此外,Cassandra将检查当memtable被刷新到磁盘并且运行次要压缩时,是否可以丢弃仅包含过期数据的SSTable,但每10分钟不超过一次(see this issue)。希望如果你和我有同样的问题会有所帮助!