私は分散型の 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 - 最初のノードの場合:
[{カーネル、 [{配布された,[{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, [ %% すべてのレポートはこのファイルに移動します {sasl_error_logger,{file,"/tmp/wd_n1.log"}} ] }]。
- 2 番目の wd2.config:
[{カーネル、 [{配布された,[{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, [ %% すべてのレポートはこのファイルに移動します {sasl_error_logger,{file,"/tmp/wd_n2.log"}} ] }]。
- ノード n3 の場合も同様です。
3 つの別々のターミナルで erlang を起動します。
- 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> アプリケーション: 開始 (wd)。 =INFO REPORT==== 2011 年 6 月 19 日::15:42:51 === wd_plug_server starting... PluginId: 4 パス: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" わかった
(n2@a2-X201)1> アプリケーション:開始(wd)。 わかった (n2@a2-X201)2>
(n3@a2-X201)1> アプリケーション: 開始 (wd)。 わかった (n3@a2-X201)2>
現時点では、すべて問題ありません。Erlang ドキュメントに記載されているとおり: アプリケーションはノードn1@a2-X201で実行されています。
ここでノードn1を終了します: アプリケーションはn2に移行されました
(n2@a2-X201)2> =INFO REPORT==== 2011 年 6 月 19 日::15:46:28 === wd_plug_server starting... PluginId: 4 パス: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$"
ゲームを続けます: ノードn2を殺します もう一度システムが正常に動作します。ノードn3にアプリケーションがあります
(n3@a2-X201)2> =INFO REPORT==== 2011 年 6 月 19 日::15:48:18 === wd_plug_server starting... PluginId: 4 パス: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$"
ノードn1とn2を復元します。そう:
Erlang R14B (erts-5.8.1) [ソース] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.8.1 (^G で中止) (n1@a2-X201)1> Eshell V5.8.1 (^G で中止) (n2@a2-X201)1>
ノードn1 とn2が戻ってきました。アプリケーションを手動で再起動する必要があるようです: *最初にノードn2
で実行しましょう:
(n2@a2-X201)1> アプリケーション:開始(wd)。
- ぶら下がったように見えます...
- n1で再起動します
(n1@a2-X201)1> アプリケーション: 開始 (wd)。 =INFO REPORT==== 2011 年 6 月 19 日::15:55:43 === wd_plug_server starting... PluginId: 4 パス: "/home/a2/src/erl/data/SIG" FileMask: "(?i)(.*)\\.SIG$" わかった (n1@a2-X201)2>
できます。また、ノードn2も OK を返しました。
Eshell V5.8.1 (^G で中止) (n2@a2-X201)1> アプリケーション:開始(wd)。 わかった (n2@a2-X201)2>
ノードn3では、次のことがわかります。
=INFO REPORT==== 2011 年 6 月 19 日::15:55:43 === アプリケーション: WD 終了しました: 停止しました タイプ: 一時的
ノードn2でアプリケーションを開始する際の遅延を除いて、ドキュメントに書かれているように、一般的にはすべて問題ないように見えます。
ノードn1をもう一度killします。
(n1@a2-X201)2> ユーザー切り替えコマンド --> ん [a2@a2-X201 リリース]$
Ops ... すべてがハングします。アプリケーションは別のノードで再起動されませんでした。
実際、この記事を書いているときに、すべてが正常に機能する場合もあれば、問題が発生する場合もあることに気付きました。
「プライマリ」ノードを復元してもう一度殺すときに問題が発生する可能性がありますが、何かアイデアはありますか?