时间窗口压缩策略 (TWCS)
统一压缩策略 (UCS) 是从 Cassandra 5.0 开始大多数工作负载推荐的压缩策略。如果您要创建新表,请使用此策略。 |
TimeWindowCompactionStrategy
(TWCS) 是时间序列和过期生存时间 (TTL) 工作负载推荐的压缩策略。如果工作负载按时间戳分组数据,则可以使用 TWCS 按时间窗口分组 SSTable,然后在 SSTable 过期时删除整个 SSTable。因此,与使用 STCS 或 LCS 相比,可以更可靠地回收磁盘空间。
TWCS 使用一系列时间窗口桶压缩 SSTable。在活动时间窗口期间,TWCS 使用 STCS 将从内存中刷新到更大的 SSTable 的所有 SSTable 压缩在一起。在时间段结束时,所有这些 SSTable 都根据 SSTable 最大时间戳压缩成单个 SSTable。完成时间窗口的主要压缩后,数据将不再进行任何进一步的压缩。该过程从下一个时间窗口中写入的 SSTable 开始。请注意,每个 TWCS 时间窗口包含不同数量的数据。然后下一个时间窗口开始,该过程重复。
TimeWindowCompactionStrategy 操作注意事项
TWCS 的主要动机是按时间戳将磁盘上的数据分开,并允许更有效地删除完全过期的 SSTable。如果数据以乱序写入 SSTable,新数据和旧数据在同一个 SSTable 中,则这种最佳行为可能会被破坏。
乱序数据可能以两种方式出现
-
如果用户在传统的写入路径中混合了旧数据和新数据,则数据将在 memtable 中混合,并被刷新到同一个 SSTable 中,在那里它们将保持混合状态。
-
如果用户对旧数据的读取请求导致读取修复,从而将旧数据拉入当前 memtable,则该数据将被混合并刷新到同一个 SSTable 中。
虽然 TWCS 试图将混合数据的影響降到最低,但用户应该尽量避免这种行为。具体来说,用户应该避免使用 CQL USING TIMESTAMP
显式设置时间戳的查询。此外,用户应该运行频繁的修复(以这样一种方式流式传输数据,使其不会混合)。
|
TWCS 选项
子属性 | 描述 |
---|---|
enabled |
启用后台压缩。默认值:true |
tombstone_compaction_interval |
创建 SSTable 后 Cassandra 考虑对 SSTable 进行 tombstone 压缩的最小秒数。如果表超过了 |
tombstone_threshold |
可回收 tombstone 与所有包含列的比例。如果比例超过此限制,Cassandra 将单独对该表开始压缩,以清除 tombstone。默认值:0.2 |
unchecked_tombstone_compaction |
如果设置为 |
log_all |
为整个集群激活高级日志记录。默认值:false |
compaction_window_unit |
用于定义桶大小的时间单位。该值基于 Java TimeUnit。有关有效值的列表,请参阅位于 docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html 的 Java API TimeUnit 页面。默认:天 |
compaction_window_size |
每个桶的单位。默认值:1 |
timestamp_resolution |
插入数据时使用的时间戳分辨率,可以是 MILLISECONDS、MICROSECONDS 等(应为 Java TimeUnit 可理解)。除非您使用 USING TIMESTAMP(或客户端中的等效项)进行变异,否则不要更改此值。默认:微秒 |
expired_sstable_check_frequency_seconds |
确定检查过期 SSTable 的频率。默认:10 分钟 |
unsafe_aggressive_sstable_expiration |
过期 SSTable 将在不检查其数据是否正在遮蔽其他 SSTable 的情况下被删除。这是一个可能存在风险的选项,会导致数据丢失或已删除的数据重新出现,超出 |
总而言之,操作员可以指定几乎任何大小的窗口,TWCS 将努力为该窗口内的写入创建一个单个 SSTable。为了提高写入效率,最新的窗口将使用 STCS 进行压缩。
理想情况下,操作员应该选择一个 compaction_window_unit
和 compaction_window_size
对,以产生大约 20-30 个窗口。例如,如果使用 90 天 TTL 写入,则 3 天窗口将是一个合理的选择,将选项设置为 'compaction_window_unit':'DAYS' and 'compaction_window_size':3
。