如何 运行 仅在特定数据中心内进行修复?

How do I run a repair only within a certain datacenter?

我想 运行 修复更大集群中的特定 Cassandra 数据中心。我该怎么做 nodetool repair -local -pr 似乎不起作用:

$ nodetool repair -local -pr
Exception in thread "main" java.lang.RuntimeException: Primary range repair should be performed on all nodes in the cluster.
    at org.apache.cassandra.tools.NodeCmd.optionalKSandCFs(NodeCmd.java:1680)
    at org.apache.cassandra.tools.NodeCmd.main(NodeCmd.java:1378)

根据 CASSANDRA-7317,当您打算 运行 修复集群中所有节点(包括所有数据中心)上的 -pr 时,您应该只使用 -pr。否则,您最终可能会在修复过程中遗漏一些标记范围。

您看到的错误消息是在 c* 2.0.9 中引入的,防止用户运行同时使用 -local 和 -pr。

如果您只想修复本地 dc,请不要使用 -pr 标志。

要减少 运行 宁维修的影响,请查看这些选项:

OpsCenter 维修服务

自动处理您的维修并将它们分散到您的 gc_grace 期间,这样您就不会 1) 不必从操作角度担心维修问题,并且 2) 您的 cassandra 摄取不受影响通过一项昂贵的每周工作(维修 CPU 和 IO 密集型)。

替代维修服务

如果您没有使用 DSE,维修服务将显示为灰色。您可以像脚本一样编写和管理自己的维修服务。查看 Stump's github 以了解这可能是什么样子的示例。

注意:关注本票CASSANDRA-6434

以上答案在所有方面都是正确的,除了 Stump 的 github 不再由 Stump 维护并且只是为了减少断流对修复的影响(修复时间越长,出现故障的机会就越大)断流,这是不可恢复的故障)。使用 Gallew's github 作为当前版本。

对于实际的维修服务,您可以尝试 Limelight Network's github