`
cwqcwk1
  • 浏览: 86788 次
文章分类
社区版块
存档分类
最新评论

erlang集群IP及端口管理

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

epmd 自定义端口号

epmd端口配置

默认情况下,epmd绑定在4369端口。但是,端口固定的话,容易遭受攻击,可能导致新节点的认证失败而无法启动,或无法加入集群。或者要在一台机器上部署不同的erlang集群,希望不会互相干扰。
epmd -daemon -port 5000
如果想用调试模式启动 epmd,使用epmd -d -port 5000

另外,epmd通常伴随着erlang节点启动时自动启动,无须手动处理,所以,这里也可以通过修改erl启动参数以达到自动调整epmd端口。
erl -namehello@127.0.0.1-epmd "epmd -port 5000 -daemon"

节点启动配置

epmd端口改变时,erlang节点需要显式指定epmd端口信息。
windwos下启动方式
1、设置环境变量ERL_EPMD_PORT
C:\>set ERL_EPMD_PORT=5000
C:\>erl -namehello@127.0.0.1
注意了, 以上命令端口号(这里是5000)前后不能留有空格。
2、设置erlang启动参数
erl -name hello@127.0.0.1 -epmd_port 5000

linux下启动方式
1、设置环境变量ERL_EPMD_PORT
ERL_EPMD_PORT=5000 erl -namehello@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]);
	
%% 注册节点名称和端口
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

设定节点连接监听端口

节点启动时,会启动一个tcp socket,用于监听并处理其他节点的连接请求,但是,这个端口号是随机的,有时候我们需要定义防火墙规则,就要对端口范围做一些限定。
通过修改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,
	    %% 注册节点名称和端口
	    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

分享到:
评论

相关推荐

    inside Erlang VM3

    - **传输层**:Erlang集群支持多种传输方式,如TCP/IP、SSL等。 - **Group Leader**:用于统一管理和协调多个节点之间的交互。 #### Erlang自省机制 - **Trace工具**:Erlang提供了强大的追踪工具,帮助开发者调试...

    C#与Erlang的群通信

    标题中的"C#与Erlang的群通信"指的是在编程领域中,使用C#和Erlang两种不同的编程语言进行集群或分布式系统间的通信。这两种语言各有特点,C#是微软开发的面向对象的编程语言,常用于Windows平台的开发,而Erlang则...

    RabbitMq 集群搭建linux

    #### 二、RabbitMQ相关端口及防火墙配置 RabbitMQ集群运行时需要确保以下端口开放,以便进行正常的通信和服务访问: - **4369 (EPMD)**:用于节点间发现和通信。 - **5672, 5671 (AMQP 0-9-1 and 1.0 without and ...

    RabbitMQ集群搭建指南:提升企业消息系统的效能与稳定性

    3. **开放防火墙端口**:确保4369(用于Erlang节点发现)、5672(AMQP协议端口)、15672(管理界面端口)和25672(用于节点间通信)的端口开放。 4. **同步`.erlang.cookie`**:在所有节点上确保`.erlang.cookie`...

    Python-inetsshdist一个运行在ssh上的Erlang发行版网络协议

    1. **节点发现**:Erlang节点可以通过指定的主机名和端口找到彼此,形成分布式集群。 2. **进程间通信**:Erlang的轻量级进程可以跨越节点发送消息,实现异步通信。 3. **分布式模块**:Erlang的模块可以在任何节点...

    RabbitMQ消息服务安装使用手册.docx

    要添加新节点到现有集群,需要确保新节点有相同的Erlang版本和Cookie,并通过`rabbitmqctl join_cluster`命令加入集群。 ### 3. 高可用及负载均衡 结合使用Ha-Proxy作为负载均衡器和KeepAlived实现高可用性,确保...

    rabbitmq_cluster.zip

    rabbitmq管理端口 manage_port: 15673 配置用户名 username: bailh 配置密码 password: bailh 集群地址列表 rabbitmq_ips: [192.168.252.211, 192.168.252.212, 192.168.252.213] 主节点地址 master_ip: 192.168.252...

    RabbitMQ Linux 安装

    - **25672**:RabbitMQ 集群的端口。 ##### 3.3 添加用户 默认情况下,RabbitMQ 提供了一个名为 `guest` 的用户,但出于安全考虑,通常不建议在生产环境中使用此用户。可以自行创建新的用户,并分配相应的角色: ...

    centos7 安装rabbitmq 直接解压就可以使用

    在CentOS7上安装...总之,RabbitMQ的安装过程虽然简单,但正确配置和使用涉及到许多细节,包括Erlang环境的准备、服务的启动和管理、安全设置以及集群的搭建。这些都需要根据实际应用场景进行适当的调整和优化。

    rabbitmq-keepalive-haproxy.tgz

    综上所述,这个压缩包提供了搭建和管理RabbitMQ高可用集群所需的全部组件和配置文件,包括RabbitMQ、Haproxy和Keepalived的安装包以及相应的配置示例。通过这些资源,你可以学习如何在四台机器上部署这样一个集群,...

    RabbitMQ安装包

    在实际部署中,你可能还需要配置防火墙规则,允许外部访问RabbitMQ的管理端口(15672)和AMQP端口(5672)。例如,在CentOS上,你可以使用`firewalld`: ```bash sudo firewall-cmd --permanent --add-port=15672/...

    emqx服务器搭建文件

    2. **命令行工具**:利用`bin/emqx_ctl`命令行工具进行节点管理、集群操作、日志查看等操作。 3. **API接口**:EMQX提供了RESTful API,可以用来远程管理节点,例如发布、订阅、客户端管理等。 **四、连接与通信** ...

    rabbitmq 离线安装(包含gcc以及负载均衡 haproxy)linux 亲测可用

    总的来说,这个离线安装包提供了一套完整的RabbitMQ集群及Haproxy负载均衡解决方案,适用于离线环境或者网络受限的服务器部署。每个组件的安装和配置都需要根据实际环境进行微调,以确保最佳性能和稳定性。

    rabbitMQ服务器安装参考_rabbitmq服务器按照文档_

    - 配置防火墙规则,只允许必要的IP访问RabbitMQ的端口。 - 使用SSL/TLS加密连接,保护数据传输的安全。 - 定期备份RabbitMQ的数据,以防数据丢失。 以上就是按照文档安装RabbitMQ服务器的基本步骤。请注意,根据...

    emqx的zip包部署mqtt服务器

    EMQX,全称是Erlang MQTT Broker,是一款基于Erlang/OTP构建的开源MQTT消息代理,专门设计用于物联网(IoT)场景,支持大规模设备连接和高并发消息处理。它提供了丰富的功能和良好的可扩展性,使得在各种环境中部署...

    RabbitMQ消息服务用户手册.docx

    - **服务节点分配**:三台 RabbitMQ 节点分别为 Master 和两个 Slave,每个节点都有特定的 IP 地址、hostname 和管理控制台端口。另外两台服务器作为 Haproxy 和 Keepalived 的组合,提供高可用的负载均衡服务。 2...

    rabbitmq3.7.8安装-cent7.3-详细文档笔记-带安装包

    在实际部署中,你可能需要配置防火墙规则以允许外部访问RabbitMQ管理端口: ```bash sudo firewall-cmd --permanent --add-port=15672/tcp sudo firewall-cmd --reload ``` 至此,你已经在CentOS 7.3上成功安装了...

    emqx安装包windows版

    EMQX,全称是Erlang MQTT Broker,是一个基于Erlang/OTP构建的开源 MQTT(Message Queuing Telemetry Transport)消息代理。MQTT是一种轻量级的发布/订阅式消息协议,常用于物联网(IoT)、移动应用、传感器网络等...

    物联网专用消息队列EMQ的安装使用以及压测.docx

    【物联网专用消息队列EMQ的安装使用及压测】 EMQ(Erlang MQTT Broker)是一款基于Erlang开发的高性能、可扩展的物联网消息中间件,支持MQTT、CoAP等多种协议,广泛应用于物联网(IoT)场景。本文将详细介绍如何在高...

    RabbitMQ用户手册

    RabbitMQ 的管理和监控可以通过 RabbitMQ Management Console(Web 界面)进行,它提供了对队列、交换器、绑定和用户的可视化管理。此外,RabbitMQ 还支持多种编程语言的客户端库,使得开发者能够轻松地在不同语言的...

Global site tag (gtag.js) - Google Analytics