【发布时间】:2025-12-10 04:40:01
【问题描述】:
我正在根据配置文件将 Erlang 应用程序动态加载到系统中,这使我无法在启动时启动分布式应用程序——我能够让故障转移正常工作,但不能进行故障回复(或在 OTP 术语中) , 接管。)
假设我有 NodeA 运行应用程序,NodeB 作为故障转移节点。我拉动 NodeA 上的电源线,应用程序迁移到 NodeB。这是意料之中的。但是当我让 NodeA 重新上线并尝试致电 application:start(MyApp) 时,我得到:
{error, {shutdown,{myapp, start, [normal,["config.xml"]]}}}
这表明应用程序无法启动。
无论如何,它无法启动,因为我已经在另一个 NodeB 上运行了主管,并且我已经 net_adm:ping 了它们。
我想我可以在 MyApp 上调用 application:takeover/2 来重新控制节点,并终止另一个节点上的应用程序。
{error,{not_running_distributed, MyApp}}
但这也不起作用。我的节点优先级列表是[NodeA, {NodeB, NodeC}],所以我认为应用程序会知道一旦重新上线就会移动到更高优先级的节点。
在这种情况下如何实施接管?
【问题讨论】:
-
另外,第一个答案*.com/questions/6402873/… 声称分布式应用程序仅作为发布的一部分工作......但我的故障转移有效,只是故障恢复无效!
-
为什么要使用 XML 文件进行配置?我相信您可以将其转换为 erlang 风格的配置,从而允许您在启动时启动它。此外,XML 很糟糕。
-
与第 3 方组件集成... XMerl 工作得很好,而且功能齐全。
-
另外,我们正在分发 Erlang 应用程序。作为软件。
-
它可以帮助您了解应用程序将在接管节点上完全启动,然后在运行节点上停止。如果您的应用程序正在全局注册某些内容,它可能会失败,因为它已经注册了。
标签: erlang distributed erlang-otp