【问题标题】:Primary-backup distribution maintaining state主备分布维护状态
【发布时间】:2014-04-21 13:12:22
【问题描述】:

我有一个 OTP 应用程序,我想将它分发到多个节点上。我对 Erlang 很陌生,所以我要问的问题可能听起来很基础,但我在网上找不到任何东西。

首先,假设我想让两个节点同时运行。一个是主要的,一个是备用的。如果主服务器发生故障,备份将接管。发生这种情况时,备份成为主节点,而作为主节点的节点在重新启动应用程序后成为备份。重要的是应用程序有一个状态,它不能丢失。

我的想法是主节点接收用户的消息并将它们转发到备份节点,因此它们同时运行。但是,只有主要响应用户。如果主节点发生故障,备份可以接管,因为它应该具有相同的状态。

希望用户不会注意到任何事情。

实现这一目标的最佳方法是什么?

非常感谢。

编辑 应该澄清我希望系统在网络分裂的情况下工作,因此将数据持久保存在硬盘驱动器上看起来不是一个可行的解决方案。

【问题讨论】:

    标签: erlang distributed erlang-otp


    【解决方案1】:

    在 erlang 术语中,这称为故障转移和接管。 Erlang 让它像在 kernel configuration file 中指定节点一样简单

    这是来自official documentation的示例

    [{kernel,
     [{distributed, [{myapp, 5000, [cp1@cave, {cp2@cave, cp3@cave}]}]},
     {sync_nodes_mandatory, [cp2@cave, cp3@cave]},
      {sync_nodes_timeout, 5000}
       ]
      }
      ].
    

    这里我的应用是主要的。当它失败时,它会在 cp2 或 cp3 重新启动。这里的 5000 是重新启动应用程序之前必须经过的延迟时间。它是可选的,可以为零。至于保存状态,我唯一能想到的就是使用像mnesia 这样的数据库来存储您的状态。分布式应用程序也在learn you some erlang中进行了解释

    根据评论编辑

    您可以以disc_copy 的方式将应用程序的状态存储在mnesia 中。这意味着所有数据都将在内存中,但副本将保存在磁盘上以用于备份目的。 Mnesia 可以直接存储 erlang 术语。没有序列化。如果您使用gen_* 类似的行为,您可以轻松存储状态,然后在不同节点上从相同状态重新启动它。起初这听起来令人生畏,但我认为经过几次试验后你应该能够完成这项工作。

    关于配置文件的更改...是的,添加新节点的唯一方法似乎是编辑配置文件。但我想这并不像你想象的那么痛苦。请记住,您可以在运行时访问 erlang。也许创建一个保存状态的模块并在运行时从命令行调用它。然后编辑配置文件并重新启动应用程序。

    还要注意每个节点的配置文件是不同的。因此,如果您事先知道您正在运行多少个节点,则可能不需要执行上述任何步骤。

    【讨论】:

    • 谢谢@AkshatJiwanSharma。我一直在看你之前所说的,我知道我可以这样做,但我不知道如何保持状态。可能将其存储在磁盘上是唯一的解决方案。我担心的另一个问题是我必须在内核配置文件中指定主机(在您的情况下为@cave)。如果我想让这个应用程序在另一台计算机上运行,​​我是否必须手动更改内核配置文件以反映主机更改?谢谢!
    • 没问题@satoshi。我的评论太大了,所以我编辑了答案。我想补充一点,erlang 为您提供了设计分布式应用程序的所有工具,但是您像我一样是新手,可能需要一段时间才能掌握一些东西。在不同的计算机上进行试验之前,请尝试在一台计算机上运行多个节点。
    • 谢谢谢谢@AkshatJiwanSharma。这个解决方案的问题是它在网络分裂的情况下不起作用,只在主节点上保持硬盘驱动器上的状态。我正在寻找一种解决方案,在备份节点上实时更新状态,以便在主节点出现故障时立即启动。谢谢
    • 我不太确定,但我认为保持状态和保证可用性是不可能的。顺便说一句,您可以手动复制不同节点上的状态。检查this answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多