Erlang epmd的角色以及使用
很多同学误会了epmd的作用,认为epmd就是erlang集群的协议,我来澄清下:
Epmd是Erlang Port Mapper Daemon的缩写,在Erlang集群中的作用相当于dns的作用,提供节点名称到端口的查询服务,epmd绑定在总所周知的4369端口上。
epmd文档:这里
epmd协议:这里
Erlang的节点名称是类似这样的foo@ip的格式,当一个节点启动的时候,首先会在本机启动epmd,同时把自己的节点名称和节点监听的tcp端口登记在上面。
看代码:
// erlexec.c
02
03
...
04
05
case 'n':
06
07
if (strcmp(argv, "-name") == 0) { /* -name NAME */
08
09
if (i+1 >= argc)
10
11
usage("-name");
12
13
14
15
/*
16
17
* Note: Cannot use add_args() here, due to non-defined
18
19
* evaluation order.
20
21
*/
22
23
24
25
add_arg(argv);
26
27
add_arg(argv);
28
29
isdistributed = 1;
30
31
i++;
32
33
...
34
35
case 's': /* -sname NAME */
36
37
if (strcmp(argv, "-sname") == 0) {
38
39
if (i+1 >= argc)
40
41
usage("-sname");
42
43
add_arg(argv);
44
45
add_arg(argv);
46
47
isdistributed = 1;
48
49
i++;
50
51
}
52
53
...
54
55
if (isdistributed && !no_epmd)
56
57
start_epmd(epmd_prog);
58
59
...
我们可以透过erl -epmd EPMD_PROG来传入不同的参数。
再**实验:
$erl -sname a
02
03
$erl -sname b
04
05
$erl -sname c
06
07
$ ps -ef|grep epmd
08
09
membase 4592 1 0 Aug25 ? 00:00:39 /usr/local/bin/epmd -daemon
10
11
...
12
13
$ netstat -an|grep 4369
14
15
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN
16
17
$ epmd -names
18
19
epmd: up and running on port 4369 with data:
20
21
name c at port 4096
22
23
name b at port 4097
24
25
name a at port 4098
26
27
...
28
29
$erl -sname x
30
31
Erlang R14B04 (erts-5.8.5) 1
32
33
34
35
Eshell V5.8.5 (abort with ^G)
36
37
(x@my031091)1> erl_epmd:port_please(x, "127.0.0.1").
38
39
{port,34625,5}
40
41
42
43
(x@my031091)2> erl_epmd:names().
44
45
{ok,}
epmd是个标准的tcp服务器,它的协议如下:
kernel的erl_epmd模块提供epmd协议的封装,向net_kernel模块提供服务。如果net_kernel要连接其他节点的时候,就取出节点名称的ip部分,透过erl_epmd建立连接到ip:4369,通过epmd协议来查询想要的foo的端口,然后再用ip:port去连接真正的服务。
新版本的epmd提供了强行移除名称的功能,避免由于erlang虚拟机由于某种原因crash,没有注销名字,导致无法再使用这个名字。
要使用stop功能,epmd必须以 -relaxed_command_check 启动,具体参考epmd –help
演示下:
$ erl -sname x -epmd "epmd -relaxed_command_check -daemon"
02
03
Erlang R14B04 (erts-5.8.5) 1
04
05
06
07
Eshell V5.8.5 (abort with ^G)
08
09
(x@my031089)1>
10
11
12
13
$ epmd -names
14
15
epmd: up and running on port 4369 with data:
16
17
name x at port 58953
18
19
$ epmd -stop x
20
21
STOPPED
22
23
$ epmd -names
24
25
epmd: up and running on port 4369 with data:
我们看到名称已经抢先移除成功。
祝玩得开心!
Epmd是Erlang Port Mapper Daemon的缩写,在Erlang集群中的作用相当于dns的作用,提供节点名称到端口的查询服务,epmd绑定在总所周知的4369端口上。
epmd文档:这里
epmd协议:这里
Erlang的节点名称是类似这样的foo@ip的格式,当一个节点启动的时候,首先会在本机启动epmd,同时把自己的节点名称和节点监听的tcp端口登记在上面。
看代码:
// erlexec.c
02
03
...
04
05
case 'n':
06
07
if (strcmp(argv, "-name") == 0) { /* -name NAME */
08
09
if (i+1 >= argc)
10
11
usage("-name");
12
13
14
15
/*
16
17
* Note: Cannot use add_args() here, due to non-defined
18
19
* evaluation order.
20
21
*/
22
23
24
25
add_arg(argv);
26
27
add_arg(argv);
28
29
isdistributed = 1;
30
31
i++;
32
33
...
34
35
case 's': /* -sname NAME */
36
37
if (strcmp(argv, "-sname") == 0) {
38
39
if (i+1 >= argc)
40
41
usage("-sname");
42
43
add_arg(argv);
44
45
add_arg(argv);
46
47
isdistributed = 1;
48
49
i++;
50
51
}
52
53
...
54
55
if (isdistributed && !no_epmd)
56
57
start_epmd(epmd_prog);
58
59
...
我们可以透过erl -epmd EPMD_PROG来传入不同的参数。
再**实验:
$erl -sname a
02
03
$erl -sname b
04
05
$erl -sname c
06
07
$ ps -ef|grep epmd
08
09
membase 4592 1 0 Aug25 ? 00:00:39 /usr/local/bin/epmd -daemon
10
11
...
12
13
$ netstat -an|grep 4369
14
15
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN
16
17
$ epmd -names
18
19
epmd: up and running on port 4369 with data:
20
21
name c at port 4096
22
23
name b at port 4097
24
25
name a at port 4098
26
27
...
28
29
$erl -sname x
30
31
Erlang R14B04 (erts-5.8.5) 1
32
33
34
35
Eshell V5.8.5 (abort with ^G)
36
37
(x@my031091)1> erl_epmd:port_please(x, "127.0.0.1").
38
39
{port,34625,5}
40
41
42
43
(x@my031091)2> erl_epmd:names().
44
45
{ok,}
epmd是个标准的tcp服务器,它的协议如下:
kernel的erl_epmd模块提供epmd协议的封装,向net_kernel模块提供服务。如果net_kernel要连接其他节点的时候,就取出节点名称的ip部分,透过erl_epmd建立连接到ip:4369,通过epmd协议来查询想要的foo的端口,然后再用ip:port去连接真正的服务。
新版本的epmd提供了强行移除名称的功能,避免由于erlang虚拟机由于某种原因crash,没有注销名字,导致无法再使用这个名字。
要使用stop功能,epmd必须以 -relaxed_command_check 启动,具体参考epmd –help
演示下:
$ erl -sname x -epmd "epmd -relaxed_command_check -daemon"
02
03
Erlang R14B04 (erts-5.8.5) 1
04
05
06
07
Eshell V5.8.5 (abort with ^G)
08
09
(x@my031089)1>
10
11
12
13
$ epmd -names
14
15
epmd: up and running on port 4369 with data:
16
17
name x at port 58953
18
19
$ epmd -stop x
20
21
STOPPED
22
23
$ epmd -names
24
25
epmd: up and running on port 4369 with data:
我们看到名称已经抢先移除成功。
祝玩得开心!
没有找到相关结果
已邀请:
0 个回复