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 以了解如何实现此目的。
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 以了解如何实现此目的。