17

Erlangを接着剤として使用してクラスターを実装しようとしています。ノードの完全に接続されたグラフを作成するというアイデアは気に入っていますが、オンラインでさまざまな記事を読むと、これは適切にスケーリングされていないように見えます(最大50〜100ノード)。OTPの開発者は意図的にこの制限を課しましたか?明示的な接続のみを持ち、非表示のノードなどを持つようにノードをセットアップできることは知っています。しかし、デフォルトのすぐに使えるセットアップはあまりスケーラブルではないようです。

だから質問に:

  1. 5つのノード(A、B、C、D、E)があり、それらすべてにABCDEなどの明示的な接続がある場合。Erlang / OTPはAがEと直接通信することを許可しますか、それともAはEに到達するためにBからDにメッセージを渡す必要がありますか?したがって、それが完全接続グラフの理由ですか?繰り返しますが、それは理にかなっていますが、私が見たものからはうまくスケーリングしません。

  2. スケーラブルでフォールトトレラントなシステムを試してみるとしたら、どのような選択肢がありますか?ノードが多すぎるために完全に接続されたグラフを作成できない場合、次善の策はある種のツリーを作成することです。ただし、子ノードのルートまたは親が停止すると、クラスターのかなりの部分が失われるため、これはフォールトトレラントではないようです。

  3. スーパーバイザーとワーカーを調べる際に、私が見たすべての例は、これを単一ノード上のプロセスに適用します。フォールトトレランスの実装を支援するために、ノードのクラスターに適用できますか?

  4. ノードを複数のクラスターの一部にすることはできますか?

よろしくお願いします。最近見落としたウェブサイトやブログ投稿(約1年前)があれば、喜んで見ていきたいと思います。しかし、私はインターネットをかなりよく調べました。

4

5 に答える 5

12
  1. はい。たとえば、プロセス識別子(pid)を使用して、クラスター内の任意のリモートノード上のプロセスにメッセージを送信できます。これは、ロケーションの透過性と呼ばれます。そして、はい、それはうまくスケーリングします(Riak、CouchDB、RabbitMQなどを参照)。

  2. 1つのノードで数十万のプロセスを実行できることに注意してください。Erlangは非常にスケーラブルであることが証明されており、フォールトトレランスのために構築されました。CloudIのSOAアプローチなど、より大きく構築するための他のアプローチがあります(コメントを参照)。本当に必要な 場合は、非表示ノードを使用するクラスターを構築することもできます。

  3. ノードレベルでは、別のアプローチを取ります。たとえば、障害が発生して作業が残りのノードに引き継がれた場合に簡単に交換できる同一のノードを構築します。Riakがこれをどのように処理するかを確認してください(riak_coreブログ投稿Introducing Riak Coreを調べて確認してください)。

  4. ノードはクラスターを出入りすることができますが、同時に複数のクラスターの一部になることはできません。接続されたノードは、接続されたノードを識別するために使用される1つのクラスターCookieを共有します。VMの実行中にCookieを設定できます(分散Erlangを参照)。

より良いものについては、http://learnyousomeerlang.com/をお読みください。

于 2012-11-03T22:11:16.513 に答える
8

配布プロトコルは、スケーラビリティではなく、堅牢性を提供することを目的としています。あなたがしたいのは、クラスターをより小さなエリアにグループ化してから、ErlangではなくTCPセッションなどで配布される接続を使用することです。それぞれ10台のマシンからなる5つのグループを実行できます。これは、10台のマシンがシームレスなPid配布を備えていることを意味します。つまり、別のマシンでpidを呼び出すことができます。しかし、別のグループに配布するということは、そのようなグループにシームレスに対処できないことを意味します。

通常、BGPのように、ある種の「ルートリフレクション」が必要です。

于 2012-11-03T21:06:06.850 に答える
2

1)プロセス間で通信するには、ノード間の直接接続が必要だと思います。ただし、これは、2つのノードが通信しない場合(たとえば、ノードがコーディネーターではなくワーカーのみである場合)、すべてのノード間で永続的な接続を必要としないことを意味します。

