首页 > 解决方案 > TWCS 没有根据 window_size 和 window_unit 生成 SStables

问题描述

我需要在 10 分钟后生成 SSTable,但是使用 TWCS 并设置“compaction_window_size”和“compaction_window_unit”,我无法理解何时生成 SSTable。

我已经尝试了所有许多组合,但我无法弄清楚何时创建 SSTables

CREATE TABLE twcs.twcs2 (
    id int PRIMARY KEY,
    age int,
    name text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy', 'compaction_window_size': '1', 'compaction_window_unit': 'MINUTES', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 3600
    AND gc_grace_seconds = 60
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

在这里,我设置了 'compaction_window_unit'='MINUTES' 和 'compaction_window_size': '1' ,因此如果对表执行某些操作(插入/删除/更新数据),则应在每 1 分钟后生成 SSTables ),但这并没有发生。

标签: cassandra

解决方案


TWCS 是一种压缩策略。压缩策略与生成的 sstables 无关。一旦它们被创建,它就是一个协调和清理“算法”。TWCS 的工作方式是将 sstables 合并到窗口中。这里的关键词是“整合”。无法保证 sstables 会在该时间范围内“生成”,但是在窗口期满后生成的任何 IS 都将被合并在一起。因此,如果您有每小时的窗口/存储桶,那么在那一小时内可能会或可能不会生成 sstables。如果在窗口期间创建了多个 sstable,则使用 STCS(将类似大小的 sstable 合并在一起)对它们进行压缩/合并/协调。一个小时过去后,该窗口保留的任何 sstable 都将被压缩到一个单一的 sstable 中。随着时间的推移,您将在每个窗口中看到一个 sstable(如果在该窗口期间没有生成任何内容,则没有)。在您的 TTL 和 gc_grace 通过后,整个窗口都会被删除(而不是与其他窗口合并然后删除过期记录的大量工作)。

如果窗口中的行没有重叠,则 TWCS 工作得很好。如果有重叠,那么最旧的窗口 sstable 将无法被删除,直到具有重叠记录的最新 sstable 过期。换句话说,TWCS 适用于不跨窗口的 INSERTS(请记住,更新和删除也被视为插入)。您需要确保使用 TTL 进行清理(即不要运行删除语句,因为这会导致重叠)。另外,根据我使用它的发现,确保关闭对具有 TWCS 的表的修复,因为这可能会导致大问题(看不见的重叠)。

所以简而言之,TWCS 不会导致生成 sstables(创建 sstables 时的规则与压缩策略无关),它只是另一种保持“干净”的方法。

希望有帮助。


推荐阅读