在滚动部署期间优雅地退出akka群集节点

dm7nw8vv  于 2021-06-26  发布在  Mesos
关注(0)|答案(2)|浏览(326)

我们在docker运行akka集群,在mesos运行。该结构使得3个不同的应用程序(每个应用程序有4个示例)在集群内相互通信
当我们要进行部署时,我们使用marathon升级策略特性进行部署。它的配置方式是使用最新的解聚剂创建一个新节点,然后杀死一个旧节点并继续此过程,直到所有节点都启动。我们使用下面的配置来实现相同的功能(对于4个节点)

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

我们的主要目标是在部署过程中尽量减少故障。然而,其他应用程序中的节点需要一些时间来了解这个被杀死的节点,并且一些流量被引导到最终失败的节点。我们调整了集群故障检测器以减少这一时间,但在部署窗口期间仍然可以看到很好的%故障
如何处理这个问题。有没有办法捕获来自Mesos的信号,并优雅地将节点从集群中移除

ev7lccsx

ev7lccsx1#

我可能会用akka管理 akka.management.http.route-providers-read-only 设置为 false . 这公开了akka集群管理http端点,它允许您通过http调用更改集群状态。
感兴趣的http端点是 DELETE /cluster/members/{address} 其中address是类似于 akka://Main@ip.add.re.ss:port . 根据马拉松部署的具体情况,ip地址和端口可以作为环境变量提供给docker入口点。因此,您可以在应用程序退出后将应用程序启动脚本修改为:
在marathonapi中查询应用程序的其他示例
在其他示例上点击上面的端点(多亏了gossip协议,一个就足够了,但是随着集群的增大,在gossip到达之前点击节点上这个端点的概率会增加)
当应用程序关闭时,仍会有一个窗口,其他节点认为该窗口仍在运行,但这可能比等待故障检测器判断某个节点关闭要快(如果您有一个应用程序(例如,大量使用持久参与者的应用程序),您希望将误报故障最小化,您可以在具有快速故障检测窗口的同时放宽故障检测阈值)。

ctzwtxfj

ctzwtxfj2#

如果你可以放弃对docker的依赖,你可以使用默认的执行器来处理优雅的关闭。
mesos执行器发送sigterm并在一段时间(宽限期)后强制终止应用程序。你可以在你的应用程序中处理sigterm来优雅地注销它并在它被杀死之前退出。
或者,您可以编写自定义执行器

相关问题