net_kernel
net_kernel
模块
net_kernel
模块摘要
Erlang网络内核。
描述
net内核是一个系统进程,注册为net_kernel
,它必须能够使分布式Erlang正常工作。这个过程的目的是实现的BIF的部分spawn/4
和spawn_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 Erlang
Erlang参考手册。
警告
在没有指定的情况下启动分布式节点-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
类型
建立连接Node
。true
如果成功则返回,如果不成false
功,并且ignored
本地节点没有活动。
get_net_ticktime() -> Res
类型
获取net_ticktime
(参见kernel(6)
)。
定义的返回值(Res
):
NetTicktime
net_ticktime
是NetTicktime
秒。
{ongoing_change_to, NetTicktime}
net_kernel
目前正在改变net_ticktime
到NetTicktime
几秒钟。
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
当一个节点被断开传递消息。
如果Flag
是true
,则开始新订阅。如果Flag
是false
,则以前的所有订阅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}
包含InfoList
在nodedown
消息中。
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_ticktime
到NetTicktime
秒。
{ongoing_change_to, NewNetTicktime}
该请求被忽略,
因为net_kernel
正忙于更改net_ticktime
为NewNetTicktime
秒。
setopts(Node, Options) -> ok | {error, Reason} | ignored
类型
为分配套接字设置一个或多个选项。参数Node
可以是一个节点名称,也可以是new
影响所有未来连接节点的分布套接字的原子。
返回值与来自inet:setopts/2
或{error, noconnection}
如果Node
不是连接节点或new
。
如果Node
是new
的Options
增多,也会被加入到内核CONFIGRATION参数inet_dist_listen_options
和inet_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
默认为longnames
与Ticktime
对15000
。
stop() -> ok | {error, Reason}
类型
将分布式节点转换为非分布式节点。对于网络中的其他节点,这与节点关闭相同。只有当网络内核开始使用时才可能start/1
,否则返回{error, not_allowed}
。如果本地节点不活动,则返回{error, not_found}
。