sstableofflinerelevel
使用 LeveledCompactionStrategy 时,sstables 可能会卡在最近引导的节点上的 L0,并且压缩可能永远无法赶上。此工具用于将 sstables 提升到尽可能高的级别。
实现方式如下:sstables 按其最后一个令牌排序。给定一个原始的级别,如下所示(注意 [ ] 表示令牌边界,而不是磁盘上的 sstable 大小;所有 sstables 的大小相同)
L3 [][][][][][][][][][][] L2 [ ][ ][ ][ ] L1 [ ][ ] L0 [ ]
在降级到 L0 并按最后一个令牌排序后,将如下所示(为了说明重叠,重叠的 sstable 会放在新行上)
[][][] [ ][][][] [ ] [ ] ...
然后,我们从最小的最后一个令牌开始迭代,并将所有不会导致重叠的 sstable 添加到一个级别。我们将自上而下重建原始的级别。每当我们将一个 sstable 添加到级别时,我们都会将其从排序列表中删除。当我们到达排序列表的末尾时,我们就拥有了一个完整的级别,可以从下一级开始重新开始。
如果最终得到的级别比预期多,我们将所有超过预期的级别放在 L0 中,例如,原始的 L0 文件很可能被放在它自己的级别中,因为它们通常与许多其他 sstable 重叠。
在执行此工具之前,必须停止 Cassandra,否则会导致意外结果。注意:该脚本不会验证 Cassandra 是否已停止。
进行干运行
使用 --dry-run 选项查看当前的级别分布和更改后的预测级别。
示例
sstableofflinerelevel --dry-run keyspace eventlog For sstables in /var/lib/cassandra/data/keyspace/eventlog-6365332094dd11e88f324f9c503e4753: Current leveling: L0=2 Potential leveling: L0=1 L1=1