net_adm: сбой проверки связи очень странный

Dears,

У меня проблема с кластером Erlang. После долгого времени работы моего кластера, однажды я не могу больше подключиться к конкретному узлу (например, SickNode@XXXX) в кластере, net_adm:ping(SickNode@XXXX) возвращает ответ pang. Даже используя:

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

вернуть результат ошибки тоже.

Странно то, что SickNode@XXXX хорошо работает с другими узлами в кластере. Проблема только что произошла, когда новый узел присоединяется к кластеру и пингует SickNode.

Здесь нет никакого брандмауэра, потому что все узлы хорошо работают в кластере. Есть ли у кого такая плохая ситуация? Erlang не является стабильным для использования кластера?

PS: я использую Erlang/OTP 20 с Centos 6.8

Большое спасибо!!!

1 ответ

Не прямой ответ, а теория и способ воспроизвести вашу проблему. Это сложно, потому что включает в себя несколько узлов, но давайте посмотрим, сможете ли вы следовать за мной.

TL; DR: SickNode @ XXXX изменил свой файл cookie после подключения к кластеру.

Итак, это то, что я сделал... Во-первых, на терминале я начал node1 с печеньем x...

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

Затем на другом терминале я начал node2 с печеньем xподключил это к node1 и изменил свое печенье на 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>

Затем в еще одном терминале я начал node3с печеньем x и пингуется 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печенька была x а также node3печенька была x а также они могли подключиться. node2 был еще подключен к node1 но, так как печенье было y, node3 не может подключиться к нему.

Эрланг пытается установить полностью подключенную сетку узлов, поэтому, когда вы подключаетесь к одному из них, он автоматически пытается подключить вас ко всем остальным.

Но я хотел быть тщательным, поэтому я пинговал node2 от 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'

И, конечно же, когда я пытался пинговать node3 от node2...

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

Но... если я попытаюсь пинговать node1...

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

Это потому, что они уже подключены, и Эрланг только проверяет совместное использование куки при первом рукопожатии.

Наконец, если я попытаюсь пинговать узлы из node1Я получаю ожидаемые результаты...

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

Надеюсь это поможет.

Другие вопросы по тегам