Akka群集手动连接

Akka群集手动连接,akka,akka-cluster,Akka,Akka Cluster,我试图找到以下限制的解决方法:当从头开始启动Akka集群时,必须确保启动第一个种子节点。这对我来说是个问题,因为如果我有紧急情况,需要从头开始重新启动所有系统,谁知道所有东西所依赖的一台机器是否会正常启动和运行?而且我可能没有时间去改变系统配置。因此,我尝试手动创建集群,而不依赖于静态种子节点列表 现在,我很容易让所有Akka系统在某个地方注册自己,例如网络文件系统,通过定期触摸文件。因此,当启动一个新系统时 查找所有假定处于活动状态的系统的列表,即最近接触文件系统的系统。 A.如果没有,则新系

我试图找到以下限制的解决方法:当从头开始启动Akka集群时,必须确保启动第一个种子节点。这对我来说是个问题,因为如果我有紧急情况,需要从头开始重新启动所有系统,谁知道所有东西所依赖的一台机器是否会正常启动和运行?而且我可能没有时间去改变系统配置。因此,我尝试手动创建集群,而不依赖于静态种子节点列表

现在,我很容易让所有Akka系统在某个地方注册自己,例如网络文件系统,通过定期触摸文件。因此,当启动一个新系统时

查找所有假定处于活动状态的系统的列表,即最近接触文件系统的系统。 A.如果没有,则新系统将加入自身,即单独启动集群。B否则,它会尝试使用Clustersystem.joinSeedNodes将所有其他假定活动的系统作为种子加入集群。 如果2。B如果在合理的时间内未成功,新系统将再次尝试,从1开始。再次查找假定存在的系统列表,因为在此期间可能会发生变化;特别是,所有其他系统都可能已经死亡,我们最终会陷入2。A. 我不确定如何实施3:我如何知道加入是成功还是失败?需要订阅群集事件吗?如果再次调用Clustersystem.joinSeedNodes失败,是否可能?在这一点上,官方文件不是很明确,我也不是100%地理解以下内容。在我的案例中,我可以使用不同的种子进行多次尝试吗

参与者系统只能加入集群一次。额外的尝试将 被忽视。当它成功加入时,必须重新启动才能继续 能够加入其他群集或再次加入同一群集

最后,让我精确地说,我正在构建一个小型集群,目前只有10个系统,它不会增长太大,现在必须从头开始重新启动,然后我不能假设集群将永远存活


Thx

您不需要种子节点。如果希望群集自动启动,则需要种子节点

您可以启动单个应用程序,然后让它们在任何时间点手动加入集群。例如,如果您启用了http,您可以自己使用或实现其中的一个子集,它们都是经过良好包装的基本集群库函数

我强烈反对触摸式方法。如何在节点之间进行触摸读写同步?如果有人在读一个瞬态,而其他人在写它呢


我会说,要么使用多个种子节点实现完全自动,要么使用完全手动,让另一个系统负责管理节点的集群化。我的意思是,你可以单独启动它们,它们只有在外部主管命令时才会加入集群,这对管理分裂的大脑也很有帮助。

我们已经开始使用Constructr extension,而不是静态的种子节点列表:

这没有静态配置的第一种子节点必须在集群完全重启后启动的限制

相反,它依赖于高可用的查找服务。Constructr本机支持etcd,并且至少有zookeeper和Consor可用的扩展。因为我们已经有了卡夫卡的zookeeper集群,所以我们选择了zookeeper:


我在回答我自己的问题,让人们知道我最终是如何解决我的问题的。Michal Borowiecki的回答提到了ConstructR项目,我根据他们的代码构建了我的答案

我如何知道加入是成功还是失败?发出Clustersystem.joinSeedNodes后,我订阅群集事件并启动超时:

private case object JoinTimeout
...
Cluster(context.system).subscribe(self, InitialStateAsEvents, classOf[MemberUp], classOf[MemberLeft])
system.scheduler.scheduleOnce(15.seconds, self, JoinTimeout)
接收地址为:


如果再次调用Clustersystem.joinSeedNodes失败,是否可能?也许,也许不是。但事实上,如果加入失败,我只需终止actor系统,然后重新启动它进行尝试,因此在actor系统级别,这是一种让它崩溃的模式。

通过触摸我想到的文件系统,触摸一个大小为零的文件,其名称是actor系统的地址,可能是编码的:这是一个不需要同步读/写的原子操作。我想我正在寻找的是一个完全自动的解决方案,使用一个种子节点列表,该列表不是静态的,因为第一个节点在从头开始时必须是活动的,但它是根据文件系统上留下的信息动态构建的。Thx很多提示!我浏览了文件。如果我理解正确:zookeeper有一个静态节点列表,但没有一个节点具有特殊角色。因此,当从头开始重新启动时,我们只需要有足够的节点可用,zookeeper就会设法从这些节点中形成仲裁—这是Akka本机无法做到的,Akka集群可以通过ConstructR在其上构建。看起来还是有点像
我看过ConstructrMachine.scala中的代码:实际上它实现了我要寻找的算法,只是它没有实现我的第3步:ConstructR只发出一次Clustersystem.joinSeedNodes,如果调用失败,加入过程将中止。至少它能够确定加入是否成功。最后,我考虑提供我自己的ConstructR插件,即由网络文件系统支持的协调实现。
val address = Cluster(system).selfAddress
...
case MemberUp(member) if member.address == address =>
  // Hooray, I joined the cluster!
case JoinTimeout =>
  // Oops, couldn't join
  system.terminate()