12

Erlang で監視ツールを構築しています。クラスターで実行する場合、すべてのノードで一連のデータ収集機能を実行し、単一の「レコーダー」ノードで RRD を使用してそのデータを記録する必要があります。

現在のバージョンには、マスター ノード ( rolf_node_sup) で実行されているスーパーバイザがあり、クラスタ内の各ノードで 2 番目のスーパーバイザを実行しようとします ( rolf_service_sup)。次に、ノード上の各スーパーバイザは、マスター ノードの gen_server にメッセージを送信する一連のプロセスを開始および監視する必要があります ( rolf_recorder)。

これはローカルでのみ機能します。どのリモート・ノードでもスーパーバイザーは開始されません。次のコードを使用して、レコーダー ノードからノード上のスーパーバイザーをロードしようとします。

rpc:call(Node, supervisor, start_child, [{global, rolf_node_sup}, [Services]])

スーパーバイザーは実際にはローカル プロセス専用に設計されていると示唆する人を何人か見つけました。例えば

クラスター内のすべてのノードで監視されたコードを実行するという私の要件を実装するための最も OTP の方法は何ですか?

  • 分散アプリケーションは、分散スーパーバイザ ツリーの代替案の 1 つとして提案されています。これらは私のユースケースには合いません。ノード間のフェールオーバーを提供しますが、一連のノードでコードを実行したままにします。
  • プールモジュールは興味深いものです。ただし、すべてのノードではなく、現在最も負荷の低いノードでジョブを実行できます。
  • proc_lib:spawn_link別の方法として、各ノードでスーパーバイザを起動するために使用する、監視対象の「プロキシ」プロセスのセット (ノードごとに 1 つ) をマスター上に作成することもできます。ノードで何か問題が発生した場合、プロキシ プロセスは終了し、そのスーパーバイザによって再起動され、リモート プロセスが再起動されます。ここでは、 slaveモジュールが非常に役立ちます。
  • または多分私は過度に複雑です。ノードを直接監視するのは悪い考えです。代わりに、より疎結合の方法でデータを収集するようにアプリケーションを設計する必要があります。複数のノードでアプリを実行してクラスターを構築し、1 つをマスターに指定して、そのままにしておきます。

いくつかの要件:

  • アーキテクチャは、手動で介入することなく、プールに参加したりプールから離れたりするノードに対処できる必要があります。
  • 簡単にするために、少なくとも最初はシングルマスターソリューションを構築したいと思います。
  • 私の実装では、手巻きのコードよりも既存の OTP 機能を使用したいと考えています。
4

2 に答える 2

5

複数の解決策がある興味深い課題。以下は私の提案にすぎません。プログラムの書き方をより適切に選択できるようになることを願っています。

私があなたのプログラムを理解しているように、アプリケーションを開始するマスターノードが 1 つ必要です。これにより、クラスター内のノードで Erlang VM が起動します。poolモジュールはモジュールを使用slaveしてこれを行いますが、これには双方向でのキーベースの ssh 通信が必要です。また、適切な dns が機能している必要があります。

の欠点はslave、マスターが死ぬとスレーブも死ぬことです。これはおそらく元のユースケースに完全に適合するため、設計によるものですが、あなたの場合は愚かかもしれません(たとえば、マスターがダウンしていてもデータを収集したい場合があります)

OTP アプリケーションに関しては、すべてのノードが同じアプリケーションを実行できます。コードでは、構成または検出を使用してクラスター内のノードの役割を決定できます。

OS 機能やデーモンツールなどを使用して Erlang VM を起動することをお勧めします。すべての VM は同じアプリケーションを開始し、1 つがマスターとして開始され、残りはスレーブとして開始されます。これには、 のようにクラスタ内で起動するマシンでソフトウェアを「自動的に」実行するのが難しくなるという欠点がありますがslave、はるかに堅牢でもあります。

どのアプリケーションでも、ノードの役割に基づいて適切な監視ツリーを持つことができます。ノード間の監視とスポーンを削除すると、システムが大幅に簡素化されます。

また、すべてのノードをマスターにプッシュすることをお勧めします。この方法では、マスターはスレーブで何が起こっているかを実際に気にする必要はなく、ノードがダウンしているという事実を無視することさえあります。これにより、マスターを変更せずに新しいノードを追加することもできます。Cookie は認証として使用できます。複数のマスターまたは「レコーダー」も比較的簡単です。

ただし、「スレーブ」ノードは、マスターのダウンとアップに注意し、監視データを保存して、後でマスターがバックアップされたときに送信できるようにするなど、適切なアクションを実行する必要があります。

于 2011-04-03T21:17:33.210 に答える
3

riak_core を調べます。erlang と otp 自体の生の機能の上に分散アプリケーションを管理するためのインフラストラクチャのレイヤーを提供します。riak_core の下では、ノードをマスターとして指定する必要はありません。otp の意味で中心的なノードはなく、どのノードも障害のある他のノードを引き継ぐことができます。これがフォールト トレランスの本質です。さらに、riak_core は、マスター/スレーブ ポリシーに頼る必要なく、クラスターに参加したりクラスターから離れたりするノードのエレガントな処理を提供します。

この種の「トポロジー」分散化は便利ですが、通常、分散アプリケーションには論理的に特別なノードが必要です。このため、riak_core ノードは、特定のクラスター サービスを提供していることをアドバタイズできます。たとえば、ユース ケースで具現化されているように、結果コレクター ノードです。

もう 1 つの興味深い機能/アーキテクチャの結果は、riak_core が「gossip」プロトコルを介してクラスタ メンバーに表示されるグローバルな状態を維持するメカニズムを提供することです。

基本的に、riak_core には、高性能で信頼性が高く柔軟な分散システムを開発するための便利なコードが多数含まれています。あなたのアプリケーションは非常に複雑に思えますが、堅牢な基盤があれば遅かれ早かれ利益が得られます。

おっと、まだほとんどドキュメントがありません。:(

以下は、riak_core を使用して作成した内部 AOL アプリについて語っている人物です。

http://www.progski.net/blog/2011/aol_meet_riak.html

以下は、鉄筋テンプレートに関するメモです。

http://lists.basho.com/pipermail/riak-users_lists.basho.com/2011-March/003632.html

...そして、ここにその rebar テンプレートのフォークに関する投稿があります:

https://github.com/rzezeski/try-try-try/blob/7980784b2864df9208e7cd0cd30a8b7c0349f977/2011/riak-core-first-multinode/README.md

...riak_core で話します:

http://www.infoq.com/presentations/Riak-Core

...riak_core アナウンス:

http://blog.basho.com/2010/07/30/introducing-riak-core/

于 2011-04-03T22:54:47.660 に答える