运行 如何压缩使用开始和结束标记范围

How run compaction on using start and end token range

我需要运行压缩一个非常大的table,40%的磁盘space是免费的,但是压缩需要很长时间并填满100%磁盘然后 Cassandra 进程关闭,所以我决定 运行 按开始和结束标记范围压缩,我 select 范围:

cassandra@cqlsh> SELECT tokens FROM system.local;
 tokens
 {'-1086477467151825006', '-6979941880848102278', '-9077716633074993870', '4450419032446811241', '7953145647081579725', '945723047588545683'}

当我通过指定开始和结束标记范围 运行 压缩命令时,出现以下错误:

$nodetool repair -st -1091112185956497009 -et -1164785492893427439 main tbl_evetns

error: Repair job has failed with the error message: [2021-06-02 22:57:42,499] Requested range (-1091112185956497009,-1164785492893427439] intersects a local range ((6717615618706114838,7883825036204854784]) but is not fully contained in one; this would lead to imprecise repair. keyspace: main
-- StackTrace --
java.lang.RuntimeException: Repair job has failed with the error message: [2021-06-02 22:57:42,499] Requested range (-1091112185956497009,-1164785492893427439] intersects a local range ((6717615618706114838,7883825036204854784]) but is not fully contained in one; this would lead to imprecise repair. keyspace: main
        at org.apache.cassandra.tools.RepairRunner.progress(RepairRunner.java:116)
        at org.apache.cassandra.utils.progress.jmx.JMXNotificationProgressListener.handleNotification(JMXNotificationProgressListener.java:77)

最好使用nodetool ring查找特定节点拥有的确切范围,然后发出相应的修复命令。

但实际上最好使用 Reaper tool - 它会自动进行计算,将拥有的范围拆分为子范围等。