Erlang节点间ping失败原因分析

运维 系统运维
今天和项仲在部署新系统的时候发现节点间ping不成功的情况,类似 1> net_adm:ping(‘xx@ip1′). pang 这个问题比较普遍,我就记录下一步步的排除步骤.

 今天和项仲在部署新系统的时候发现节点间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]),

    我们可以看到有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, 差了二个大版本, 这个是核心原因。

     换成同样的版本的erlang问题解决!如下:

 

    小结: Erlang版本不混用,即使混用最好不超过2个版本。

【编辑推荐】

  1. 猎豹浏览器初体验
  2. Windows安全最高境界
  3. IE8安全新功能实测,到底给不给力?
责任编辑:赵宁宁
相关推荐

2011-06-30 09:25:22

软件项目

2016-12-12 12:55:24

模块分析解决

2009-07-31 09:14:01

WinCE启动失败

2017-11-15 08:54:00

2024-05-23 08:40:46

Kubernetes预过滤调度

2019-10-17 21:14:08

Kubernetes节点Python

2023-01-14 17:45:28

数据分析项目

2009-04-03 09:06:00

浏览器W3C标准

2012-08-16 09:07:57

Erlang

2023-01-29 16:38:19

人工智能项目数据仓库

2020-11-10 09:21:29

MySQL数据库SQL

2021-06-18 10:03:37

变革管理首席信息官CIO

2024-10-30 14:50:31

2019-11-05 15:11:55

CIOERPP失败

2020-07-09 10:26:28

软件项目软件开发CIO

2023-03-09 07:13:40

数字化转型交付

2013-05-02 09:55:08

局域网远程连接失败

2013-04-26 09:26:56

软路由升级失败

2021-05-10 09:35:58

Kubernetes节点Join

2018-08-15 06:52:47

点赞
收藏

51CTO技术栈公众号