【问题标题】:How to start distributed Erlang app without starting dependencies at every node?如何在不启动每个节点的依赖关系的情况下启动分布式 Erlang 应用程序?
【发布时间】:2015-08-31 23:57:38
【问题描述】:

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

我想要什么:

应用程序是myapp_api,带有一个rest api,它具有myapp 应用程序作为依赖项。我想在 3 个节点上启动 myapp_api,我希望整个应用程序 (myapp_api + myapp) 只能同时在一个节点上运行。

出了什么问题:

主应用程序 (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}
    ]}
].

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

【问题讨论】:

    标签: erlang distributed failover


    【解决方案1】:

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

    我想在 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_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_api 无处不在,但myapp 在一个地方运行,您可以使用global registration,为myapp 的面向公众的进程命名,获取@987654331 @ 调用这些。在以下配置支持时,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,由于硬件或操作系统原因,只能在节点 4 和 5 上运行。对于不同的应用采用不同的策略,上述更灵活的方法是有意义的。
    猜你喜欢
    • 1970-01-01
    • 2017-04-29
    • 2016-08-28
    • 2023-03-15
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多