net_kernel

net_kernel

模块

net_kernel

模块摘要

Erlang网络内核。

描述

net内核是一个系统进程,注册为net_kernel,它必须能够使分布式Erlang正常工作。这个过程的目的是实现的BIF的部分spawn/4spawn_link/4,并提供了网络的监视。

Erlang节点使用命令行标志-name-sname

$ erl -sname foobar

也可以打电话给net_kernel:start([foobar])直接从普通的Erlang shell提示符:

1> net_kernel:start([foobar, shortnames]). {ok,<0.64.0>} (foobar@gringotts)2>

如果节点以命令行标志启动-sname,则节点名称为foobar@Host,其中Host是主机的短名称(不是完全限定的域名)。如果以标志开始-name,则节点名称是foobar@Host,其中Host是完全限定的域名。有关更多信息,请参阅erl

通常,当引用另一个节点时,会自动建立连接。可以通过设置Kernel配置参数dist_auto_connect来禁用此功能false,请参阅kernel(6)。在这种情况下,连接必须通过调用明确建立connect_node/1

允许相互通信的节点由魔术cookie系统处理,参见Distributed ErlangErlang参考手册。

警告

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

出口

allow(Nodes) -> ok | error

类型

允许访问指定的节点集。

在第一次调用之前allow/1,可以连接任何具有正确cookie的节点。何时allow/1被调用,建立允许的节点列表。从(或到)不在该列表中的节点进行的任何访问尝试都将被拒绝。

随后的调用allow/1将把指定的节点添加到允许的节点列表中。从列表中删除节点是不可能的。

回报error中的任何元素Nodes不是原子。

connect_node(Node) -> boolean() | ignored

类型

建立连接Nodetrue如果成功则返回,如果不成false功,并且ignored本地节点没有活动。

get_net_ticktime() -> Res

类型

获取net_ticktime(参见kernel(6))。

定义的返回值(Res):

NetTicktime

net_ticktimeNetTicktime秒。

{ongoing_change_to, NetTicktime}

net_kernel目前正在改变net_ticktimeNetTicktime几秒钟。

ignored

本地节点不活动。

getopts(Node, Options) ->

{ok, OptionValues} | {error, Reason} | ignored

类型

获取一个或多个连接到分配套接字的选项Node

如果Node是连接的节点,则返回值与分配套接字的inet:getopts(Sock, Options)位置相同。SockNode

返回ignored如果本地节点是不是活的或者{error, noconnection}如果Node没有连接。

monitor_nodes(Flag) -> ok | Error

monitor_nodes(Flag, Options) -> ok | Error

类型

调用进程订阅或取消订阅节点状态更改消息。甲nodeup消息被传递到所有订阅方法当新的节点连接,和一个nodedown当一个节点被断开传递消息。

如果Flagtrue,则开始新订阅。如果Flagfalse,则以前的所有订阅Options均以相同的方式停止。如果两个选项列表包含相同的选项集,则认为它们是相同的。

从内核版本2.11.4和ERTS版本5.5.4开始,保证以下内容:

  • nodeup 在通过新建立的连接传递来自远程节点的任何消息之前传递消息。

  • nodedown在通过连接传递的来自远程节点的所有邮件都已传递之前,邮件才会被传递。

注意这是保证在2.11.4之前的内核版本。

从内核版本2.11.4开始,订阅也可以在net_kernel服务器启动之前完成,也就是net_kernel:monitor_nodes/[1,2]不返回ignored

从内核版本2.13和ERTS版本5.7开始,保证以下内容:

  • nodeup相应的节点出现在结果中后,将传递消息erlang:nodes/X

  • nodedown消息在相应节点从结果中消失后传递erlang:nodes/X

请注意,在2.13之前的版本中不能保证这一点。

节点状态更改消息的格式取决于Options.如果Options[],它是默认的,格式如下:

{nodeup, Node} | {nodedown, Node} Node = node()

如果Options不是[],格式如下:

{nodeup, Node, InfoList} | {nodedown, Node, InfoList} Node = node() InfoList = [{Tag, Val}]

InfoList是一个元组列表。其内容取决于Options见下文。

此外,OptionList == []erlang:nodes/0监视可见节点,即结果中出现的节点。

Option可以是下列任何一种:

{node_type, NodeType}

有效值为NodeType

visible

仅为可见节点订阅节点状态更改消息。该元组{node_type, visible}包含在中InfoList

hidden

仅为隐藏节点订阅节点状态更改消息。该元组{node_type, hidden}包含在中InfoList

all

订阅可见节点和隐藏节点的节点状态更改消息。该元组{node_type, visible | hidden}包含在中InfoList

nodedown_reason

该元组{nodedown_reason, Reason}包含InfoListnodedown消息中。

Reason可以是下列任何一种:

connection_setup_failed

连接设置失败(nodeup发送消息后)。

no_network

没有可用的网络。

net_kernel_terminated

net_kernel进程终止。

shutdown

未指定的连接关闭。

connection_closed

连接被关闭了。

disconnect

连接断开(强制从当前节点)。

net_tick_timeout

网滴答超时。

send_net_tick_failed

未能在连接上发送网络滴答。

get_status_failed

Port保持连接失败。

set_net_ticktime(NetTicktime) -> Res

set_net_ticktime(NetTicktime, TransitionPeriod) -> Res

类型

设置net_ticktime(见kernel(6))到NetTicktime秒。TransitionPeriod默认为60

一些定义:

最小转换流量间隔(**MTTI * *)

minimum(NetTicktime, PreviousNetTicktime)*1000 div 4 毫秒。

过渡时期

连续秒数最少的时间MTTI覆盖TransitionPeriod调用后的秒数set_net_ticktime/2(即((TransitionPeriod*1000 - 1) div MTTI + 1)*MTTI毫秒))。

如果NetTicktime < PreviousNetTicktime,该net_ticktime变化是在过渡期结束时进行; 否则在开始。在过渡期间,net_kernel确保所有连接上至少每MTTI毫秒都有出站流量。

所述net_ticktime变化必须在网络中的所有节点(具有相同的上启动NetTicktime任何节点上的任何过渡期结束前); 否则连接可能会错误地断开连接。

返回下列内容之一:

unchanged

net_ticktime已经具有NetTicktime并保持不变的价值。

change_initiated

net_kernel开始改变net_ticktimeNetTicktime秒。

{ongoing_change_to, NewNetTicktime}

该请求被忽略,因为net_kernel正忙于更改net_ticktimeNewNetTicktime秒。

setopts(Node, Options) -> ok | {error, Reason} | ignored

类型

为分配套接字设置一个或多个选项。参数Node可以是一个节点名称,也可以是new影响所有未来连接节点的分布套接字的原子。

返回值与来自inet:setopts/2{error, noconnection}如果Node不是连接节点或new

如果NodenewOptions增多,也会被加入到内核CONFIGRATION参数inet_dist_listen_optionsinet_dist_connect_options

回报ignored如果本地节点没有活动。

start([Name]) -> {ok, pid()} | {error, Reason}start([Name, NameType]) -> {ok, pid()} | {error, Reason}start([Name, NameType, Ticktime]) -> {ok, pid()} | {error, Reason}

类型

通过启动net_kernel和其他必要的过程将非分布式节点转变为分布式节点。

注意参数是一个只有一个,两个或三个参数的列表。NameType默认为longnamesTicktime15000

stop() -> ok | {error, Reason}

类型

将分布式节点转换为非分布式节点。对于网络中的其他节点,这与节点关闭相同。只有当网络内核开始使用时才可能start/1,否则返回{error, not_allowed}。如果本地节点不活动,则返回{error, not_found}