【问题标题】:CoordinatedShutdown timeout on Akka cluster applicationAkka 集群应用程序上的 CoordinatedShutdown 超时
【发布时间】:2018-03-30 13:11:57
【问题描述】:

我们有一个 akka 集群应用程序(对一些参与者进行分片)。有时,当我们部署并关闭我们的应用程序时,我们会看到一些类似的日志:

协调关闭阶段 [cluster-sharding-shutdown-region] 定时 10000 毫秒后退出

这发生在自上次部署 2 多天后的第一次部署中(例如星期一)。我们使用 JMX 帮助程序要求 akka 节点退出集群,我们也有以下代码:

actorSystem.registerOnTermination {
  logger.error("Gracefully shutdown of node")
  System.exit(0)
}

所以当这个错误发生时,最终节点离开集群(或者至少它关闭了管理akka集群的JMX入口点)但是进程没有完成并且日志“Gracefully shutdown of node”没有出现。因此,当这种情况发生时,我们需要手动关闭 java 进程(我们使用 supervisor 处理)并重新部署。

我知道超时可以通过配置来调整,但是增加这个超时有什么影响呢?为什么有时协调关闭会引发超时?协调关闭超时时会发生什么?

任何线索将不胜感激:D

谢谢

【问题讨论】:

    标签: scala akka akka-cluster


    【解决方案1】:

    超时后会发生什么?引用Akka documentation:

    如果任务未在配置的超时时间内完成(请参阅reference.conf),则无论如何都会开始下一阶段。如果任务失败或未在超时内完成,则可以为某个阶段配置recover=off 以中止关闭过程的其余部分。

    为什么关机可能超时?很可能你在某个地方遇到了僵局。在这种情况下,增加超时将无济于事。也很可能您需要更多时间来关机。然后,您必须增加超时时间。

    但与您的问题更相关的可能是:

    默认情况下,JVM 不会被强制停止(如果所有非守护线程都已终止,它将被停止)。要启用硬 System.exit 作为最终操作,您可以配置:

    akka.coordinated-shutdown.exit-jvm = on
    

    所以你可以打开它,这应该解决“手动关闭java进程”的步骤。


    不过,最难的问题是首先要找出关机超时的原因。我想通过上面的技巧你可以存活一段时间,但你最好花点时间找到真正的原因。

    【讨论】:

      【解决方案2】:

      我们曾经在短期应用中遇到过这个问题(协调关闭阶段超时之一)。

      我们遇到这种情况的用例:

      1. 应用程序加入现有的 akka 集群
      2. 有什么作用
      3. 离开集群

      但是在第 3 步,成员的状态仍然是(Joining 或 WeaklyUp),如果您看到为 PhaseClusterLeave 添加了任务,它允许仅当状态为 UP 时从集群中删除成员。

      来自 ClusterDaemon.scala 的片段,在运行 ClusterLeave 阶段被调用:

      def leaving(address: Address): Unit = {
        // only try to update if the node is available (in the member ring)
        if (latestGossip.members.exists(m ⇒ m.address == address && m.status == Up)) {
          val newMembers = latestGossip.members map { m ⇒ if (m.address == address) m.copy(status = Leaving) else m } // mark node as LEAVING
          val newGossip = latestGossip copy (members = newMembers)
      
          updateLatestGossip(newGossip)
      
          logInfo("Marked address [{}] as [{}]", address, Leaving)
          publishMembershipState()
          // immediate gossip to speed up the leaving process
          gossip()
        }
      }
      

      为了解决这个问题,我们最终编写了自己的 CoordinatedShutdown,您可以参考这里 CswCoordinatedShutdown.scala

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多