文档章节

Erlang节点互联失败原因分析以及解决方案

景德真人
 景德真人
发布于 2012/03/29 05:13
字数 935
阅读 1.3K
收藏 1

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

转载自Erlang非业余研究

今天和项仲在部署新系统的时候发现节点间ping不成功的情况,类似

1> net_adm:ping('xx@ip1').      
pang

由于这个问题比较普遍,我就记录下一步步的排除步骤.

首先从原理上分析下!由于erlang节点间通讯是透过tcp来进行的,所以我们确保以下几点:    
1. 确保网络连接是通的,可以透过ping来查看。    
2. 确保网络连接上tcp是可以通的,可以透过netcat在二个节点所在的机器上分别开个服务器端和客户端进行验证。    
3. 确保端口是防火墙友好的。erlang的节点是登记在epmd服务上的,所以4369端口要能访问,其次节点的动态端口是可以访问的。

epmd -names      
epmd: up and running on port 4369 with data:      
name xx at port 46627      

同样可以用netcat来验证。    
4. erlang节点的cookie是一样的,可以透过setcookie来解决。

这几点确认无误后,就可以开始排查问题了。    
首先交代下环境,二台机器IP分别是10.1.150.12,10.232.31.89, 上面分别运行Erlang版本R16B和R14B04,cookie统一设置为456789。    
接着我们来演习下,首先我们10.1.150.12在节点A上起个节点’xx@10.1.150.12′,如下:

# erl -name xx@`hostname -i` -setcookie 456789

Erlang R16B (erts-5.10) 1 [64-bit] [smp:24:24] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10  (abort with ^G)

(xx@10.1.150.12)1>

=ERROR REPORT==== 28-Mar-2012::13:25:42 ===

** Connection attempt from disallowed node 'yy@10.232.31.89' **

同时我们在10.232.31.89上运行另外一个节点’yy@10.232.31.89′进行节点间连接,如下:

$erl -name yy@`hostname -i` -setcookie 456789

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)

(yy@10.232.31.89)1>  net_adm:ping('xx@10.1.150.12').

pang

我们看到节点无法互通,出错的原因是”** Connection attempt from disallowed node ‘yy@10.232.31.89′ ** “.    
有提示消息就好办, 在otp源码目录下简单的运行:

# grep -rin "disallowed node" .

./lib/kernel/src/dist_util.erl:154:                   "disallowed node ~w ** ~n", [Node]),

./lib/kernel/src/dist_util.erl:603:                           "disallowed node ~w ** ~n", [NodeB]),

./lib/kernel/src/dist_util.erl:623:                           "disallowed node ~w ** ~n", [NodeB]),

./lib/kernel/src/net_kernel.erl:1149:                 "disallowed node ~w ** ~n", [Node]),

我们可以看到有4个函数有可能打印这个语句,分别是:    
1. is_allowed %% check if connecting node is allowed to connect with allow-node-scheme    
2 .recv_challenge_reply %% wait for challenge response after send_challenge    
3. recv_challenge_ack    
4. setup %% Set up connection to a new node.

其中和被动连接相关的俄只有1,2,3这几种情况.

情况1: 节点间allow相关的东西可以参考这篇文章:Erlang如何限制节点对集群的访问之net_kernel:allow    
我们来排除下allow导致问题的原因,把allow设成[],允许任意节点访问:

2> net_kernel:allow([]).      
ok      
(xx@10.1.150.12)2>      
=ERROR REPORT==== 28-Mar-2012::13:36:09 ===      
** Connection attempt from disallowed node ‘yy@10.232.31.89′ **

很清楚,这样并没有解决问题。

那就可以肯定是第2,3个原因了,回头来看下我们的版本号:    
R14B04 和 R16B, 差了二个大版本, 这个是核心原因。    
换成同样的版本的erlang问题应该解决!如下:

$erl -name yy@`hostname -i` -setcookie 456789

Erlang R16B (erts-5.10) 1 [64-bit] [smp:24:24] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10  (abort with ^G)

(yy@10.232.31.89)1>  net_adm:ping('xx@10.1.150.12').

pong

看来确实解决了!

小结: Erlang版本不混用,即使混用最好不超过2个版本。    
祝玩得开心!

© 著作权归作者所有

上一篇: 在OSX上安装Erlang
下一篇: 在OSX上安装Erlang
景德真人
粉丝 272
博文 2
码字总数 1069
作品 0
深圳
私信 提问
加载中

评论(0)

erlang节点互相ping,一个能ping通,另外一个不行。

今天发现一个问题,2个erlang节点,1个主动ping另外一个不通,然后等待另外一个ping过来,2个节点才连通。记录一下。 首先,erlang节点的cookie是一致的。查了文档,cookie一致就可以连通的。...

格通
2016/02/22
105
0
新文章 联系 订阅 管理 [Erlang 0123] Erlang EPMD

epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相当多的内容讲epmd,epmd是什么呢? epmd 是Erlang Port Mapper Daemon的缩写,全称足够明确表达...

唐玄奘
2018/01/03
0
0
supervisor之启动rabbitmq报错原因

前言 今天重启了服务器,发现supervisor管理的rabbitmq的进程居然启动失败了,查看日志发现老是报错,记录一下解决的办法。 报错:erlexec:HOME must be set 找了网上的许多人的博客,一般的...

osc_euf35q41
2018/04/25
10
0
[Erlang 0123] Erlang EPMD

epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相当多的内容讲epmd,epmd是什么呢? epmd 是Erlang Port Mapper Daemon的缩写,全称足够明确表达...

回头再说 坚强2002的博客
2014/07/03
0
0
Erlang节点互联笔记

最近工作上需要,游戏服需要部署到腾讯云上。打算只是登陆充值相关的部署在腾讯云上,其他游戏节点则在另外云上。实际操作下来,发现Erlang节点并不能很好的互联起来,节点只能从腾讯云上主动...

rongtou
2016/11/17
247
0

没有更多内容

加载失败,请刷新页面

加载更多

ThreadLocal

一、ThreadLocal简介   多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步...

architect刘源源
昨天
13
0
微信小程序客服会话卡片、自定义客服消息卡片

一、微信客服会话启用会话卡片 1. open-type="contact" 2. show-message-card =true 更多参考官方文档: https://developers.weixin.qq.com/miniprogram/dev/component/button.html 当前效果......

tianma3798
昨天
6
0
练习Linux常用命令

练习命令 Linux常用命令 Linux中一切皆文件,没有消息就是最好的消息 以下所有命令以centos7为基础, 网络相关配置 测试外网是否连通 安装网卡测试工具,即ifconfig程序 查看网卡 临时修改I...

千年典韦
昨天
10
0
从poison社网站爬取历代作品资料

使用的语言是python,爬取使用的代码包在我的主页有提供. 其中一些相关的数据设定如下(复制为data.py,然后运行主页提供的包的main.py): from mypython import *CODE = '4fjl_fjiepq24x' #...

setycyas
昨天
36
0
确定已安装的PowerShell版本 - Determine installed PowerShell version

问题: 如何确定计算机上安装了哪个版本的PowerShell,以及是否确实安装了该版本? 解决方案: 参考一: https://stackoom.com/question/7euv/确定已安装的PowerShell版本 参考二: https://...

技术盛宴
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部