ErlangクラスタIPおよびポート管理
4390 ワード
Erlangクラスタはepmdによってメンテナンスされ、epmdはerlangクラスタノード間ポートマッピングのデーモンプロセスであり、クラスタ内のノード接続をメンテナンスし、ノード名からIPアドレスおよびポートへの解析サービスを提供する.
epmdカスタムポート番号
epmdポート構成
デフォルトでは、epmdは4369ポートにバインドされます.ただし,ポートが固定されていると攻撃を受けやすく,新しいノードの認証に失敗して起動できなかったり,クラスタに参加できなかったりする可能性がある.あるいは、1台のマシンに異なるerlangクラスタを配置し、互いに干渉しないことを望んでいます.
epmd -daemon -port 5000
デバッグモードでepmdを起動したい場合は、epmd-d-port 5000を使用します.
また、epmdは通常、erlangノードの起動時に自動的に起動し、手動で処理する必要がないので、ここではerl起動パラメータを修正することで、epmdポートを自動的に調整することもできる.
erl -name [email protected] -epmd "epmd -port 5000 -daemon"
ノード起動構成
epmdポートが変更されると、erlangノードはepmdポート情報を明示的に指定する必要がある.
windwosでの起動方法:
1、環境変数ERL_の設定EPMD_PORT
C:\>set ERL_EPMD_PORT=5000C:\>erl -name [email protected]
以上のコマンドポート番号(ここでは5000)の前後にスペースを残すことはできません.
2、erlang起動パラメータの設定
erl -name [email protected] -epmd_port 5000
linuxでの起動方法:
1、環境変数ERL_の設定EPMD_PORT
ERL_EPMD_PORT=5000 erl -name [email protected]
2、erlang起動パラメータの設定
erl -name [email protected] -epmd_port 5000
この2つの方法は等価で、erlangが起動すると以下の処理が行われます.
epmdに関する問題
指定IPのノードのクラスタへの参加を制限する
epmd -port 5000 -address 127.0.0.1 -daemon
ノード名が[email protected]を選択すると、起動できないか、クラスタに参加できません.
epmdプロセスを殺す方法
epmdはerlangノードとは独立しており、すべてのノードが閉じた後も存在し続け、epmdプロセスを殺す必要がある場合があります.
epmd -kill
ノード接続リスニングポートの設定
ノードが起動すると、他のノードの接続要求を傍受して処理するためにtcp socketが起動しますが、このポート番号はランダムで、ファイアウォールルールを定義する必要がある場合があります.ポート範囲を制限する必要があります.
erlang起動パラメータを変更することで設定できます.方法は次のとおりです.
erl -name [email protected] -kernel inet_dist_listen_min 9100 -kernel inet_dist_listen_max 9200
この2つのパラメータがどのように使用されているか見てみましょう.
2015/9/29タイトル「erlang epmdカスタムポート番号」を「erlangクラスタIPおよびポート管理」に変更
2015/6/25補足ノード接続傍受ポート設定方法
参照先:http://blog.csdn.net/mycwq/article/details/46630743
epmdカスタムポート番号
epmdポート構成
デフォルトでは、epmdは4369ポートにバインドされます.ただし,ポートが固定されていると攻撃を受けやすく,新しいノードの認証に失敗して起動できなかったり,クラスタに参加できなかったりする可能性がある.あるいは、1台のマシンに異なるerlangクラスタを配置し、互いに干渉しないことを望んでいます.
epmd -daemon -port 5000
デバッグモードでepmdを起動したい場合は、epmd-d-port 5000を使用します.
また、epmdは通常、erlangノードの起動時に自動的に起動し、手動で処理する必要がないので、ここではerl起動パラメータを修正することで、epmdポートを自動的に調整することもできる.
erl -name [email protected] -epmd "epmd -port 5000 -daemon"
ノード起動構成
epmdポートが変更されると、erlangノードはepmdポート情報を明示的に指定する必要がある.
windwosでの起動方法:
1、環境変数ERL_の設定EPMD_PORT
C:\>set ERL_EPMD_PORT=5000C:\>erl -name [email protected]
以上のコマンドポート番号(ここでは5000)の前後にスペースを残すことはできません.
2、erlang起動パラメータの設定
erl -name [email protected] -epmd_port 5000
linuxでの起動方法:
1、環境変数ERL_の設定EPMD_PORT
ERL_EPMD_PORT=5000 erl -name [email protected]
2、erlang起動パラメータの設定
erl -name [email protected] -epmd_port 5000
この2つの方法は等価で、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]);
%%
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
ノード名が[email protected]を選択すると、起動できないか、クラスタに参加できません.
epmdプロセスを殺す方法
epmdはerlangノードとは独立しており、すべてのノードが閉じた後も存在し続け、epmdプロセスを殺す必要がある場合があります.
epmd -kill
ノード接続リスニングポートの設定
ノードが起動すると、他のノードの接続要求を傍受して処理するためにtcp socketが起動しますが、このポート番号はランダムで、ファイアウォールルールを定義する必要がある場合があります.ポート範囲を制限する必要があります.
erlang起動パラメータを変更することで設定できます.方法は次のとおりです.
erl -name [email protected] -kernel inet_dist_listen_min 9100 -kernel inet_dist_listen_max 9200
この2つのパラメータがどのように使用されているか見てみましょう.
%% 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,
%%
case erl_epmd:register_node(Name, Port) of
{ok, Creation} ->
{ok, {Socket, TcpAddress, Creation}};
Error ->
Error
end;
Error ->
Error
end.
do_listen(Options0) ->
%%
{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カスタムポート番号」を「erlangクラスタIPおよびポート管理」に変更
2015/6/25補足ノード接続傍受ポート設定方法
参照先:http://blog.csdn.net/mycwq/article/details/46630743