如何跨节点分发应用程序,而不必将所有应用程序作为分布式握手的一部分启动

时间:2012-09-14 01:28:29

标签: erlang distributed-apps

背景

  • 我有一个启动节点时自动启动的应用程序(使用.rel,.boot等)
  • 如果第一个节点出现故障,我希望应用程序故障转移到备用节点。
  • 我使用Erlang的分布式应用程序功能来处理故障转移和接管。

问题

问题在于,分布式应用程序协商的一部分是当节点握手以确定哪个节点将保持停顿以及哪个节点将停顿时,应用程序将在所有节点上启动。如果可能,我需要应用程序不要在多个节点上运行。

问题

  • 当参与分布式应用程序启动协商时,有没有办法让节点自动启动我的应用程序外?或者,
  • 如何让我的应用程序以无人值守的方式启动并进行故障转移,而无需在多个节点上启动(甚至简要)应用程序

1 个答案:

答案 0 :(得分:4)

不幸的是,现在Erlang接管和故障转移功能非常有限,因此您需要在所有节点上运行应用程序才能使这些功能正常工作。

我想到的唯一想法是有点疯狂,涉及更多层次的间接,但实际上可能有效。

您可以编写一个假的,轻量级的包装器应用程序,然后在所有节点上启动它。此应用程序使用标准的Erlang分发功能。然后,您只需启动原始应用程序即可实施接管/故障转移策略:

-module(wrapper).
-behaviour(application).

[...]

start({takeover, _Node}, _Args) ->
  application:start(original_app).

[...]

另外,请记住,当您在所有节点中为分布式应用程序键入application:start(my_app)时,应用程序不会在所有节点上启动。您可以通过在每个节点上键入application:which_applications()来验证这一点。您将注意到应用程序在一个节点上正在运行的方式。

最后,请问为什么你不能在多个节点上启动应用程序?