代码之家  ›  专栏  ›  技术社区  ›  Unoti

scala+akka:如何开发多机高可用集群

  •  25
  • Unoti  · 技术社区  · 14 年前

    我们正在scala+akka开发一个服务器系统,为Android、iPhone和第二人生的客户提供服务。此服务器的某些部分需要高度可用,并在多台计算机上运行。如果其中一台服务器死机(例如硬件故障),系统需要继续运行。我想我希望客户有一个他们将尝试连接的机器列表,类似于Cassandra的工作方式。

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

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

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

    但是,如果有资源、例子或者关于如何在多台机器之间共享状态的想法,如果其中一台机器发生故障,那么我肯定会感激它们,因为我担心我可能会在这里重新发明轮子。也许有一个多节点stm容器可以自动保持多个节点之间的共享状态同步?或者这是如此容易,以至于文档不需要展示如何做的例子,或者我在研究和实验中还没有做足够的深入。任何想法或想法都会受到赞赏。

    4 回复  |  直到 11 年前
        1
  •  5
  •   Rais Alam    11 年前

    HA和负载管理是可扩展性的一个非常重要的方面,它是 AkkaSource 商业发行。

        2
  •  3
  •   Will Hartung    14 年前

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

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

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

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

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

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

        3
  •  3
  •   puudeli    14 年前

    你可以看看怎么 RedDwarf 它的叉子 DimDwarf 建造。它们都是水平可伸缩的仅崩溃的游戏应用服务器,而dimdwarf部分是用scala(新的消息传递功能)编写的。他们的方法和架构应该非常适合您的需要:)

        4
  •  2
  •   Andrew    13 年前

    2美分。

    “如何在多台计算机之间共享状态,以确保其中一台发生故障时,这些计算机仍在运行。”

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

    此外,如果您使用事件源模型来构建聚合,那么通过那些侦听事件并维护自己的副本的节点在其他节点上拥有聚合的实时副本(从)就变得非常简单。

    通过使用akka,我们几乎可以免费在节点之间进行远程处理。这意味着,哪个节点处理可能需要与其他节点上的聚合/实体交互的请求,可以与远程参与者进行交互。

    我在这里概述的是非常一般的,但是给出了一种与Akka和ZooKeeper进行分布式容错的方法。这可能有帮助,也可能没有帮助。我希望如此。

    最好的, 安迪