Scala+;Akka:如何开发多机高可用集群

Scala+;Akka:如何开发多机高可用集群,scala,high-availability,fault-tolerance,akka,Scala,High Availability,Fault Tolerance,Akka,我们正在为一款游戏开发Scala+Akka服务器系统,该游戏将为Android、iPhone和SecondLife中的客户端提供服务。此服务器的某些部分需要在多台计算机上运行并具有高可用性。如果其中一台服务器死亡(比如硬件故障),系统需要继续运行。我想我希望客户有一个他们将尝试连接的机器列表,类似于Cassandra的工作方式 到目前为止,我在Akka上看到的多节点示例似乎都围绕着可伸缩性而不是高可用性(至少在硬件方面)。多节点示例似乎总是有一个单点故障。例如,有负载平衡器,但如果我需要重新启动

我们正在为一款游戏开发Scala+Akka服务器系统,该游戏将为Android、iPhone和SecondLife中的客户端提供服务。此服务器的某些部分需要在多台计算机上运行并具有高可用性。如果其中一台服务器死亡(比如硬件故障),系统需要继续运行。我想我希望客户有一个他们将尝试连接的机器列表,类似于Cassandra的工作方式

到目前为止,我在Akka上看到的多节点示例似乎都围绕着可伸缩性而不是高可用性(至少在硬件方面)。多节点示例似乎总是有一个单点故障。例如,有负载平衡器,但如果我需要重新启动其中一台装有负载平衡器的机器,我的系统将出现一些停机时间

是否有任何示例显示Akka的这种硬件容错能力?或者,你对实现这一目标的好方法有什么想法吗

到目前为止,我能想到的最好的答案是研究Erlang OTP文档,思考它们,并尝试找出如何使用Akka中提供的构建块将我的系统组装起来


但如果有资源、例子或想法,说明如何在多台机器之间共享状态,如果其中一台机器出现故障,那么我肯定会很感激,因为我担心我可能会在这里重新发明轮子。也许有一个多节点STM容器可以自动在多个节点之间保持共享状态的同步?或者这很容易做到,文档中没有显示如何做到这一点的示例,或者我的研究和实验还不够彻底。如果您已经在客户机中列出了多个潜在主机,那么这些主机可以有效地成为负载平衡器

您可以提供一个主机建议服务,并向客户机建议他们应该连接到哪台机器(基于当前负载或其他),然后客户机可以锁定到该机器,直到连接失败

如果主机建议服务不存在,那么客户端只需从它的内部列表中随机选择一个主机,并一直尝试,直到连接为止

理想情况下,在第一次启动时,客户机将连接到主机建议服务,不仅可以被引导到适当的主机,还可以获得其他潜在主机的列表。每次客户端连接时,都可以定期更新此列表

如果主机建议服务在客户端首次尝试时关闭(不太可能,但是…),则您可以在客户端安装中预先部署主机列表,以便它可以立即开始从一开始就随机选择主机(如果有)


确保您的主机列表是实际的主机名,而不是IP,这会给您带来更大的长期灵活性(即,即使您移动基础设施并更改IP,您也会“始终拥有”host1.example.com、host2.example.com……等等)。

您可以看看它是如何构建的。它们都是水平可扩展的仅限崩溃的游戏应用服务器,DimDwarf部分是用Scala(新的消息传递功能)编写的。他们的方法和体系结构应该很好地满足您的需求:)

HA和负载管理是可扩展性的一个非常重要的方面,并且作为
AkkaSource
商业产品的一部分提供。

2美分

“如何在多台机器之间共享状态,以便在其中一台机器发生故障时保持运行”

不要在机器之间共享状态,而是跨机器分区状态。我不知道你的域名,所以我不知道这是否有效。但本质上,如果您将某些聚合(用DDD术语)分配给某些节点,则可以在使用这些聚合时将它们保留在内存中(actor、agent等)。为了做到这一点,您需要使用zookeeper之类的工具来协调哪些节点处理哪些聚合。如果发生故障,您可以在其他节点上启动聚合

此外,如果您使用事件源模型来构建聚合,那么通过这些节点侦听事件并维护自己的副本,在其他节点上拥有聚合的实时副本(从属)几乎是微不足道的

通过使用Akka,我们几乎可以免费获得节点之间的远程通信。这意味着,哪个节点处理可能需要与另一个节点上的聚合/实体交互的请求,都可以使用RemoteActors进行交互

我在这里概述的内容非常笼统,但提供了一种使用Akka和ZooKeeper实现分布式容错的方法。这可能有帮助,也可能没有帮助。我希望是这样

祝你一切顺利,
安迪

谢谢你,先生。我会照你的建议去做。现在我只需要弄清楚如何让这些主机之间共享状态,使用主动-主动或主动-被动的方法。在我看来,我需要构建它,并希望确保我没有构建一些已经完成并准备好在Akka中使用的逃过我注意的东西。对于共享状态,也许我应该实现Zookeper领导人选举类型的算法。集群中的每台机器都有一个NodeManager参与者。第一个节点成为引线。每个后续节点都将成为跟随者,下一个节点将成为该节点的跟随者。当领导者死亡时,下一个节点将接替他的位置。领导者将他的状态分享给追随者,等等。更新,目前正在基于JGroups构建解决方案。Akka的集群成员代码使用JGroups。我确实查看了一些JGroups,但后来我绕道使用了Erlang一段时间。事实上,我在Erlang中编写了很多应用程序,并且几乎就呆在那里了。但在与OTP学习和工作了一段时间后,我明白了如何利用阿克卡的设施做我需要做的事情。我想艾尔