epmd
epmd(Erlang Port Mapper Daemon)是Erlang的端口映射守护进程,文档:Erlang – epmd
当erlang的节点启动时,会将节点名称和地址发送给epmd
epmd会记录当前机器下节点的信息,主机间可以通过epmd交换双方主机下的节点信息并进行连接
节点互联要素
Cookie
erlang的每个节点都拥有自己的cookie,节点间若要通讯需要有相同的cookie作为认证
新增节点时,若没有使用-setcookie指定cookie,默认会使用.erlang.cookie中的内容作为该节点的cookie值
在节点运行时,可使用erlang:get_cookie().查看节点的cookie值
如何设置Cookie
- 修改默认cookie【不建议】
修改.erlang.cookie中的内容,原本权限为只读。可以使用chmod +w .erlang.cookie使其可写。修改内容后再使用chmod -w .erlang.cookie将其改回只读【不改回只读会出错】
-
新增节点时通过-setcookie指定cookie
例:erl -name zlrS@124.212.30.188 -setcookie ZLR
-
在节点运行时修改Cookie
例:erlang:set_cookie(node(),‘ZLR’).
命名
节点可以使用短命名(-sname)/长命名启动(-name)
shot name和long name的节点间不能进行通信
开放端口
在不同主机进行通信时,需要开放节点通信所需的端口。这里的端口除了epmd端口外,还需要开放节点对应的端口
例如:A主机节点位于33333端口,B主机节点位于44444端口
那么:A主机需开放:4369、33333端口;B主机需开放:4369、44444
实践
启动节点
主机A:erl -name zlrA@124.212.30.188 -setcookie ZLR
主机B:erl -name zlrB@115.234.191.121 -setcookie ZLR
epmd
此时在主机A和主机B上都可以使用erl_epmd:names()查看epmd注册的节点
主机A:
%% 查看本机的epmd下注册的节点
(zlrA@124.212.30.188)1> erl_epmd:names().
{ok,[{"zlrA",45635}]}
%% 查看主机B的epmd下注册的节点
(zlrA@124.212.30.188)2> erl_epmd:names(‘115.234.191.121’).
{ok,[{"zlrA",52672}]}
主机B:
%% 查看本机的epmd下注册的节点
(zlrB@115.234.191.121)1> erl_epmd:names().
{ok,[{"zlrB",52672}]}
%% 查看主机A的epmd下注册的节点
(zlrB@115.234.191.121)2> erl_epmd:names(‘124.212.30.188’).
{ok,[{"zlrA",45635}]}
若双方能通过erl_epmd:names(‘对方IP’)看到对方epmd下注册的节点,说明双方的epmd端口至少是互通的
建立连接
此时可以使用net_adm:ping()来对节点间进行互联,若返回pong则连接成功,返回pang则连接失败
若此时主机A未开放45635端口,主机B未开放52672端口,连接会失败
主机B:
%% 使用net_adm:ping
(zlrB@115.234.191.121)3> net_adm:ping('zlrA@124.212.30.188').
pong
(zlrB@115.234.191.121)4> nodes().
['zlrA@124.212.30.188']
此时查看nodes()可以发现两台主机下的节点之间已经相互建立了连接
主机A:
(zlrA@124.212.30.188)3> nodes().
['zlrB@115.234.191.121']