很多同学误会了epmd的作用,认为epmd就是erlang集群的协议,我来澄清下:
Epmd是Erlang Port Mapper Daemon的缩写,在Erlang集群中的作用相当于dns的作用,提供节点名称到端口的查询服务,epmd绑定在总所周知的4369端口上。
epmd文档:这里
epmd协议:这里
Erlang的节点名称是类似这样的foo@ip的格式,当一个节点启动的时候,首先会在本机启动epmd,同时把自己的节点名称和节点监听的tcp端口登记在上面。
看代码:
if ( strcmp (argv[i], "-name" ) == 0) { /* -name NAME */ |
* Note: Cannot use add_args() here, due to non-defined |
case 's' : /* -sname NAME */ |
if ( strcmp (argv[i], "-sname" ) == 0) { |
if (isdistributed && !no_epmd) |
我们可以透过erl -epmd EPMD_PROG来传入不同的参数。
再看下实验:
membase 4592 1 0 Aug25 ? 00:00:39 /usr/ local /bin/epmd -daemon |
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN |
epmd: up and running on port 4369 with data: |
Erlang R14B04 (erts-5.8.5) 1 [64-bit] [smp:16:16] [rq:16] [async-threads:0] [hipe] [kernel-poll: false ] |
Eshell V5.8.5 (abort with ^G) |
(x@my031091)1> erl_epmd:port_please(x, "127.0.0.1" ). |
(x@my031091)2> erl_epmd:names(). |
{ok,[{ "a" ,4096},{ "b" ,4097},{ "c" ,4098},{ "x" ,34625}]} |
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" |
Erlang R14B04 (erts-5.8.5) 1 [64-bit] [smp:16:16] [rq:16] [async-threads:0] [hipe] [kernel-poll: false ] |
Eshell V5.8.5 (abort with ^G) |
epmd: up and running on port 4369 with data: |
epmd: up and running on port 4369 with data: |
我们看到名称已经抢先移除成功。
祝玩得开心!
最新文章
- java面试题总汇
- java高薪之路__001_类
- LPC43XX JTAG Scan Chain
- 核电站问题(codevs 2618)
- codeforces 161D Distance in Tree 树形dp
- Android平台使用SQLite数据库存储数据
- DIV+CSS 网页布局之:两列布局
- chrome dev tools
- 简单的setInterval应用
- VC2010工程依赖不再自动链接
- 浅谈Java内存模型
- 用C语言编写一个简单的词法分析程序
- python-turtle 快给你的爷爷看看啥是 “小猪佩奇”
- HTTP协议【详解】——经典面试题
- appium---第一个脚本--启动一个已存在的app
- SQLSERVER 备份数据库的注意事项
- 无法获得锁 /var/lib/dpkg/lock
- sha0dow0socks
- 每天一个linux命令:Linux 目录结构
- 【PyQt5 学习记录】011:使用 QListWidet 创建列表
热门文章
- Win8.1部署 .NET Framework 3.5 安装方式
- SD卡与tf卡引脚转换
- 【2017 Multi-University Training Contest - Team 10 】Monkeys
- 将Maven的Java Project转换或修改为Web Project
- 浩爷AC自己主动机高速学习方案
- 【Codeforces Round #299 (Div. 2) B】Tavas and SaDDas
- ThreadLocal深入理解与内存泄露分析
- Unity自带网络功能——NetworkView组件、Serialize、RPC
- SVGALib
- [TypeScript] Interface and Class