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@host
。name
是用户给出的名称。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_kernel | Erlang网络内核。 |
在STDLIB应用程序中:
模块 | 描述 |
---|---|
slave | 启动和控制从节点。 |