【问题标题】:Reaper failed to run repair on Cassandra nodesReaper 无法在 Cassandra 节点上运行修复
【发布时间】:2021-09-02 13:21:28
【问题描述】:

在 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

我的问题是,为什么即使在完全修复之后,reaper 仍然出现故障?待修复的根本原因是什么?

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

【问题讨论】:

    标签: cassandra cassandra-3.0


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      附带说明,这与维修无关,是连接到 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
      

      干杯!

      【讨论】:

        猜你喜欢
        • 2022-01-24
        • 2018-09-29
        • 2019-08-29
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 2017-04-18
        相关资源
        最近更新 更多