IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Erlang节点间ping失败原因分析

Erlang非业余研究 2012-03-31 23:30:29 累计浏览 1,666 次
本机暂存

    原创文章,转载请注明: 转载自Erlang非业余研究

    本文链接地址: 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 [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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. gen_tcp发送进程被挂起起因分析及对策 (累计阅读 37,821)
  2. TCP 的那些事儿(上) (累计阅读 22,696)
  3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,933)
  4. 自建DNS以防止GFW干扰 (累计阅读 13,125)
  5. Zookeeper工作原理 (累计阅读 12,202)
  6. 浅谈TCP优化 (累计阅读 11,082)
  7. 推荐一些socket工具,TCP、UDP调试、抓包工具 (累计阅读 10,845)
  8. 查看 Apache并发请求数及其TCP连接状态 (累计阅读 10,069)
  9. 一致性哈希算法及其在分布式系统中的应用 (累计阅读 9,198)
  10. 让安卓手机通过代理翻墙的方法 (累计阅读 9,116)