运行 清理 table 加入 SSTables 吗?
Does running scrub on a table joins SSTables?
我的 table 启用了时间 window 压缩策略 (TWCS),出于某种原因,我有很多 SStable 只是带有墓碑。
当我 运行 对单个 sstable 进行手动压缩时,它不会被删除。如果我 运行 重新修复,它将把所有 sstable 加入一个,这会破坏 TWCS。
根据 nodetool scrub 命令的文档:
Scrub automatically discards broken data and removes any tombstoned rows that have exceeded gc_grace period of the table.
这会加入所有 sstables 吗?
简答:scrub 没有加入 sstables。
长答案:继续阅读。
我查看了 Cassandra 3.11.2 中的代码,但代码在 3.0 和 2.2 上是相似的。
使用压缩线程并行清理 sstable,每个线程清理一个 sstable。
如您在 ColumnFamilyStore.java the scrub command is ran using the CompactionManager 个话题中所见。
要检查的有趣函数是 parallelAllSSTableOperation. All live sstables (excluding the ones marked as suspects - for instance because of some exceptions during compaction) belonging to the table are marked as compacting, all compactions running on that table are paused and the operation is executed against each sstable,并行。
在scrub的情况下,操作是scrubOne which calls the Scrubber.scrub()。这个废弃了旧的 sstable 并创建了一个包含实时行的新 sstable。
在 parallelAllSSTableOperation 结束时,标记为压缩的 sstables 列表应该为空,操作成功。没有执行 sstables 的连接。
因此,您可以看到清理工具是侵入性的:它废弃了旧的 sstables,丢弃逻辑删除并将活动行保留在新的 sstables 中。
我希望这对你有所帮助,我没有遗漏任何东西:)。
我的 table 启用了时间 window 压缩策略 (TWCS),出于某种原因,我有很多 SStable 只是带有墓碑。
当我 运行 对单个 sstable 进行手动压缩时,它不会被删除。如果我 运行 重新修复,它将把所有 sstable 加入一个,这会破坏 TWCS。
根据 nodetool scrub 命令的文档:
Scrub automatically discards broken data and removes any tombstoned rows that have exceeded gc_grace period of the table.
这会加入所有 sstables 吗?
简答:scrub 没有加入 sstables。
长答案:继续阅读。
我查看了 Cassandra 3.11.2 中的代码,但代码在 3.0 和 2.2 上是相似的。
使用压缩线程并行清理 sstable,每个线程清理一个 sstable。
如您在 ColumnFamilyStore.java the scrub command is ran using the CompactionManager 个话题中所见。
要检查的有趣函数是 parallelAllSSTableOperation. All live sstables (excluding the ones marked as suspects - for instance because of some exceptions during compaction) belonging to the table are marked as compacting, all compactions running on that table are paused and the operation is executed against each sstable,并行。
在scrub的情况下,操作是scrubOne which calls the Scrubber.scrub()。这个废弃了旧的 sstable 并创建了一个包含实时行的新 sstable。
在 parallelAllSSTableOperation 结束时,标记为压缩的 sstables 列表应该为空,操作成功。没有执行 sstables 的连接。
因此,您可以看到清理工具是侵入性的:它废弃了旧的 sstables,丢弃逻辑删除并将活动行保留在新的 sstables 中。
我希望这对你有所帮助,我没有遗漏任何东西:)。