启动远程 Erlang 节点

Posted

技术标签:

【中文标题】启动远程 Erlang 节点【英文标题】:Starting remote Erlang nodes 【发布时间】:2011-03-11 03:40:28 【问题描述】:

我想用 Erlang 写一个主从应用程序。我正在考虑架构中需要的以下内容:

master 死掉时 slave 不应该死掉,而是在 master 宕机时尝试重新连接它

如果远程节点没有自动连接或关闭,master 应该自动启动远程节点(可能是OTP 中的主管行为)

是否有面向 OTP 的行为来执行此操作?我知道我可以使用slave:start_link() 启动远程节点,我可以使用erlang:monitor() 监控节点,但我不知道如何将其合并到gen_server 行为中。

【问题讨论】:

函数 erlang:monitor_node/2 和 erlang:monitor_node/3 也可用。 您看到分布式应用程序部分了吗? erlang.org/doc/design_principles/distributed_applications.html 我们需要一些明确的术语。您想将您的应用程序分布在多个 erlang 虚拟机上(即运行多个 node())还是要构建一个容错的进程树?您的问题并不完全清楚。 【参考方案1】:

我同意 cmets 关于使用 erlang:monitor_node 和使用分布式应用程序的观点。

您不能只使用从模块来完成此操作,它明确指出“由主节点启动的所有从节点将在主节点终止时自动终止”。

目前也没有 OTP 行为可以做到这一点。监督树是分层的;看起来您正在寻找在应用程序逻辑方面存在层次结构的东西,但产卵是在对等的基础上(或个人基础,取决于您的观点)完成的。

如果您要使用多个 Erlang 虚拟机,那么您应该仔细考虑您运行的数量,因为大量虚拟机可能会由于操作系统交换操作​​系统进程而导致性能问题。获得最佳性能的经验法则是每个 CPU 内核的操作系统进程不超过一个(即一个 Erlang VM)。

【讨论】:

【参考方案2】:

如果您有兴趣研究其他实现,Basho 的 riak_core 框架对去中心化分布式应用程序有很好的了解。

riak_core_node_watcher.erl 里面有大部分有趣的节点观察代码。

搜索一下,你会发现talks and presentations about the framework不少。

【讨论】:

以上是关于启动远程 Erlang 节点的主要内容,如果未能解决你的问题,请参考以下文章

erlang分布式编程

在erlang中向远程节点端口发送消息

远程节点保持进程活着

生成后,Tcp Socket 在 erlang 中的远程节点上不起作用,错误,关闭?

认证失败(被远程节点拒绝),请检查 Erlang cookie

使用 ssh 端口转发运行 Erlang Observer