Cassandra 如何知道nodetool修复是否完成

Cassandra 如何知道nodetool修复是否完成,cassandra,cassandra-2.0,nodetool,Cassandra,Cassandra 2.0,Nodetool,我有一个2节点的ApacheCassandra(2.0.3)集群,rep factor为1。我在cqlsh中使用以下命令将rep factor更改为2 ALTER KEYSPACE "mykeyspace" WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 }; 在做了这种改变之后,我试着运行推荐的“nodetool修复” 问题是这个命令有时会很快完成。当它这样结束时,通常会说“丢失通知…”,

我有一个2节点的ApacheCassandra(2.0.3)集群,rep factor为1。我在cqlsh中使用以下命令将rep factor更改为2

ALTER KEYSPACE "mykeyspace" WITH REPLICATION =   { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };
在做了这种改变之后,我试着运行推荐的“nodetool修复”

问题是这个命令有时会很快完成。当它这样结束时,通常会说“丢失通知…”,退出代码不是零

所以我只是重复这个“nodetool修复”,直到它毫无错误地完成。我还检查“nodetool status”是否报告每个节点的预期磁盘空间。(使用rep factor 1,每个节点大约有7GB,我预计在nodetool修复后,每个节点都有14GB,假设同时没有集群使用)


在这种情况下,是否有更正确的方法确定“nodetool repair”已完成?

一般来说,您可以使用两个nodetool命令监视
nodetool repair
操作:

  • 压缩状态
  • 网络状态
维修操作有两个不同的阶段。首先,它计算节点之间的差异(要完成的修复工作),然后通过将数据流传输到适当的节点来处理这些差异

这将检查活动的Merkle树计算:

$ nodetool compactionstats
pending tasks: 0
Active compaction remaining time :        n/a

可通过以下方式监控维修流:

$ nodetool netstats
事实上,Aaron Morton建议使用以下Bash脚本/命令监视任何活动修复流:

while true; do date; diff <(nodetool -h localhost netstats) <(sleep 5 && nodetool -h localhost netstats); done

启动修复命令时,可以使用选项--trace监视修复流:


nodetool repair--trace

我们还可以在“活动”下的Opscenter控制台中监控修复进度。

这是一个很好的答案,这是Aaron Morton@Aaron的源线程好的,如果
nodetool netstats
告诉您一切都完成了,并且
nodetool repair
没有返回会怎么样?那么,在该运行中使用Ctrl-C是否安全?在我这边,我只是测试并重置我的数据库,但这样做(Ctrl-C),然后再次尝试运行
nodetool repair
,它又挂了起来…@AlexisWilke在修复命令中使用Ctrl-C总是安全的。事实上,停止修复的唯一方法是使用
nodetool停止验证
。有很多事情会导致挂起的维修。通过JMX监控未决修复的数量,如果该数量从未达到零,则可能需要反弹节点。网络不稳定也会导致挂起的修复。@Aaron很抱歉不知道,但是,我如何通过JMX检查挂起的修复数量?我尝试使用Jconsole从我的计算机远程连接到AWS中的一个Cassandra节点,但无法连接。使用进程替换

[repair #02fc68f0-210c-11e7-aa88-c35a9a02c19a] Starting...

[repair #02fc68f0-210c-11e7-aa88-c35a9a02c19a] Completed...