您是否必须在每个节点上运行 nodetool repair?

2rs*_*2ts 14 maintenance cassandra

您是否必须nodetool repair在集群中的每个节点上运行,或者您只需要在一个节点上运行它,然后 Cassandra 会负责其余的工作?

Aar*_*ron 11

在查看文档时,我很难找到这方面的参考,但简短的回答是“是”,您需要nodetool repair在集群中的每个节点上运行。我能找到的最接近的是关于修复节点文档,它表明您不应一次在集群中的多个节点上运行修复。

您还可以使用标志运行修复-pr,这将修复操作限制在当前节点负责的第一个令牌范围内。这减少了在其余节点上运行时的重复工作。

  • @2rs2ts 是的,如果您在每个节点上使用“-pr”运行它,它将覆盖整个键空间。 (2认同)
  • 我在另一个答案中添加了一些来源。这个来源相当清楚:“例行修复频率的硬性要求是 gc_grace_seconds 的值。在此时间段内,在**每个**节点上至少运行一次修复操作。” [修复节点](https://docs.datastax.com/en/cassandra/2.0/cassandra/operations/ops_repair_nodes_c.html) (2认同)

Gen*_*ene 7

它的行为取决于您的配置、您使用的 Cassandra 版本以及您如何运行修复命令。

如果您只是nodetool repair在集群中的单个节点上运行,它将修复该节点负责的所有数据(令牌范围)以及负责该数据的其他节点。

例如,如果您要nodetool repair在给定集群中的单个节点上运行该命令:

  • 如果您正在运行复制因子为 3 的三节点集群,则所有节点都将拥有所有数据,因此将对所有节点执行修复。
  • 如果您正在运行复制因子为 2 的六节点集群,则只会在六个节点中的两个节点上修复数据。需要在其余四个节点中的另外两个节点上启动修复。

也就是说,可以定义哪些主机和数据中心使用-hosts-dc标志执行修复。此外,如果您使用-pr标志(这将只挑选的第一个标记范围的节点负责),你必须运行nodetool repair -pr所有集群中的节点。

要记住的另一个标志是-incCassandra 2.1 中包含的标志。此选项只会修复新数据(之前未修复的数据)。依赖它时要小心,特别是如果您经常删除数据。(更多关于这个

要记住的另一件事是,在 Cassandra 中进行修复的默认方式可能会有所不同。从 Cassandra 2.1 开始,nodetool repair它在运行时默认执行完整的顺序修复。您将需要查看您的版本的功能。

有关该主题的更多阅读:

https://www.datastax.com/dev/blog/repair-in-cassandra

  • 这里唯一的好答案 (2认同)