我正在根据配置文件将 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}]
,所以我认为该应用程序会知道一旦重新联机就会移动到更高优先级的节点。
在这种情况下如何实施接管?