在线文档教程
Erlang 20

13.分布式Erlang | 13. Distributed Erlang

13分布式Erlang

13.1分布式Erlang系统

一个分布式的Erlang系统由许多相互通信的Erlang运行时系统组成。每个这样的运行时系统都称为节点。在使用pids时,在不同节点上的进程之间传递的消息以及链接和监视器都是透明的。但是,注册名称对于每个节点都是本地的。这意味着使用注册名称发送消息等时也必须指定节点

分发机制是使用TCP/IP套接字实现的。在如何实施替代载体的描述中ERTS User's Guide

警告

在没有指定的情况下启动分布式节点-proto_dist inet_tls会使节点暴露在可能使攻击者完全访问节点和扩展集群的攻击中。在使用不安全的分布式节点时,请确保将网络配置为阻止潜在的攻击者。有关Using SSL for Erlang Distribution如何设置安全分布式节点的详细信息,请参见用户指南。

13.2节点

一个节点是一个正在执行的Erlang运行时系统,它使用命令行标志-name(长名称)或-sname(短名称)命名。

节点名称的格式是一个原子name@hostname是用户给出的名称。host是使用长名称时的完整主机名称,如果使用短名称则是主机名称的第一部分。node()返回节点的名称。

例子:

% erl -name dilbert (dilbert@uab.ericsson.se)1> node(). 'dilbert@uab.ericsson.se' % erl -sname dilbert (dilbert@uab)1> node(). dilbert@uab

具有长节点名称的节点无法与节点名称较短的节点通信。

13.3节点连接

分布式Erlang系统中的节点松散连接。第一次使用另一个节点的名称时,例如,如果spawn(Node,M,F,A)或被net_adm:ping(Node)调用,则建立到该节点的连接尝试。

连接默认为传递。如果节点A连接到节点B,节点B连接到节点C,则节点A也会尝试连接到节点C.可以使用命令行标志关闭此功能-connect_all false,请参阅erl(1)ERTS中的手册页。

如果某个节点停机,则删除该节点的所有连接。调用erlang:disconnect_node(Node)强制断开节点。

当前连接到的(visible)节点的列表由返回nodes()

13.4 EPMD

Erlang端口映射器守护进程epmd会在每个启动Erlang节点的主机上自动启动。它负责将符号节点名称映射到机器地址。请参阅epmd(1)ERTS中的手册页。

13.5个隐藏节点

在分布式Erlang系统中,连接到节点而不连接到所有其他节点有时很有用。一个例子是用于检查系统状态的某种O&M功能,而不会对其造成干扰。为此,可以使用隐藏节点

隐藏节点是一个以命令行标志开始的节点-hidden。隐藏节点和其他节点之间的连接不是传递的,它们必须明确设置。此外,隐藏节点不会显示在返回的节点列表中nodes()。相反,nodes(hidden)nodes(connected)必须使用。这意味着,例如,隐藏节点不会被添加到global正在跟踪的节点集合中。

Erlang 5.0/OTP R7中添加了此功能。

13.6 C节点

Ç节点是写入到充当分布式系统的Erlang隐藏节点的C程序。库Erl_Interface包含用于此目的的函数。有关C节点的更多信息,请参阅Erl_Interface应用程序和Interoperability Tutorial.

13.7安全

身份验证确定哪些节点可以相互通信。在不同Erlang节点的网络中,它以尽可能低的级别构建到系统中。每个节点都有自己的魔法cookie,这是一个Erlang原子。

当一个节点试图连接到另一个节点时,比较魔术饼干。如果它们不匹配,则连接的节点拒绝连接。

在启动时,一个节点有一个随机原子被指定为它的魔法cookie,其他节点的cookie被假定为nocookie。然后Erlang网络认证服务器(auth)的第一个动作是读取一个名为的文件$HOME/.erlang.cookie。如果该文件不存在,则会创建该文件。该文件的UNIX权限模式设置为八进制400(用户只读),其内容为随机字符串。Cookie从文件的内容创建一个原子,并使用本地节点的cookie设置为此erlang:set_cookie(node(), Cookie)。这也使得本地节点假定所有其他节点具有相同的cookie Cookie

因此,具有相同cookie文件的用户组可以获得Erlang节点,这些节点可以自由通信并且不受魔法cookie系统的干扰。想要在单独文件系统上运行节点的用户必须确保其cookie文件在不同文件系统上相同。

对于Node1具有魔术cookie 的节点Cookie能够Node2使用不同的cookie 连接到另一个节点或接受来自另一个节点的连接,必须首先调用DiffCookie该函数。可以用这种方式处理具有多个用户ID的分布式系统。erlang:set_cookie(Node2, DiffCookie)Node1

在两个节点之间建立连接时,缺省情况下,还要立即连接所有其他可见节点。这样,总是有一个完全连接的网络。如果存在具有不同Cookie的节点,则此方法可能不合适,并且-connect_all false必须设置命令行标志,请参阅erl(1)ERTS中的手册页。

通过调用来检索本地节点的魔术cookie erlang:get_cookie()

13.8分销BIF

一些有用的BIF用于分布式编程(有关更多信息,请参阅erlang(3)ERTS中的手册页:

BIF描述
erlang:disconnect_node(Node) 强制断开节点。
erlang:get_cookie()返回当前节点的魔术cookie。
is_alive()如果运行时系统是一个节点并且可以连接到其他节点,则返回true,否则返回false。
monitor_node(Node, true|false)监视节点的状态。如果与它的连接丢失,则会收到一条消息{nodedown,Node}。
node()返回当前节点的名称。允许在卫兵。
node(Arg)返回Arg,pid,引用或端口所在的节点。
nodes()返回此节点连接到的所有可见节点的列表。
nodes(Arg)根据Arg,该函数不仅可以返回可见节点的列表,还可以返回隐藏节点和以前已知的节点等。
erlang:set_cookie(Node, Cookie)设置连接到节点时使用的魔术cookie。如果节点是当前节点,则在连接到所有新节点时使用Cookie。
spawn_link|_opt在远程节点创建一个进程。
spawn_link|opt在远程节点创建一个进程。

13.9分发命令行标志

用于分布式编程的命令行标志示例(有关更多信息,请参阅erl(1)ERTS中的手册页:

命令行标志描述
-connect_all false只使用明确的连接设置。
-隐使节点进入隐藏节点。
名称使用长节点名称将运行时系统构建到节点中。
-setcookie Cookie与调用erlang相同:set_cookie(node(),Cookie)。
-sname名称使用短节点名称将运行时系统构建到节点中。

13.10分配模块

用于分布式编程的模块示例:

在内核应用程序中:

模块描述
全球全球名称注册设施。
global_group将节点分组到全局名称注册组。
net_adm各种Erlang网络管理程序。
net_kernelErlang网络内核。

在STDLIB应用程序中:

模块描述
slave启动和控制从节点。