【问题标题】:Gracefully exiting akka cluster node during rolling deployment在滚动部署期间优雅地退出 akka 集群节点
【发布时间】:2020-07-24 08:09:14
【问题描述】:

我们在 docker 中运行 akka 集群并在 Mesos 中运行。该结构使得 3 个不同的应用程序(每个应用程序有 4 个实例)在集群内相互通信

当我们要进行部署时,我们正在使用 Marathon 升级策略功能进行部署。它的配置方式是创建一个具有最新部署的新节点,然后杀死一个旧节点并继续此过程,直到所有节点都启动。我们正在使用以下配置来实现相同的效果(对于 4 个节点)

"upgradeStrategy": {
    "minimumHealthCapacity": 1,
    "maximumOverCapacity": 0.3
},

我们的主要目标是在部署期间将故障降至最低。然而,其他应用程序中的节点需要一些时间才能知道这个被杀死的节点,并且一些流量会被定向到最终失败的节点。我们调整了集群故障检测器以减少此时间,但我们仍然在部署窗口期间看到了很好的故障百分比

可以做些什么来处理这个问题。有没有办法从 Mesos 捕获信号并从集群中优雅地删除节点

【问题讨论】:

    标签: docker akka mesos marathon akka-cluster


    【解决方案1】:

    我可能会使用Akka Management 并将akka.management.http.route-providers-read-only 设置为false。这会暴露 Akka Cluster Management HTTP 端点,允许您通过 HTTP 调用更改集群状态。

    感兴趣的 HTTP 端点是 DELETE /cluster/members/{address},其中地址是一个集群 URI,例如 akka://Main@ip.add.re.ss:port。根据 Marathon 部署的具体情况,IP 地址和端口可用作 docker 入口点的环境变量。因此,您可以在应用程序退出后修改应用程序启动脚本:

    • 查询 Marathon API 以获取应用程序的其他实例
    • 在其他实例上点击上面的端点(由于 gossip 协议,一个应该就足够了,但是随着集群变大,在 gossip 到达之前在节点上点击该端点的可能性会增加)

    应用程序关闭时仍然会有一个窗口,其他节点认为它仍在运行,但这可能比等待故障检测器判断节点关闭(如果您有应用程序(例如一种大量使用持久性参与者)在您希望最大限度地减少误报故障的情况下,您可以放宽故障检测阈值,同时具有快速故障检测窗口)。

    【讨论】:

      【解决方案2】:

      如果您可以放弃对 Docker 的依赖,您可以使用默认执行程序来处理正常关闭。

      Mesos 执行器发送 SIGTERM 并在一段时间(宽限期)后强制终止应用程序。您可以在您的应用程序中处理 SIGTERM 以优雅地取消注册它并在它被杀死之前退出。

      或者你可以写一个custom Executor

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 2016-09-28
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        相关资源
        最近更新 更多