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

标签 erlang distributed failover

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

我要的是:

申请是myapp_api带有rest api,它有myapp应用程序作为依赖。我要开始myapp_api在 3 个节点上,我希望整个应用程序 ( 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在每个节点。

最佳答案

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

I want to start myapp_api on 3 nodes, I want the whole app (myapp_api + myapp) to be working only at one node at the same time.



然后你添加:

The main app (myapp_api) works as expected: only at one node with failover and takeover. But for some reason depended myapp always starts at every node.



在第一段你说 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 起名字面向公众的流程,获取 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}
]}].

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

关于erlang - 如何在不启动每个节点的依赖的情况下启动分布式 Erlang 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862951/

相关文章:

python - Thrift:Python 服务器、Erlang 客户端错误... {thrift_socket_server,244,{child_error,function_clause,[]}}

configuration - 将 Erlang 配置文件(用于多个应用程序)应用于 Common Test with rebar

javascript - Jmeter Chromedriver 错误 : unknown error: DevToolsActivePort file doesn't exist when executed from remote master machine

algorithm - Raft:如何解决leader节点的性能瓶颈?

hadoop - HIVE ODBC - 故障转移

javascript - 任何人都知道一个好的容错聊天应用程序和/或 API

mongodb - 哪个面向文档的DBMS与erlang应用程序混合?

controls - 使用分布式版本控制系统进行发布管理

apache-kafka - Kafka 故障转移和副本

database - 我能否使用 JDBC 驱动程序将应用程序故障转移到正确的 Oracle 数据库实例(Data Guard,而非 RAC 集群)