cassandra - 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 ),但这并没有发生。
解决方案
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 时的规则与压缩策略无关),它只是另一种保持“干净”的方法。
希望有帮助。
推荐阅读
- mysql - 如何在MYSQL查询中匹配精确值
- corda - 在 Corda 中,`KryoException: Encountered unregistered class ID` 尽管注册了类
- postgresql - 访问数据库 postgresql:密码验证失败
- shell - Shell“期望”脚本,“发送”命令后如何获取返回值
- c++ - C++模板继承隐藏模板参数
- php - 递归函数将多维数组中的特定键移动到他的级别的底部
- reactjs - 通过星号导出大于导入
- react-native - 常见的变量或如何在 React 本机应用程序中导出变量
- google-apps-script - 如何在运行时删除谷歌表单的表单响应?
- python - 在 python 中使用递归来组合可变大小的列表