Erlang节点间ping失败原因分析
今天和项仲在部署新系统的时候发现节点间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
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
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", ),
./lib/kernel/src/dist_util.erl:603: "disallowed node ~w ** ~n", ),
./lib/kernel/src/dist_util.erl:623: "disallowed node ~w ** ~n", ),
./lib/kernel/src/net_kernel.erl:1149: "disallowed node ~w ** ~n", ),我们可以看到有3个函数有可能打印这个语句,分别是:
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
节点间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, 差了二个大版本, 这个是核心原因。
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
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
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", ),
./lib/kernel/src/dist_util.erl:603: "disallowed node ~w ** ~n", ),
./lib/kernel/src/dist_util.erl:623: "disallowed node ~w ** ~n", ),
./lib/kernel/src/net_kernel.erl:1149: "disallowed node ~w ** ~n", ),我们可以看到有3个函数有可能打印这个语句,分别是:
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
节点间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, 差了二个大版本, 这个是核心原因。
没有找到相关结果
已邀请:
1 个回复
[已注销]
static/image/common/sigline.gif
90%打工小伙一生都不可能知道的秘密 http://67177.miyue999.com/