【问题标题】:net_adm:ping failure very strangenet_adm:ping 失败很奇怪
【发布时间】:2019-04-21 14:21:43
【问题描述】:

亲爱的,

我遇到了关于 Erlang 集群的问题。在我的集群工作了很长时间后,有一天,我无法与集群中的特定节点(例如 SickNode@X.X.X.X)建立任何连接,net_adm:ping(SickNode@X.X.X.X) 返回了一个痛苦的答案。即使使用:

erlang -name abc@X.X.X.X -setcookie MYCOOKIE -remsh SickNode@X.X.X.X

也返回失败结果。

奇怪的是,SickNode@X.X.X.X 在集群中的其他节点上运行良好当一个新节点加入集群并 ping 到 SickNode 时,问题刚刚发生。

这里没有任何防火墙,因为集群中的所有节点都运行良好。有没有人遇到这种糟糕的情况? Erlang 对于集群使用不稳定?

PS:我正在使用 Erlang/OTP 20 和 Centos 6.8

非常感谢!!!

【问题讨论】:

  • 两个问题:1.你能从你的新节点ping其他节点(即不是SickNode@X.X.X.X的节点)吗? / 2. 你能从 SickNode@X.X.X.X ping 你的新节点吗?
  • 1.我可以从新节点 ping 到除 SickNode 之外的所有其他节点。一个 pong 结果返回到新节点。/ 2. 从 SickNode,我无法 ping 到任何新节点。在 SickNode 中,使用 netstat 时,我可以看到旧连接保持不变。感谢您的帮助!
  • 所以……我知道你说过“SickNode@X.X.X.X 在集群中的其他节点上运行良好。”但仍然…… 3. 从 SickNode,你能 ping 其他节点吗(即不是新节点,只是其他一些健康的节点)? / 4. 从其他健康节点,你能ping SickNode吗? / 5.你检查过SickNode中的cookie还是'MYCOOKIE'吗?也许在该节点连接到集群后它发生了变化……
  • 我可以从病态节点对健康节点进行 ping pong,反之亦然。新节点只会出现问题。我认为您是对的,也许 cookie 已更改。但我想知道,是什么原因导致 cookie 发生了变化?虽然病态节点已经运行了很长时间。感谢您的帮助!

标签: erlang cluster-computing erlang-shell erlang-ports


【解决方案1】:

不是直截了当的答案,而是重现问题的理论和方法。 比较复杂,因为涉及到多个节点,看你能不能关注我。

TL;DR:SickNode@X.X.X.X在连接到集群后更改了它的 cookie。

所以,这就是我所做的…… 首先,在终端上,我使用 cookie x 启动 node1...

$ erl -name node1 -setcookie x
(node1@my.computer)1> 

然后,在另一个终端上,我使用 cookie x 启动 node2,将其连接到 node1 并将其 cookie 更改为 y...

$ erl -name node2 -setcookie x
(node2@my.computer)1> net_adm:ping('node1@my.computer').
pong
(node2@my.computer)2> erlang:set_cookie(node(), 'y').
true
(node2@my.computer)3>

然后,在另一个终端中,我启动 node3with cookie x 并 ping node1(这也导致了与 node2 的连接尝试,如下所示),然后明确地尝试连接给node2

$ erl -name node3 -setcookie x
(node3@my.computer)1> net_adm:ping('node1@my.computer').
pong
(node3@my.computer)2>
=WARNING REPORT==== 21-Nov-2018::15:09:07 ===
global: 'node3@my.computer' failed to connect to 'node2@my.computer'

=ERROR REPORT==== 21-Nov-2018::15:09:26 ===
** Connection attempt from disallowed node 'node2@my.computer' **
(node3@my.computer)2> net_adm:ping('node2@FERNANDO-BENAVIDES.Conyfero').
pang

到目前为止发生了什么?好吧,因为node1 的cookie 是xnode3 的cookie 也是x,所以他们可以连接。 node2 仍然连接到 node1 但是,由于那里的 cookie 有 ynode3 无法连接到它。

Erlang 尝试建立一个完全连接的节点网格,因此当您连接到其中一个时,它会自动尝试将您连接到所有其他节点。

但我想彻底,所以我从node3 ping node2,正如预期的那样,我得到了一个pang。此外,这些消息在node2 上弹出:

(node2@my.computer)3>
=ERROR REPORT==== 21-Nov-2018::15:09:07 ===
** Connection attempt from disallowed node 'node3@my.computer' **

=WARNING REPORT==== 21-Nov-2018::15:09:07 ===
global: 'node2@my.computer' failed to connect to 'node3@my.computer'

当然,当我尝试从node2 ping node3 时……

(node2@my.computer)3> net_adm:ping('node3@my.computer').
pang

但是……如果我尝试 ping node1……

(node2@my.computer)4> net_adm:ping('node1@my.computer').
pong

那是因为它们已经连接,而 Erlang 仅在初始握手时验证 cookie 的共享。

最后,如果我尝试从node1 ping 节点,我会得到预期的结果……

(node1@my.computer)1> net_adm:ping('node2@my.computer').
pong
(node1@my.computer)2> net_adm:ping('node3@my.computer').
pong
(node1@my.computer)3>

希望这会有所帮助。

【讨论】:

  • 再次感谢您的帮助!您的情况看起来与我的问题相同。但正如我上面评论的那样,我不知道改变 cookie 的根本原因是什么。你能推荐一些理由吗?实际上我重新启动了生病​​的节点,然后它运行良好。但这种情况对我来说很严重。所以目前,我无法检查 cookie 是否已更改。
  • 嗯……改变 cookie 最简单的方法是让某个进程运行 erlang:set_cookie/2 并记住:那个东西可以从 wherever 运行(即从 集群中的任何节点):> erlang:set_cookie('SickNode@X.X.X.X', 'the wrong cookie').
  • 如果有人使用“make”命令或“make clean”会导致cookie改变吗?我在 vm.args 文件中声明了 cookie,所以我认为没有人通过唱那个 api 来更改 cookie。谢谢你的帮助!!!
  • 我再次重现了这个问题,发现 cookie 并没有像我们讨论的那样改变。这里还有其他原因吗?使用 oberver_cli 检查 SickNode 后,新节点无法加入。
  • 嗯……也许observer_cli 是罪魁祸首。 “使用observer_cli后”是否总是发生?
猜你喜欢
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多