在表上运行scrub是否会加入SSTables?

时间:2018-07-25 16:53:50

标签: cassandra nodetool

我的表启用了时间窗口压缩策略(TWCS),由于某种原因,我有很多带有墓碑的SStables。

当我对单个sstable运行手动压缩时,不会将其删除。如果我运行一个reapir,它将把所有sstables合并到一个中,这会破坏TWCS。

根据有关nodetool scrub命令的文档:

  

Scrub会自动丢弃损坏的数据,并删除超出表gc_grace期限的所有逻辑删除行。

这会加入所有的sstables吗?

1 个答案:

答案 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中。

我希望这会有所帮助,并且我不会错过任何事情:)。