我有一个2节点的apache cassandra(2.0.3)集群,其rep因子为1.我使用cqlsh中的以下命令将rep factor更改为2
ALTER KEYSPACE "mykeyspace" WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };
然后我尝试在执行此类更改后运行推荐的“nodetool repair”。
问题是此命令有时会很快完成。当它完成时,通常会说“丢失通知......”并且退出代码不为零。
所以我只是重复这个'nodetool repair'直到它完成而没有错误。我还检查'nodetool status'是否报告了每个节点的预期磁盘空间。 (使用rep因子1,每个节点都说大约7GB,我希望在nodetool修复之后每个节点都是14GB,假设平均时间没有集群使用)
在这种情况下,是否有更正确的方法来确定'nodetool repair'已完成?
答案 0 :(得分:45)
一般来说,您可以使用两个nodetool命令监视nodetool repair
操作:
维修操作有两个不同的阶段。首先,它计算节点之间的差异(要完成的修复工作),然后通过将数据流式传输到适当的节点来处理这些差异。
这将检查活动的Merkle Tree计算:
$ nodetool compactionstats
pending tasks: 0
Active compaction remaining time : n/a
可以通过以下方式监控修复流:
$ nodetool netstats
事实上,TheLastPickle的Aaron Morton建议使用以下Bash脚本/命令来监控任何活动的修复流:
while true; do date; diff <(nodetool -h localhost netstats) <(sleep 5 && nodetool -h localhost netstats); done
DataStax在其支持论坛中发布了关于troubleshooting hanging repairs的帖子。如果您有任何挂起的修复流,您应该能够使用netstats
查看它们。如果您的某个节点在修复过程中变得不可用,则会发生这种情况。要监视特定的修复操作,可以检查日志文件中是否有以下条目:
DEBUG [WRITE- / 172.30.77.197] 2013-05-03 12:43:09,107 OutboundTcpConnection.java(第165行)错误写入/172.30.77.197 java.net.SocketException:连接重置
请注意,修复会话也应在system.log中表示:
[repair #02fc68f0-210c-11e7-aa88-c35a9a02c19a] Starting...
[repair #02fc68f0-210c-11e7-aa88-c35a9a02c19a] Completed...
答案 1 :(得分:2)
当您启动修复命令时,可以使用选项--trace监视修复流:
nodetool repair --trace <key_space> <table>
答案 2 :(得分:0)
我们还可以在“活动”下的Opscenter控制台中监视修复进度。