9

背景

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

问题

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

问题

  • 有没有办法让节点自动启动我的应用程序,除非涉及分布式应用程序启动协商?交替,
  • 如何让我的应用程序以无人值守的方式启动和故障转移,而不需要我的应用程序在多个节点上启动(甚至短暂)
4

1 回答 1

4

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

我想到的唯一想法有点疯狂,并且涉及到更多的间接级别,但它实际上可能有效。

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

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

[...]

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

[...]

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

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

于 2012-09-18T10:02:25.340 回答