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


12

您是否必须nodetool repair在集群中的每个节点上运行,还是只需要在一个节点上运行,Cassandra将从那里负责其余的工作?

Answers:


9

在浏览文档时,我很难为此找到参考,但是简短的答案是“是”,您需要nodetool repair在集群中的每个节点上运行。我能找到的最接近的是有关修复节点文档,文档建议您一次不要在群集中的多个节点上运行修复。

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


因此,如果我-pr在每个节点上运行,那会覆盖整个键空间吗?
2rs2ts 2014年

1
@ 2rs2ts是的,如果-pr在每个节点上运行它,它将覆盖整个键空间。
亚伦

1
好的,我假设您应该在每个节点上运行它,但是可以节省使用-pr标志的时间。
2014年

1
我在其他答案中添加了一些资源。该来源非常清楚:“对常规修复频率的硬性要求是gc_grace_seconds的值。在此时间段内,在每个节点上至少运行一次修复操作。” 修复节点
Carl G

5

它的行为方式取决于您的配置,使用的Cassandra版本以及运行repair命令的方式。

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

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

  • 如果您正在运行具有三个复制因子的三节点群集,则所有节点将拥有所有数据,因此将对所有节点执行修复。
  • 如果您正在运行复制因子为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
唯一的好答案
ruruskyi '18

2

不,您不必在每个单独的节点上运行。nodetool repair在一组节点上运行,这在文档中有明确说明。

您可以限制要在其上进行修复的节点或部分数据。例如,您可以-pr为分区范围,节点负责的范围提供选项,但这必须在整个群集上运行。但是,如果选择-local,则将修复节点本地数据中心中的节点。


4
nodetool repair在单个节点上运行不足以修复所有配置中所有节点上的所有复制数据。nodetool repair在单个节点上运行将仅修复在该节点上复制的数据。(添加该-pr选项会将修复限制为该节点是第一个副本的数据。)但是,如果群集中的数据没有在该节点上进行复制,则必须nodetool repair在其他节点上运行。
卡尔·G

2
“如果未指定-pr选项,则Cassandra会修复属于该节点职责范围内的所有副本范围。” nodetool repair docs (即,不修复该节点不负责复制的数据。)“对常规修复频率的硬性要求是gc_grace_seconds的值。在此时间段内,在每个节点上至少运行一次修复操作。” 修复节点
Carl G
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.