0

亲爱的,

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

erlang -name abc@XXXX -setcookie MYCOOKIE -remsh SickNode@XXXX

也返回失败结果。

奇怪的是,SickNode@XXXX 对集群中的其他节点运行良好当一个新节点加入集群并 ping 到 SickNode 时,问题就发生了。

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

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

非常感谢!!!

4

1 回答 1

2

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

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

所以,这就是我所做的……首先,在终端上我从node1cookie开始x……</p>

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

然后,在另一个终端上,我从node2cookie开始x,将其连接到node1并将其 cookie 更改为y……</p>

$ 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>

然后,在另一个终端中,我从node3cookie开始x并 ping node1(这也导致了连接尝试node2,如下所示),然后明确地尝试连接到node2……</p>

$ 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 是x并且node3' 的 cookiex也是,他们可以连接。node2仍然连接到,node1但由于 cookie 存在ynode3无法连接到它。

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

但我想彻底,所以我node2从ping 通node3,正如预期的那样,我得到了一个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'

当然,当我尝试node3node2……ping 通时</p>

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

但是……如果我尝试 ping node1……</p>

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

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

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

(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>

希望这可以帮助。

于 2018-11-21T18:21:38.407 回答