Erlang: Странное поведение распределенного приложения

Я плачу распределенными приложениями на erlang.

Конфигурация и идеи взяты из:
http: /www.erlang.org/doc/pdf/otp-system-documentation.pdf 9.9. Распределенные приложения

  • У нас есть 3 узла: n1 @ a2-X201, n2 @ a2-X201, n3 @ a2-X201
  • У нас есть приложение wd , которое выполняет некоторую полезную работу :)

Файлы конфигурации:

  • wd1.config - для первого узла:
      [{kernel,
          [{distributed,[{wd,5000,['n1@a2-X201',{'n2@a2-X201','n3@a2-X201'}]}]},
           {sync_nodes_mandatory,['n2@a2-X201','n3@a2-X201']},
           {sync_nodes_timeout,5000}
        ]}
      ,{sasl, [
      %% All reports go to this file
      {sasl_error_logger,{file,"/tmp/wd_n1.log"}}
      ]
    }].
  • wd2.config для второго:
    [{kernel,
        [{distributed,[{wd,5000,['n1@a2-X201',{'n2@a2-X201','n3@a2-X201'}]}]},
         {sync_nodes_mandatory,['n1@a2-X201','n3@a2-X201']},
         {sync_nodes_timeout,5000}
         ]
     }
    ,{sasl, [
        %% All reports go to this file
        {sasl_error_logger,{file,"/tmp/wd_n2.log"}}
    ]
    }].

  • Для узла n3 выглядит аналогично.

Теперь запустите erlang в 3 отдельных терминалах:

  • erl -sname n1 @ a2-X201 -config wd1 -pa $ WD_EBIN_PATH -boot start_sasl
  • erl -sname n2 @ a2-X201 -config wd2 -pa $ WD_EBIN_PATH -boot start_sasl
  • erl -sname n3 @ a2-X201 -config wd3 -pa $ WD_EBIN_PATH -boot start_sasl

Запустить приложение на каждом из узлов erlang: * application: start (wd).

(n1@a2-X201)1> application:start(wd).

=INFO REPORT==== 19-Jun-2011::15:42:51 ===
wd_plug_server starting... PluginId: 4 Path: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" 
ok
(n2@a2-X201)1> application:start(wd).
ok
(n2@a2-X201)2> 
(n3@a2-X201)1> application:start(wd).
ok
(n3@a2-X201)2> 

На данный момент все в порядке. Как написано в документации Erlang: Приложение работает на узле n1 @ a2-X201

Теперь уничтожить узел n1 : Приложение было перенесено на n2

(n2@a2-X201)2> 
=INFO REPORT==== 19-Jun-2011::15:46:28 ===
wd_plug_server starting... PluginId: 4 Path: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" 

Продолжить наша игра: kill node n2 Еще раз система работает нормально. У нас есть приложение на узле n3

(n3@a2-X201)2> 
=INFO REPORT==== 19-Jun-2011::15:48:18 ===
wd_plug_server starting... PluginId: 4 Path: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" 

. Теперь восстанавливаем узлы n1 и n2 . Итак:

Erlang R14B (erts-5.8.1) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.1  (abort with ^G)
(n1@a2-X201)1> 

Eshell V5.8.1  (abort with ^G)
(n2@a2-X201)1> 

Узлы n1 и n2 вернулись.
Похоже, теперь мне нужно перезапустить приложение вручную: * Давайте сначала сделаем это на узле n2 :

(n2@a2-X201)1> application:start(wd).
  • Похоже, что оно зависло ...
  • Теперь перезапустите его на n1
(n1@a2-X201)1> application:start(wd).

=INFO REPORT==== 19-Jun-2011::15:55:43 ===
wd_plug_server starting... PluginId: 4 Path: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" 

ok
(n1@a2-X201)2> 

Это работает. И узел n2 также вернул ОК:

Eshell V5.8.1  (abort with ^G)
(n2@a2-X201)1> application:start(wd).
ok
(n2@a2-X201)2> 

На узле n3 мы видим:

=INFO REPORT==== 19-Jun-2011::15:55:43 ===
    application: wd
    exited: stopped
    type: temporary

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

Теперь убейте узел n1 еще раз:

(n1@a2-X201)2> 
User switch command
 --> q
[a2@a2-X201 releases]$ 

Ops ... все зависает. Приложение не было перезапущено на другом узле.

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

Есть идеи, хотя могут возникнуть проблемы при восстановлении «основного» узла и его повторном уничтожении?

8
задан Anton Prokofiev 19 June 2011 в 14:13
поделиться