9

私は分散型の 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$"

ノードn1n2を復元します。そう:

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>

ノードn1n2が戻ってきました。アプリケーションを手動で再起動する必要があるようです: *最初にノード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 ... すべてがハングします。アプリケーションは別のノードで再起動されませんでした。

実際、この記事を書いているときに、すべてが正常に機能する場合もあれば、問題が発生する場合もあることに気付きました。

「プライマリ」ノードを復元してもう一度殺すときに問題が発生する可能性がありますが、何かアイデアはありますか?

4

2 に答える 2

1

Learn You Some Erlang (一番下までスクロール) で説明されているように、分散アプリケーションはリリースの一部として開始された場合にのみ正常に機能し、 を使用して手動で開始した場合には機能しませんapplication:start

于 2012-05-28T17:07:48.160 に答える
0

n3 が最初のアプリケーションの初期化の下でまだ実行されている間に、ノード n1/n2 でアプリケーションを完全に再起動することに関係している可能性があります。

たとえば、アプリケーションがシステム全体のプロセスを開始し、global、pg、または pg2 で設定された登録済みの名前を使用するのではなく、それらの pid を使用する場合、2 つのセットのグローバル状態で作業している可能性があります。

この場合、推奨されるアプローチは、アプリケーション全体を再起動するのではなく、既存のアプリケーションからノードを追加/削除することに集中することです。このようにして、ノードは初期化された値の既存のセットを離れたり、参加したりします。

于 2011-06-21T09:08:40.400 に答える