我的表启用了时间窗口压缩策略(TWCS),由于某种原因,我有很多带有墓碑的SStables。
当我对单个sstable运行手动压缩时,不会将其删除。如果我运行一个reapir,它将把所有sstables合并到一个中,这会破坏TWCS。
根据有关nodetool scrub命令的文档:
Scrub会自动丢弃损坏的数据,并删除超出表gc_grace期限的所有逻辑删除行。
这会加入所有的sstables吗?
答案 0 :(得分:3)
简短的回答:灌木丛未加入sstables。
长答案:继续阅读。
我已经检查了Cassandra 3.11.2中的代码,但是在3.0和2.2上,代码相似。
使用压缩线程并行清理sstable,每个线程清理一个sstable。
正如您在ColumnFamilyStore.java中所看到的那样,scrub命令是使用CompactionManager线程运行的。
要检查的有趣功能是parallelAllSSTableOperation。属于该表的所有活动的sstable(不包括标记为可疑的(例如,由于压缩过程中的某些异常))被标记为压缩,该表上运行的所有压缩均为paused,并且针对{{3 }},同时进行。
在scrub的情况下,操作为each sstable,它调用scrubOne。这将淘汰旧的sstable并创建一个包含活动行的新sstable。
在parallelAllSSTableOperation的末尾,标记为压缩的sstable的列表应该为空,并且该操作成功。不执行sstables的连接。
因此,您可以看到清理工具具有侵入性:它淘汰了旧的sstables,丢弃了墓碑,并将活动行保留在新的sstables中。
我希望这会有所帮助,并且我不会错过任何事情:)。