9

バックグラウンド

  • ノードの起動時に自動起動されるアプリケーションがあります (.rel、.boot などを使用)。
  • 最初のノードがダウンした場合、アプリケーションを別のノードにフェイルオーバーさせたい。
  • Erlang の分散アプリケーション機能を使用して、フェイルオーバーとテイクオーバーを処理します。

問題

問題は、分散アプリケーション ネゴシエーションの一部として、ノードがハンドシェイクして、どのノードが稼働状態を維持し、どのノードが静止するかを決定するときに、アプリケーションがすべてのノードで開始されることです。可能であれば、複数のノードでアプリケーションを起動しないようにする必要があります。

質問

  • 分散アプリケーションの起動ネゴシエーションに関与している場合を除き、ノードにアプリケーションを自動的に起動させる方法はありますか? あるいは、
  • アプリケーションを複数のノードで (短時間でも) 起動する必要なく、アプリケーションを無人で起動してフェイルオーバーさせるにはどうすればよいですか?
4

1 に答える 1

4

残念ながら、Erlang のテイクオーバー機能とフェールオーバー機能は最近かなり制限されているため、これらの機能を機能させるには、すべてのノードでアプリケーションを実行する必要があります。

私の頭に浮かぶ唯一のアイデアは、少しクレイジーで、もう 1 レベルの間接化を伴うものですが、実際にはうまくいくかもしれません。

偽の軽量なラッパーアプリケーションを作成し、それをすべてのノードで開始することができます。このアプリケーションは、標準の Erlang 配布機能を使用します。次に、元のアプリケーションを起動するだけで、テイクオーバー/フェイルオーバー戦略を実装します。

-module(wrapper).
-behaviour(application).

[...]

start({takeover, _Node}, _Args) ->
  application:start(original_app).

[...]

また、application:start(my_app)すべてのノードで分散アプリを入力しても、すべてのノードでアプリケーションが開始されるわけではないことに注意してください。application:which_applications()各ノードに入力することで確認できます。アプリケーションが1 つのノードでどのように実行されているかがわかります。

最後に、アプリケーションを複数のノードで起動できない理由をお伺いしてもよろしいですか?

于 2012-09-18T10:02:25.340 に答える