Я плачу распределенными приложениями на erlang.
Конфигурация и идеи взяты из:
http: /www.erlang.org/doc/pdf/otp-system-documentation.pdf 9.9. Распределенные приложения
Файлы конфигурации:
[{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"}} ] }].
[{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"}} ] }].
Теперь запустите erlang в 3 отдельных терминалах:
Запустить приложение на каждом из узлов 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@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 ... все зависает. Приложение не было перезапущено на другом узле.
На самом деле, когда я писал этот пост, я понял, что иногда все идет хорошо, иногда у меня возникают проблемы.
Есть идеи, хотя могут возникнуть проблемы при восстановлении «основного» узла и его повторном уничтожении?