【问题标题】:how do i know if nodetool repair is finished我怎么知道nodetool修复是否完成
【发布时间】:2014-09-23 17:47:45
【问题描述】:

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

ALTER KEYSPACE "mykeyspace" WITH REPLICATION =   { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };

然后我尝试在进行此类更改后运行推荐的“nodetool repair”。

问题是这个命令有时会很快完成。当它确实像那样完成时,它通常会说“丢失通知...”并且退出代码不为零。

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

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

【问题讨论】:

    标签: cassandra cassandra-2.0 nodetool


    【解决方案1】:

    一般来说,你可以用两个nodetool命令监控一个nodetool repair操作:

    • 压缩统计
    • 网络统计

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

    这会检查活动的默克尔树计算:

    $ 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 看到它们。如果您的一个节点在修复过程中变得不可用,则可能会发生这种情况。要监控特定的修复操作,您可以检查日志文件中的条目,如下所示:

    调试 [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...
    

    【讨论】:

    • 这是一个很好的答案,这里是 Aaron Morton cassandra-user-incubator-apache-org.3065146.n2.nabble.com/…的源线程
    • @Aaron 好的,如果nodetool netstats 告诉您一切都已完成并且nodetool repair 没有返回怎么办?那么在那次运行中使用 Ctrl-C 会安全吗?最后,我只是测试并重置了我的数据库,但是这样做(Ctrl-C)然后尝试再次运行nodetool repair,它又挂了......
    • @AlexisWilke Ctrl-C 退出修复命令总是安全的。事实上,停止修复的唯一方法是使用nodetool stop validation。有很多事情会导致维修挂起。通过 JMX 监控挂起修复的数量,如果该数量从未达到零,您可能需要退回节点。网络不稳定也可能导致维修挂起。
    • @Aaron 对不起,我怎么能通过 JMX 检查待修复的数量?我尝试使用 Jconsole 从我的计算机远程连接到使用 this 的 AWS 中的一个 Cassandra 节点,但我无法连接。
    • 使用进程替换&lt;(...) 和sleep 来避免写入临时/上一个/最后一个文件非常棒。我熟悉这里的所有组件,但从没想过会以这种方式使用它们。
    【解决方案2】:

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

    nodetool repair --trace &lt;key_space&gt; &lt;table&gt;

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 2018-09-24
        • 2011-11-18
        • 2021-10-05
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 2017-07-17
        相关资源
        最近更新 更多