2)完全に接続されていないerlangノードのグラフを作成できます。ドキュメントを見つけるのは難しく、問題がglobalあります。クラスター内のグローバル名を処理するシステムを無効にするため、ローカルに登録された名前、またはリモートノードにローカルに登録された名前ですべてを実行する必要があります。または、Pidsも機能するので、Pidsを使用してください。このようなerlangノードを起動するには、を使用しますerl ... -connect_all false ...。私はそれをすることを自分自身に信じることができなかったので、あなたがあなたが何をしているのかを知っていることを願っています。

また、erlangノードの完全に接続されていないグラフが現在の研究トピックであることがわかりました。RELEASEプロジェクトは現在まさにそれに取り組んでおり、本質的に完全に接続されたグループであるSグループの概念を考え出しました。ただし、ノードは複数のSグループのメンバーになることができ、別々のSグループのノードは完全に接続されている必要はありませんが、ノード間の直接通信を行うために必要な接続をオンデマンドで確立できます。研究は本当に興味深いので、彼らのプレゼンテーションを見つけることは価値があります。

指摘する価値のあるもう1つのことは、完全に接続されたクラスターで最大150〜200のノードを取得できることを何人かの人々が発見したことです。それよりも多くのノードのユースケースが本当にありますか?ばかげたプロジェクトがない限り、確かに150〜200台の信じられないほど頑丈なコンピューターはあなたがそれらに投げることができるほとんどのことをするでしょう。

3)を使用して別のノードでプロセスを開始することはできませんがgen_server:start_link/3,4、外部ノードのサーバーを非常に簡単に呼び出すことができます。彼らは外部ノードでサーバーを起動できることを見落としているようですが、それはおそらく正当な理由があります-ばかげた数のエラーケースなどです。

4)隠しノードを調べ、クラスターが完全に接続されていないことを確認してください。適切と思われるノードをグループ化できるようにする必要があります。

TL; DR:スケーリングは難しいので、買い物に行きましょう。

于 2012-11-04T12:12:25.550 に答える
1

すでに良い答えがいくつかあるので、私はシンプルにしようとしています。

1)いいえ、直接接続されていない場合A、とは通信できません。配布プロトコルは直接TCP接続で実行されます-ルーティングは含まれていません。EAE

2)ツリー構造で十分だと思います。トレードオフは常に存在します。

3)「ノードのスーパーバイザー」はありませんerlang:monitor_nodeが、あなたの友達です。

4)はい。ノードは、異なる「クラスター」からのノードと通信できます。ローカルノードで、を使用erlang:set_cookie(OtherNode, OtherCookie)して別のCookieを使用してリモートノードにアクセスします。

于 2012-11-08T08:29:51.093 に答える
0

1)はい。彼らはお互いに話します

2)3)および4)一般的に、スケーラブルでフォールトトレラントなシステムを構築する場合は、作業負荷をさまざまな「領域」または「クラスター」に分割する必要があります。スーパーバイザー/ワーカーモデルは、このようにトポロジを想定しています。必要なのは、クラスター間の作業を調整するいくつかのプロセスであり、1つのクラスター内のすべてのワーカーがグループ内でバランスを取るために相互に通信します。

ご覧のとおり、このトポロジでは、タスクを慎重かつバランスの取れた方法で分割する限り、「制限」は実際には制限ではありません。個人的には、スーパーバイザープロセスのツリーのような構造は大規模なシステムでは避けられないと思います。これが私が従う慣習です。理由はさまざまですが、スケーラビリティ、フォールバックポリシーの実装としてのフォールトトレランス、メンテナンスの必要性、およびクラスターの移植性に要約されます。

結論として、

2)スーパーバイザーにツリーのようなトポロジーを使用します。ワーカーが明示的に相互に接続し、自分のドメイン内でスーパーバイザーと会話できるようにします。

3)これはネイティブに設計された環境ですが、私が推測しているように、スーパーバイザーは別のマシンのワーカーと話すことができると確信しています。リモートワーカーのシナリオではフォールトトレランスが地獄になる可能性があるため、これはお勧めしません。

4)ノードを同時に2つの異なるクラスターの一部にしないでください。ただし、あるクラスターから別のクラスターに切り替えることはできます。

于 2013-12-17T14:35:09.250 に答える