具有一个主节点,工作节点和非集群客户端节点的Akka集群

时间:2020-06-19 00:27:28

标签: akka akka-cluster

因此,我正在使用2.6.6构建akka群集,并设置一个主节点,该节点将是可以动态离开或进入群集的种子节点和工作节点。我也有应该与主节点(可能是路由器,但不能直接与工作人员)对话的“客户端”节点。

现在的问题是,有时如果关闭导致太多工人离开而没有正确离开集群,那么头脑分裂的提供者会选择主节点作为领导者,因此也将其关闭,现在“客户端”节点也会关闭也是群集的一部分,在这种情况下也将被关闭。

是否有一种方法可以将领导者固定到主节点上,但仍然可以自动关闭工作线程,但又不关闭客户端节点?

编辑:

也许有点结构化,这是我想完成的事情:

  • 主节点永远不会自动关闭,如果崩溃,它将手动重启
  • 如果主节点不可用,则工作节点将关闭
  • 非工作者客户端节点永远不会关闭,但是如果主节点不可用,请尝试无限期地重新连接到主节点

1 个答案:

答案 0 :(得分:2)

假设您使用的是现在开源的(以前是Lightbend商业产品)裂脑解析器,那么static-quorum策略似乎很合适。

决策可以基于角色已配置的节点,而不是集群中的所有节点。当某些类型的节点比其他类型的节点更有价值时,这很有用。例如,您可能有一些负责持久性数据的节点和一些具有无状态工作程序服务的节点。那么,即使意味着要关闭更多的工作程序节点,保持尽可能多的持久数据节点可能也更为重要。

还有该角色的另一种用法。通过为集群中的几个(例如7个)稳定节点定义角色,并在静态仲裁配置中使用该角色,您将能够动态添加和删除没有此角色的其他节点,并且仍然可以确定要保留哪些节点网络分区的运行情况以及关闭哪些节点。与保持多数状态(如下所述)相比,此方法的优势在于您不必冒将集群分成两个单独的集群的风险,即脑裂*。您仍然必须遵守以下规则:不要使用此角色启动太多节点。如上所述,如果在群集中没有足够的节点剩余该节点的情况下发生故障,它还会面临关闭所有节点的风险。

这可以通过application.conf中的以下内容来完成:

akka.cluster.split-brain-resolver.active-strategy=static-quorum

akka.cluster.split-brain-resolver.static-quorum {
  # one leader node at a time
  quorum-size = 1
  role = "leader"
}

akka.cluster.roles = [ ${AKKA_CLUSTER_ROLE} ]

然后,您将通过环境变量AKKA_CLUSTER_ROLE(在领导节点上将其设置为leader,并在适当的情况下将其设置为workerclient)来为每个实例指定集群角色。

由于需要节点就SBR策略达成共识,因此,您最好的办法是,如果领导者离开,则使客户端节点死亡。

最后,我将借此机会指出,让客户机节点加入Akka集群可能是一个值得重新考虑的设计决策:这使我感到很高兴,可以成为分布式整体。我希望认真考虑通过http或消息队列与群集交互的客户端。