我尝试以分布式方式运行一个简单的应用程序,以测试故障转移接管功能,但失败了。
我想要的:
应用程序为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
个。
答案 0 :(得分: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}
]}].
重要的一点是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
是唯一获得分发配置文件的应用程序?其他应用程序将在所有节点上运行)