Cassandra何时删除后删除了数据?

时间:2016-06-16 20:54:16

标签: cassandra cassandra-2.0

最近我一直在努力让自己熟悉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版本。

2 个答案:

答案 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)。希望如果你和我有同样的问题会有所帮助!