26

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

到目前为止,我在 Akka 中看到的多节点示例在我看来似乎集中在可扩展性的概念上,而不是高可用性(至少在硬件方面)。多节点示例似乎总是存在单点故障。例如,有负载均衡器,但如果我需要重新启动其中一台具有负载均衡器的机器,我的系统将遭受一些停机时间。

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

到目前为止,我能想出的最佳答案是研究 Erlang OTP 文档,思考它们,并尝试找出如何使用 Akka 中可用的构建块将我的系统组合在一起。

但是,如果有关于如何在多台机器之间共享状态的资源、示例或想法,如果其中一台机器出现故障,事情会继续运行,我肯定会很感激他们,因为我担心我可能会重新发明轮子在这里。也许有一个多节点 STM 容器可以自动保持共享状态在多个节点之间同步?或者这很容易做到,以至于文档不会费心展示如何做的例子,或者我的研究和实验还不够彻底。任何想法或想法将不胜感激。

4

4 回答 4

5

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

于 2010-09-12T18:13:31.493 回答
3

如果您已经在客户端中列出了多个潜在主机,那么这些主机可以有效地成为负载平衡器。

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

如果主机建议服务不存在,那么客户端可以简单地从其内部列表中选择一个随机主机,尝试它们直到它连接。

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

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

确保您的主机列表是实际的主机名,而不是 IP,这样可以长期为您提供更大的灵活性(即,您将“始终拥有”host1.example.com、host2.example.com... 等,即使您移动基础设施并更改 IP)。

于 2010-09-11T21:23:34.727 回答
3

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

于 2010-09-12T09:28:20.793 回答
2

2美分。。

“如何在多台机器之间共享状态,如果其中一台机器出现故障,它会继续运行”

不要在机器之间共享状态,而是在机器之间划分状态。我不知道您的域,所以我不知道这是否可行。但本质上,如果您将某些聚合(在 DDD 术语中)分配给某些节点,您可以在使用这些聚合时将它们保存在内存中(actor、agent 等)。为了做到这一点,您将需要使用诸如 zookeeper 之类的东西来协调哪些节点处理哪些聚合。如果发生故障,您可以将聚合放在不同的节点上。

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

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

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

一切顺利,安迪

于 2012-01-30T21:13:12.193 回答