Cassandra 文档

版本

您正在查看预发布版本的文档。

时间窗口压缩策略 (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 显式设置时间戳的查询。此外,用户应该运行频繁的修复(以这样一种方式流式传输数据,使其不会混合)。

SizeTieredCompactionStrategy 是默认的压缩策略。任何其他压缩策略都必须在 cassandra.yaml 文件中定义。

TWCS 选项

子属性 描述

enabled

启用后台压缩。默认值:true

tombstone_compaction_interval

创建 SSTable 后 Cassandra 考虑对 SSTable 进行 tombstone 压缩的最小秒数。如果表超过了 tombstone_threshold 比例,则 SSTable 有资格进行 tombstone 压缩。默认值:86400

tombstone_threshold

可回收 tombstone 与所有包含列的比例。如果比例超过此限制,Cassandra 将单独对该表开始压缩,以清除 tombstone。默认值:0.2

unchecked_tombstone_compaction

如果设置为 true,则允许 Cassandra 在不预先检查哪些表有资格进行此操作的情况下运行 tombstone 压缩。即使没有此预先检查,Cassandra 也会检查 SSTable 以确保删除 tombstone 是安全的。默认值:false

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 的情况下被删除。这是一个可能存在风险的选项,会导致数据丢失或已删除的数据重新出现,超出 unchecked_tombstone_compaction 对单个 SSTable 压缩所做的操作。由于存在风险,JVM 还必须使用以下选项启动:-Dcassandra unsafe_aggressive_sstable_expiration=true。默认:false

总而言之,操作员可以指定几乎任何大小的窗口,TWCS 将努力为该窗口内的写入创建一个单个 SSTable。为了提高写入效率,最新的窗口将使用 STCS 进行压缩。

理想情况下,操作员应该选择一个 compaction_window_unitcompaction_window_size 对,以产生大约 20-30 个窗口。例如,如果使用 90 天 TTL 写入,则 3 天窗口将是一个合理的选择,将选项设置为 'compaction_window_unit':'DAYS' and 'compaction_window_size':3

更改 TimeWindowCompactionStrategy 选项

希望在现有数据上启用 TWCS 的操作员应该考虑首先运行主要压缩,将所有现有数据放入单个(旧)窗口中。随后的较新写入将按预期创建典型的 SSTable。

希望更改 compaction_window_unitcompaction_window_size 的操作员可以这样做,但可能会触发额外的压缩,因为相邻窗口将合并在一起。如果窗口大小减小(例如,从 24 小时到 12 小时),则现有 SSTable 不会被修改。TWCS 无法将现有 SSTable 拆分成多个窗口。