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

erlang集群IP及port管理的更多相关文章

  1. redis 与java的连接 和集群环境下Session管理

    redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html)  第一步: a) 搭建环境 引入 jedis jar包 co ...

  2. redis内存分配管理与集群环境下Session管理

    ##################内存管理############### 1.Redis的内存管理 .与memcache不同,没有实现自己的内存池 .在2..4以前,默认使用标准的内存分配函数(li ...

  3. Erlang 集群互连测试

    Erlang 集群互连测试Erlang节点相同cookie全互联成为一个集群(cluster).如果2个集群不同cookie, 然后其中有节点连接到对方集群的节点,这2个集群会合并成一个集群吗?连接到 ...

  4. cdh 5.13 hadoop 集群IP变更详细步骤

    1.因一些不可抗因素,集群IP变更. 修改CM的数据库IP地址 /etc/cloudera-scm-server/db.p... 2.修改每个主机的hosts列表 3.修改SCM数据库的hosts表中 ...

  5. CEPH-5:ceph集群基本概念与管理

    ceph集群基本概念与管理 ceph集群基本概念 ceph集群整体结构图 名称 作用 osd 全称Object Storage Device,主要功能是存储数据.复制数据.平衡数据.恢复数据等.每个O ...

  6. ES系列十六、集群配置和维护管理

    一.修改配置文件 1.节点配置 1.vim elasticsearch.yml # ======================== Elasticsearch Configuration ===== ...

  7. Spark Storage(一) 集群下的区块管理

    Storage模块 在Spark中提及最多的是RDD,而RDD所交互的数据是通过Storage来实现和管理 Storage模块整体架构 1. 存储层 在Spark里,单节点的Storage的管理是通过 ...

  8. Redis Cluster 集群的实现和管理

    系统环境 CentOS 7 集群规划 在一台物理机(实际部署应当分散到多个物理机上),创建6个Redis节点,其中3个主节点.3个从节点. 节点表: IP 端口 主从 路径 192.168.1.21 ...

  9. kubernetes有状态集群服务部署与管理

    有状态集群服务的两个需求:一个是存储需求,另一个是集群需求.对存储需求,Kubernetes的解决方案是:Volume.Persistent Volume .对PV,除了手动创建PV池外,还可以通过S ...

随机推荐

  1. Processing.js

    Processing.js Processing.js 1.4.1 released!

  2. SpringMVC: web.xml中声明DispatcherServlet时一定要加入load-on-startup标签

    游历SpringMVC源代码后发现,在web.xml中注冊的ContextLoaderListener监听器不过初始化了一个根上下文,只完毕了组件扫描和与容器初始化相关的一些工作,并没有探測到详细每一 ...

  3. web.xml中listener作用及使用

    一.WebContextLoaderListener 监听类 它能捕捉到server的启动和停止,在启动和停止触发里面的方法做对应的操作! 它必须在web.xml 中配置才干使用,是配置监听类的 二. ...

  4. Swift - 使用表格组件(UITableView)实现单列表

    1,样例说明: (1)列表内容从Controls.plist文件中读取,类型为Array. (2)点击列表项会弹出消息框显示该项信息. (3)按住列表项向左滑动,会出现删除按钮.点击删除即可删除该项. ...

  5. HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)

    题意: 给你一个图,找最短路.但是有个非一般的的条件:如果a,b之间有路,且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的一条路.问满足这样的路径条数 有多少,噶呜~~题意是搜了解题报 ...

  6. 简单的 "双缓冲" 绘图的例子(研究一下)

    所谓双缓冲就是先画到内存画布(如: TBitmap), 然后再转帖到目的地. 譬如下面小程序: procedure TForm1.FormCreate(Sender: TObject); begin ...

  7. UDP 通信

    import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public ...

  8. Linux查看硬盘使用时间等信息

    查看硬盘信息的很多命令,都需要root权限,如果普通用户无法看到信息,请切换至root: 1.查看硬盘使用时间等信息 硬盘使用时间很重要,硬盘理论寿命是3万小时以上 $ sudo smartctl - ...

  9. tasklet和workqueue的选择

    linux内核设计与实现page127中有个比較,内容比較多.概括一下就是1. tasklet不能休眠, 2. 不须要休眠tasklet效率更高 3.有休眠仅仅能workqueue (1)假设不须要休 ...

  10. Android自己定义组件系列【2】——Scroller类

    在上一篇中介绍了View类的scrollTo和scrollBy两个方法,对这两个方法不太了解的朋友能够先看<自己定义View及ViewGroup> scrollTo和scrollBy尽管实 ...