如何启动分布式Erlang应用程序而不启动每个节点的依赖关系?

如何启动分布式Erlang应用程序而不启动每个节点的依赖关系?,erlang,distributed,failover,Erlang,Distributed,Failover,我尝试以分布式方式运行一个简单的应用程序来测试故障转移接管功能,但失败了 我想要什么: 该应用程序是myapp\u api和rest api,它将myapp应用程序作为依赖项。我希望在3个节点上启动myapp\u api,我希望整个应用程序(myapp\u api+myapp)同时仅在一个节点上工作 怎么了: 主应用程序(myapp\u api)按预期工作:仅在一个具有故障切换和接管的节点上工作。但是由于某种原因,myapp总是在每个节点启动。我希望它同时只在一个节点上工作 我的工作: 以第一个

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

我想要什么:

该应用程序是
myapp\u api
和rest api,它将
myapp
应用程序作为依赖项。我希望在3个节点上启动
myapp\u api
,我希望整个应用程序(
myapp\u api
+
myapp
)同时仅在一个节点上工作

怎么了:

主应用程序(
myapp\u api
)按预期工作:仅在一个具有故障切换和接管的节点上工作。但是由于某种原因,
myapp
总是在每个节点启动。我希望它同时只在一个节点上工作

我的工作:

以第一个节点的My配置为例

[
    {kernel,
    [{distributed, [{myapp_api,
        1000,
        ['n1@myhost', {'n2@myhost', 'n3@myhost'}]}]},
        {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
        {sync_nodes_timeout, 5000}
    ]}
].
我打电话
erl-sname nI-config nI.config-pa apps/*/ebin deps/*/ebin-s myapp_api

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

我希望在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}
]}].
重要的一点是
myapp\u 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}
]}].
我还没有直接测试过,但我很确定这会起作用

如果你想让
myapp\u api
无处不在,而不是让
myapp
在一个地方运行,你可以使用,给
myapp
的面向公众的进程命名,让
myapp\u api
调用这些<当以下配置支持时,code>myapp_api将能够将流量路由到
myapp
所在的位置:

[{kernel,
  [{distributed, [
     {myapp, 1000, ['n1@myhost', {'n2@myhost', 'n3@myhost'}]},
   ]},
   {sync_nodes_optional, ['n2@myhost', 'n3@myhost']},
   {sync_nodes_timeout, 5000}
]}].

(请参见
myapp
是唯一获得分发配置文件的应用程序吗?其他应用程序将在所有节点上运行)

是的,谢谢,你做得对,我希望整个设置都是故障切换。是的,将myapp添加到分布式配置中也起到了作用。这对我来说有点奇怪,我必须手动完成。只有当你有简单的设置时才奇怪。您可以拥有非同质集群,其中应用程序A和C需要在节点1、2、3、4上运行,然后是应用程序B,由于硬件或操作系统原因,应用程序B只能在节点4和5上运行。对于不同的应用程序有不同的策略,像上面这样更灵活的方法是有意义的。