erlang集群IP及port管理
erlang集群是依靠epmd维护的,epmd是erlang集群节点间port映射的守护进程。负责维护集群内的节点连接。提供节点名称到IP地址及port的解析服务。
另外。epmd通常伴随着erlang节点启动时自己主动启动。无须手动处理,所以,这里也能够通过改动erl启动參数以达到自己主动调整epmdport。
2015/9/29 标题“erlang epmd 自己定义port号”改成“erlang集群IP及port管理”
epmd 自己定义port号
epmdport配置
默认情况下,epmd绑定在4369port。可是。port固定的话。easy遭受攻击。可能导致新节点的认证失败而无法启动,或无法增加集群。
或者要在一台机器上部署不同的erlang集群,希望不会互相干扰。
epmd -daemon -port 5000 |
假设想用调试模式启动 epmd,使用 epmd -d -port 5000
erl -name hello@127.0.0.1 -epmd "epmd -port 5000 -daemon" |
节点启动配置
当epmdport改变时,erlang节点须要显式指定epmdport信息。
windwos下启动方式:
1、环境变量设置ERL_EPMD_PORT
C:\>set ERL_EPMD_PORT=5000 C:\>erl -name hello@127.0.0.1 |
注意了, 以上命令port号(这里是5000)前后不能留有空格。
2、设置erlang启动參数
erl -name hello@127.0.0.1 -epmd_port 5000 |
linux下启动方式:
1、环境变量设置ERL_EPMD_PORT
ERL_EPMD_PORT=5000 erl -name hello@127.0.0.1 |
2、设置erlang启动參数
erl -name hello@127.0.0.1 -epmd_port 5000 |
这两种方式是等价的,erlang启动时会做下面处理:
// erlexec.c static void add_epmd_port(void) { char* port = get_env("ERL_EPMD_PORT"); if (port != NULL) { add_args("-epmd_port", port, NULL); } }当中,epmd_port在erl_epmd模块被用到,完毕epmd连接。
%% erl_epmd.erl get_epmd_port() -> case init:get_argument(epmd_port) of {ok, [[PortStr|_]|_]} when is_list(PortStr) -> list_to_integer(PortStr); error -> ?erlang_daemon_port end. %% %% Epmd socket %% open() -> open({127,0,0,1}). % The localhost IP address. open({A,B,C,D}=EpmdAddr) when ?ip(A,B,C,D) -> gen_tcp:connect(EpmdAddr, get_epmd_port(), [inet]); %% 注冊节点名称和port do_register_node(NodeName, TcpPort) -> case open() of {ok, Socket} -> Name = to_string(NodeName), Extra = "", Elen = length(Extra), Len = 1+2+1+1+2+2+2+length(Name)+2+Elen, gen_tcp:send(Socket, [?int16(Len), ?EPMD_ALIVE2_REQ, ?int16(TcpPort), $M, 0, ?int16(epmd_dist_high()), ?int16(epmd_dist_low()), ?int16(length(Name)), Name, ?
int16(Elen), Extra]), wait_for_reg_reply(Socket, []); Error -> Error end.
epmd相关问题
限制指定IP的节点增加集群
epmd -port 5000 -address 127.0.0.1 -daemon |
这样。假设节点名字不是 xxx@127.0.0.1,将无法启动。或增加集群。
怎样杀掉epmd进程
epmd独立于erlang节点。在全部节点关闭后还会继续存在,有时候可能须要杀掉epmd进程。
epmd -kill |
设定节点连接监听port
节点启动时,会启动一个tcp socket,用于监听并处理其它节点的连接请求。可是,这个port号是随机的,有时候我们须要定义防火墙规则,就要对port范围做一些限定。
通过改动erlang启动參数就可以设定,方法例如以下:
erl -name hello@127.0.0.1 -kernel inet_dist_listen_min 9100 -kernel inet_dist_listen_max 9200 |
看下这两个參数是怎么被使用的?
%% inet_tcp_dist.erl listen(Name) -> %% 启动本地节点监听socket case do_listen([{active, false}, {packet,2}, {reuseaddr, true}]) of {ok, Socket} -> TcpAddress = get_tcp_address(Socket), {_,Port} = TcpAddress#net_address.address, %% 注冊节点名称和port case erl_epmd:register_node(Name, Port) of {ok, Creation} -> {ok, {Socket, TcpAddress, Creation}}; Error -> Error end; Error -> Error end. do_listen(Options0) -> %% 获取port范围 {First,Last} = case application:get_env(kernel,inet_dist_listen_min) of {ok,N} when is_integer(N) -> case application:get_env(kernel, inet_dist_listen_max) of {ok,M} when is_integer(M) -> {N,M}; _ -> {N,N} end; _ -> {0,0} end, %% 获取绑定IP地址 Options = case application:get_env(kernel, inet_dist_use_interface) of {ok, Ip} -> [{ip, Ip} | Options0]; _ -> Options0 end, do_listen(First, Last, [{backlog,128}|Options]). do_listen(First,Last,_) when First > Last -> {error,eaddrinuse}; do_listen(First,Last,Options) -> %% 尝试监听socket case inet_tcp:listen(First, Options) of {error, eaddrinuse} -> do_listen(First+1,Last,Options); Other -> Other end.
2015/9/29 标题“erlang epmd 自己定义port号”改成“erlang集群IP及port管理”
2015/6/25 补充节点连接监听port设定方法
參考:http://blog.csdn.net/mycwq/article/details/46630743