Reaper 无法 运行 修复 Cassandra 节点

Reaper failed to run repair on Cassandra nodes

Reaper在Cassandra集群的18个节点上运行修复失败后,我运行对每个节点进行全量修复修复失败的问题,全量修复后Reaper执行成功,但几天后 Reaper 再次失败 运行,我可以在 system.log

中看到以下错误
ERROR [RMI TCP Connection(33673)-10.196.83.241] 2021-09-01 09:01:18,005 RepairRunnable.java:276 - Repair session 81540931-0b20-11ec-a7fa-8d6977dd3c87 for range [(-606604147644314041,-98440495518284645], (-3131564913406859309,-3010160047914391044]] failed with error Terminate session is called
java.io.IOException: Terminate session is called
        at org.apache.cassandra.service.ActiveRepairService.terminateSessions(ActiveRepairService.java:191) ~[apache-cassandra-3.11.0.jar:3.11.0]

INFO  [Native-Transport-Requests-2] 2021-09-01 09:02:52,020 Message.java:619 - Unexpected exception during request; channel = [id: 0x1e99a957, L:/10.196.18.230:9042 ! R:/10.254.252.33:62100]
io.netty.channel.unix.Errors$NativeIoException: readAddress() failed: Connection timed out

nodetool tpstats 我可以看到一些待处理的任务

Pool Name                         Active   Pending
ReadStage                              0         0
Repair#18                              3        90
ValidationExecutor                     3         3 

另外 nodetool compactionstats 中还有 4 个待处理任务:

-bash-4.2$ nodetool compactionstats
pending tasks: 4
- Main.visit: 1
- Main.post: 1
- Main.stream: 2

我的问题是为什么在完全修复后,收割者仍然失败?待修复的根本原因是什么?

PS: Reaper的版本是2.2.3,不知道是不是Reaper的bug!

可能会发生许多事情,例如 Reaper 无法通过 JMX 连接到节点(无论出于何种原因)。您提供的信息有限,无法诊断问题。

您需要检查 Reaper 日志以获取有关根本原因的线索。

附带说明一下,这与维修无关,是 client/driver/app 连接到 CQL 端口上的节点:

INFO  [Native-Transport-Requests-2] 2021-09-01 09:02:52,020 Message.java:619 - Unexpected exception during request; channel = [id: 0x1e99a957, L:/10.196.18.230:9042 ! R:/10.254.252.33:62100]
io.netty.channel.unix.Errors$NativeIoException: readAddress() failed: Connection timed out

干杯!

您的 Reaper 修复定义中很可能没有足够的段,或者默认超时(30 分钟)对您的修复来说太短了。 段(和相关的修复会话)在达到超时时会被终止,以避免修复停滞。如果调整不当,这可能会导致您观察到的行为。 Nodetool 没有设置修复超时,这解释了为什么它会经过那里。好消息是,一旦调整正确,没有什么能阻止 Reaper 通过修复。

我们目前正在努力 adaptive repairs 让 Reaper 自动处理这种情况,但同时您需要手动处理。 检查 UI 中的段列表并应用以下规则:

  • 如果您有不到 20% 的段失败,请通过调整配置 yaml 中的 hangingRepairTimeoutMins 值将超时加倍。
  • 如果超过 20% 的段失败,则将段数加倍。

修复至少通过两次后,检查片段的最长持续时间并进一步调整片段的数量以使其最多持续 15 分钟。

假设您还没有 运行 Cassandra 4.0,现在您 运行 通过 nodetool 进行修复,您有 sstables 被标记为已修复,就像增量修复一样。这将产生一个问题,因为 Reaper 的修复不会将 sstables 标记为已修复,并且您现在有两个不同的 sstables 池(已修复和未修复),它们无法压缩在一起。 您需要使用 sstablerepairedset 工具将所有 sstables 标记为未修复,以便将所有 sstables 放回同一个池中。请阅读 the documentation 以了解如何实现此目的。