如何启动分布式Erlang应用程序而不必在每个节点启动依赖关系?
我试图以分布式方式运行一个简单的应用程序来测试故障转移接管功能,但失败。如何启动分布式Erlang应用程序而不必在每个节点启动依赖关系?
我想什么:
应用是myapp_api
与REST API,它有myapp
应用作为一个依赖。我想在3个节点上启动myapp_api
,我希望整个应用程序(myapp_api
+ myapp
)只能同时在一个节点上工作。
什么是错的:
主要应用(myapp_api
)按预期工作:只在故障转移和接管一个节点。但由于某种原因,总是从每个节点开始依赖myapp
。我希望它只能在一个节点上同时工作。
我做什么:
我的配置为第一个节点作为一个例子。
[
{kernel,
[{distributed, [{myapp_api,
1000,
['[email protected]', {'[email protected]', '[email protected]'}]}]},
{sync_nodes_optional, ['[email protected]', '[email protected]']},
{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,
['[email protected]', {'[email protected]', '[email protected]'}]}]},
{sync_nodes_optional, ['[email protected]', '[email protected]']},
{sync_nodes_timeout, 5000}
]}].
最重要的一点是,myapp_api
有['[email protected]', {'[email protected]', '[email protected]'}]
定义的节点。这个顺序意味着它以最高优先级在[email protected]
上运行,如果有故障转移,则在其他节点上以相同的优先级运行。
问题是,没有一个依赖以相同的方式分布,因此可以预期到处运行。
你应该只需要扩展该配置文件就可以使其工作。在这里,我已经做到了,并reindented它来显示其结构更好:
[{kernel,
[{distributed, [
{myapp_api, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]},
{myapp, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]},
]},
{sync_nodes_optional, ['[email protected]', '[email protected]']},
{sync_nodes_timeout, 5000}
]}].
我没有直接测试,但我敢肯定,这将工作。
如果你想要的是用于myapp_api
是无处不在,但对myapp
在一个地方运行,你可以使用global registration,提供一个名称myapp
的面向公众的过程中,得到myapp_api
调用这些。然后myapp_api
将能够将流量路由到哪里myapp
时,用下面的配置支持的是:
[{kernel,
[{distributed, [
{myapp, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]},
]},
{sync_nodes_optional, ['[email protected]', '[email protected]']},
{sync_nodes_timeout, 5000}
]}].
(查看如何myapp
是得到的分布形状的唯一的应用程序的其他应用程序将获得所有节点上运行?)
是的,谢谢,你说得对,我想整个设置是一个故障转移。是的,将myapp添加到分布式配置也起作用。对我来说,我必须手动完成这件事有点奇怪。 – user2461860
如果你有简单的设置,这只是奇怪的。您可能拥有应用程序A和C需要在节点1,2,3,4上运行的非同类群集,然后出于硬件或操作系统原因而只能在节点4和5上运行的应用程序B. 针对不同的应用程序采用不同的策略,像上面这种更灵活的方法是有道理的。 –