如何在不启动每个节点的依赖项的情况下启动分布式Erlang应用程序?

use*_*860 5 erlang failover distributed

我尝试以分布式方式运行一个简单的应用程序来测试故障转移接管功能但是失败了.

我想要的是:

应用程序myapp_api使用rest api,它将myapp应用程序作为依赖项.我想从myapp_api3个节点开始,我希望整个应用程序(myapp_api+ myapp)只能同时在一个节点上工作.

怎么了:

主app(myapp_api)按预期工作:仅在具有故障转移和接管的一个节点上.但由于某些原因,依赖myapp总是从每个节点开始.我希望它只能同时在一个节点上工作.

我所做的:

我以第一个节点的配置为例.

[
    {kernel,
    [{distributed, [{myapp_api,
        1000,
        ['n1@myhost', {'n2@myhost', 'n3@myhost'}]}]},
        {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
        {sync_nodes_timeout, 5000}
    ]}
].
Run Code Online (Sandbox Code Playgroud)

erl -sname nI -config nI.config -pa apps/*/ebin deps/*/ebin -s myapp_api在每个节点打电话 .

I G*_*ICE 4

现在这有点令人困惑,因为你说:

我想在 3 个节点上启动 myapp_api,我希望整个应用程序(myapp_api + myapp)同时仅在一个节点上工作。

然后你添加:

主应用程序 (myapp_api) 按预期工作:仅在一个节点上进行故障转移和接管。但由于某种原因,myapp 始终在每个节点启动。

在第一段中,您说myapp_api应该在任何地方运行,在第二段中,您说它通过一次在一个节点上启动来按预期工作。

我在这里假设您希望整个设置成为故障转移,而不仅仅是顶级应用程序,我只是对第一段感到困惑。

您使用的配置文件显示了发生的情况:

[{kernel,
  [{distributed, [{myapp_api,
    1000,
    ['n1@myhost', {'n2@myhost', 'n3@myhost'}]}]},
    {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
    {sync_nodes_timeout, 5000}
]}].
Run Code Online (Sandbox Code Playgroud)

重要的是定义myapp_api了节点['n1@myhost', {'n2@myhost', 'n3@myhost'}]。此顺序意味着它以最高优先级运行n1@myhost,然后在发生故障转移时在具有同等优先级的其他节点上运行。

问题是,没有一个依赖项以相同的方式分布,因此可以期望在任何地方运行。

您只需要扩展该配置文件即可使其正常工作。在这里,我已经完成了它并重新缩进它以更好地显示其结构:

[{kernel,
  [{distributed, [
     {myapp_api, 1000, ['n1@myhost', {'n2@myhost', 'n3@myhost'}]},
     {myapp, 1000, ['n1@myhost', {'n2@myhost', 'n3@myhost'}]},
   ]},
   {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
   {sync_nodes_timeout, 5000}
]}].
Run Code Online (Sandbox Code Playgroud)

我还没有直接测试过它,但我很确定这会起作用。

如果您想要的是myapp_api无处不在但myapp在一个地方运行,您可以使用全局注册myapp,为面向公众的进程命名,然后myapp_api调用它们。然后,当以下配置支持时,myapp_api就能够将流量路由到任何地方:myapp

[{kernel,
  [{distributed, [
     {myapp, 1000, ['n1@myhost', {'n2@myhost', 'n3@myhost'}]},
   ]},
   {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
   {sync_nodes_timeout, 5000}
]}].
Run Code Online (Sandbox Code Playgroud)

(看看myapp唯一的应用程序如何获取分发配置文件?其他应用程序将在所有节点上运行)