我尝试以分布式方式运行一个简单的应用程序以测试故障转移接管功能,但失败了。
我要:
该应用程序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
在每个节点上打电话。
现在,这变得有些混乱,因为您说:
我想在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
要在一个地方运行,则可以使用全局注册,为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
唯一一个获得分发配置文件的应用程序?其他应用程序将在所有节点上运行)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句