如何跨节点分发应用程序,而不必启动所有应用程序,这是分布式握手的一部分 背景 我有一个在节点启动时自动启动的应用程序(使用.rel、.boot等) 如果第一个节点出现故障,我希望应用程序故障转移到备用节点 我使用Erlang的分布式应用程序功能来处理故障转移和接管 问题

如何跨节点分发应用程序,而不必启动所有应用程序,这是分布式握手的一部分 背景 我有一个在节点启动时自动启动的应用程序(使用.rel、.boot等) 如果第一个节点出现故障,我希望应用程序故障转移到备用节点 我使用Erlang的分布式应用程序功能来处理故障转移和接管 问题,erlang,distributed-apps,Erlang,Distributed Apps,问题在于,分布式应用程序协商的一部分是,当节点握手以确定哪个节点将保持运行,哪个节点将处于静止状态时,应用程序将在所有节点上启动。如果可能,我需要应用程序不在多个节点上运行 问题: 有没有办法让节点自动启动我的应用程序,除非参与分布式应用程序启动协商?或者 如何实现应用程序以无人值守的方式启动和故障转移,而无需在多个节点上启动(甚至短暂启动) 不幸的是,Erlang接管和故障转移功能目前非常有限,因此您需要在所有节点上运行应用程序才能使这些功能正常工作 我脑子里唯一的想法是有点疯狂,还涉及到一

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

问题:
  • 有没有办法让节点自动启动我的应用程序,除非参与分布式应用程序启动协商?或者
  • 如何实现应用程序以无人值守的方式启动和故障转移,而无需在多个节点上启动(甚至短暂启动)

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

我脑子里唯一的想法是有点疯狂,还涉及到一个间接层次,但它实际上可能会起作用

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

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

[...]

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

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


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

我的应用程序从Oracle数据库创建域模型,将模型持久化到分布式缓存中,为Oracle更新这些模型、更新缓存等。我不希望两个应用程序同时执行这些活动。。。这不会是世界末日,但这似乎浪费了带宽,而且我会在不必要的情况下锁定行,等等。谢谢你的帮助。因为我的应用程序是以启动文件(erl-name)启动的版本的一部分myapp@1.2.3.4-boot bootfile),应用程序在所有节点上启动。。。我需要应用程序在无人值守的情况下运行,因此没有人在运行应用程序:start(myapp)还表明分布式功能最适合作为发布的一部分的应用程序,这意味着(我相信)应用程序在节点启动时启动。。。这就是我的问题。