• erlang集群IP及port管理


    erlang集群是依靠epmd维护的,epmd是erlang集群节点间port映射的守护进程。负责维护集群内的节点连接。提供节点名称到IP地址及port的解析服务。

    epmd 自己定义port号

    epmdport配置

    默认情况下,epmd绑定在4369port。可是。port固定的话。easy遭受攻击。可能导致新节点的认证失败而无法启动,或无法增加集群。

    或者要在一台机器上部署不同的erlang集群,希望不会互相干扰。

    epmd -daemon -port 5000
    假设想用调试模式启动 epmd,使用 epmd -d -port 5000

    另外。epmd通常伴随着erlang节点启动时自己主动启动。无须手动处理,所以,这里也能够通过改动erl启动參数以达到自己主动调整epmdport。
    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

  • 相关阅读:
    LeetCode-Letter Combinations of a Phone Number
    LeetCode-Sort Colors
    C++Memset误区
    LeetCode-Valid Palindrome
    LeetCode-Longest Consecutive Sequence
    C++豆知识索引
    C++ 哈希表
    LeetCode-Sum Root to Leaf Numbers
    LeetCode-Word LadderII
    LeetCode-Word Ladder
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5140307.html
Copyright © 2020-2023  润新知