Akka Cluster手动加入

时间:2017-06-06 08:14:52

标签: akka akka-cluster

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

现在我很容易让所有Akka系统在某处注册(例如网络文件系统,通过定期触摸文件)。因此,在启动新系统时可以

  1. 查找所有可能存在的系统列表(即最近触及文件系统的人)。
  2. 一个。如果没有,则新系统自身加入,即单独启动集群。湾否则,它会尝试使用Cluster(system).joinSeedNodes将所有其他所谓的活动系统作为种子加入群集。
  3. 如果2. b。在合理的时间内没有成功,新系统再次尝试,从1开始。(再次查看所谓的有效系统列表,因为它可能在此期间发生了变化;特别是所有其他系统可能已经死亡,我们会最终落入2. a。)。
  4. 我不确定如何实施3:我如何知道加入是成功还是失败? (需要订阅集群事件吗?)如果再次调用Cluster(system).joinSeedNodes失败,是否可能?关于这一点,官方文档不是很明确,我不是100%如何在我的情况下解释以下内容(我可以使用不同的种子进行多次尝试吗?):

      

    actor系统只能加入一次集群。额外的尝试将   被忽略了。当它成功加入后,必须重新启动它   能够加入另一个集群或再次加入同一集群。

    最后,让我确切地说,我正在构建一个小型集群(目前它只有10个系统,并且它不会变得非常大)并且必须不时地从头开始重新启动(我不能假设集群永远活着。)

    THX

3 个答案:

答案 0 :(得分:1)

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

我如何知道加入是成功还是失败?发出Cluster(system).joinSeedNodes后我订阅群集事件并开始超时:

private case object JoinTimeout
...
Cluster(context.system).subscribe(self, InitialStateAsEvents, classOf[MemberUp], classOf[MemberLeft])
system.scheduler.scheduleOnce(15.seconds, self, JoinTimeout)

receive是:

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()

是否有可能在未能再次拨打Cluster(system).joinSeedNodes的情况下?也许,也许不是。但实际上我只是终止了actor系统,如果加入没有成功并重新启动它进行另一次尝试(所以它是在演员系统级别的“让它崩溃”模式)。

答案 1 :(得分:0)

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

您可以启动个人申请,然后手动使用#34;在任何时间点加入群集。例如,如果启用了http,则可以使用the akka-management library(或者自己实现它的一个子集,它们都是基本的集群库函数,只是很好地包装)。

我强烈反对触摸方式。如何同步节点之间的触摸读/写?如果有人读取瞬态(而其他人正在编写它)会怎么样?

我要么说完全自动(有多个种子节点),要么完整"手动"并让另一个系统负责管理节点的集群化。我的意思是你单独启动它们,并且只有在外部主管命令这样做时才加入集群(对管理分裂脑也很有用)。

答案 2 :(得分:0)

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

https://github.com/hseeberger/constructr

这不会限制静态配置的第一个种子节点在完全重新启动集群后必须启动。

相反,它依赖于高度可用的查找服务。 Constructr本地支持etcd,并且有(至少)zookeeper和consul可用的扩展。由于我们已经有了kafka的zookeeper集群,我们去了zookeeper:

https://github.com/typesafehub/constructr-zookeeper