Cassandra - 在表上插入 TTL 和使用 TTL 插入数据有什么区别



我有一个Cassandra 2.1集群,我们通过带有TTL的Java插入数据,因为持久化数据的要求是30天。 但这会导致问题,因为带有逻辑删除的旧数据的文件保存在磁盘上。这会导致磁盘空间被不需要的数据占用。修复需要大量时间来清除此数据(单个节点上最多 3 天) 有没有更好的方法来删除数据?

我在datastax上遇到过这个

Cassandra 允许您为整个表设置 default_time_to_live 属性。用常规 TTL 标记的列和行按上述方式进行处理;但是当记录超过表级 TTL 时,Cassandra 会立即将其删除,而不会进行逻辑删除或压缩。https://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlAboutDeletes.html?hl=tombstone

如果我在表级别设置 TTL 而不是每次插入时都设置,数据是否会更有效地删除。 此外,文档适用于 Cassandra 3,所以我必须升级到更新的版本才能获得任何好处吗?

设置default_time_to_live将默认的 ttl 应用于表中的所有行和列 - 如果没有设置单独的 ttl(并且 Cassandra 在所有节点上都有正确的 ntp 时间),Cassandra 可以轻松地安全地删除这些数据。

但请记住一些事项:您的应用程序仍然可以为表中的单行设置特定的 ttl - 然后将应用正常处理。最重要的是,即使数据被编辑,它也不会立即被删除 - sstables 仍然是不可变的,但逻辑删除将在压缩过程中被删除。

真正可以帮助您的 - 只是猜测 - 将是一个合适的压实策略:

http://docs.datastax.com/en/archived/cassandra/3.x/cassandra/dml/dmlHowDataMaintain.html#dmlHowDataMaintain__twcs-compaction

时间窗口压实策略 (TWCS) 建议用于时序和即将过期的 TTL 工作负载。

TimeWindowCompactactionStrategy(TWCS)类似于DTCS,具有 更简单的设置。TWCS使用一系列时间窗口对SSTable进行分组。 在压实过程中,TWCS将STCS应用于未压实的SSTables。 最近的时间窗口。在时间窗口结束时,TWCS压缩 属于该时间窗口的所有 SSTable 到单个 SSTable 中 基于 SSTable 最大时间戳。曾经的主要压实 时间窗口完成,不会进一步压缩数据 曾经发生过。该过程从写入 下一个时间窗口。

这很有帮助 - 在正确选择时间窗口时。最后一个压缩的 sstable 中的所有数据都将具有大致相等的 ttl 值(提示:不要进行乱序插入或手动 ttls!Cassandra 在 sstable 元数据中保留最年轻的 ttl 值,当该时间过去时,Cassandra 只是删除整个表,因为所有数据现在都已经过时了。无需压实。

您如何进行维修?增量?满?收割者?您的集群在节点和数据方面有多大?

快速回答是肯定的。它的实现方式是直接从磁盘中删除 SStable。删除 SStable 而无需压缩将更快地清理磁盘空间。但是,您需要确保特定 sstable 中的所有数据都比表的全局配置的 TTL "旧"。

这就是你引用的段落中提到的特征。它是为Cassandra 2.0实现的,所以它应该是2.1的一部分

最新更新