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>
Надеюсь это поможет.