И снова о реанимации epmd.

Apr 07, 2011 02:10

 На больших и толстых системах не единичны случаи невозможности коннекта к эрланговой ноде.
Это явно указывает на то, что epmd вдруг растерял всю свою информацию.
Если в нормальном своем состоянии он показывает что-то вида

> epmd -names
epmd: up and running on port 4369 with data:
name siden at port 54406

То после "падения":

> epmd -names
epmd: up and running on port 4369 with data:

Существует общеизветсное решение в узких кругах:
допустим у нас пропала нода mynodename@mynode
  • определить порт запущенной эрланговой ноды mynodename@mynode на mynode можно тем же netstat-ом (обычно это что-то между 40k и 60k)

    > netstat -an | grep LIST
    ...
    tcp4 0 0 *.54406 *.* LISTEN
    ...
  • находим ноду из нашего эрлангового кластера, которая "знает" о пропавшей ноде и отвечает на net_adm:ping('mynodename@mynode') понгом (т.е. она уже когда-то коннектилась к пропавшей ноде и данную информацию сохранила)
  • с этой найденной ноды делаем rpc:call('mynodename@mynode', erl_epmd, register_node, ['mynodename', 54406]).
И все хорошо.

Но что же делать когда нет возможности найти такую ноду.
  • находим необходимый порт как в предыдущем решении
  • запускаем эмулятор и выполняем следующее

    > erl
    Erlang R14B02 (erts-5.8.3) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
    Eshell V5.8.3 (abort with ^G)
    1> erl_epmd:start().
    {ok,<0.33.0>}
    2> erl_epmd:register_node(siden, 54406).
    {ok,2}
    3>
  • смотрим что нам говорит epmd

    > epmd -names
    epmd: up and running on port 4369 with data:
    name siden at port 54406
  • если сейчас закрыть этот эмулятор, то и информация из epmd пропадет, и все вернется на круги своя
  • вместо этого мы открываем еще один эмулятор с коннектом на потерявшийся инстанс

    > erl -sname siden2 -remsh 'siden@MacBook-SiDen'
    Erlang R14B02 (erts-5.8.3) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
    Eshell V5.8.3 (abort with ^G)
    (siden@MacBook-SiDen)1>
  • epmd теперь нам говорит

    epmd: up and running on port 4369 with data:
    name siden2 at port 54486
    name siden at port 54406
  • закрываем первый эмулятор и как и следовло ожидать информация о siden в epmd исчезла

    epmd: up and running on port 4369 with data:
    name siden2 at port 54486
  • во втором эмуляторе повторно выполняем

    > erl_epmd:register_node(siden, 54406).
  • статус epmd:

    epmd: up and running on port 4369 with data:
    name siden at port 54406
    name siden2 at port 54486
  • закрываем второй эмулятор
  • статус epmd:

    epmd: up and running on port 4369 with data:
    name siden at port 54406
Ну вот собственно и все.
Конектимся к было пропавшей ноде и успешно начинаем её истязать :)

fp

Previous post Next post
Up