主备份分发维护状态

时间:2014-03-16 10:17:13

标签: erlang distributed otp

我有一个OTP应用程序,我想将它分发到几个节点上。我对Erlang很新,所以我要问的可能听起来很基本,但我无法在网上找到任何东西。

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

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

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

实现这一目标的最佳途径是什么?

非常感谢。

修改 应该澄清一点,我希望系统能够在网络分裂的情况下工作,因此将数据保存在硬盘驱动器上并不是一个可行的解决方案。

1 个答案:

答案 0 :(得分:2)

在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中。这意味着所有数据都将处于RAM状态,但副本将保存在光盘上以备份。 Mnesia可以直接存储erlang术语。没有序列化。如果您使用gen_*之类的行为,则可以轻松地存储状态,然后从另一个节点上的相同状态重新启动它。一开始听起来令人生畏,但我认为经过几次试验后你应该能够完成这项任务。

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

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