2016-10-02 4 views
1

私の現在の設定では、Hazelcastクラスタマネージャのデフォルトのマルチキャストオプションを使用しています。コンテナ化されたVertxモジュールのインスタンスを(Dockerネットワークリンク経由で)リンクすると、Hazelcastクラスタを正常に作成していることがわかります。しかし、イベントバス上のイベントをあるモジュールから公開しようとすると、他のモジュールはそれに反応しません。 Hazelcastクラスタのネットワーク設定が、イベントバスのネットワーク設定にどのように関係しているかわかりません。Dockerコンテナのクラスタをまたがって動作するVert.xイベントバスを設定するにはどうすればよいですか?

現時点では、それぞれ私のVert.xモジュールごとに以下のプログラム構成があり、それぞれがドッカーコンテナ内に配置されています。

ClusterManager clusterManager = new HazelcastClusterManager(); 
VertxOptions vertxOptions = new VertxOptions() 
      .setClustered(true) 
      .setClusterManager(clusterManager); 
vertxOptions.setEventBusOptions(new EventBusOptions() 
      .setClustered(true) 
      .setClusterPublicHost("application")); 

私はイベントバス用clusterPublicHost、およびclusterPublicPortを設定する必要がありますが、私はそれらが一般的なネットワークトポロジにどのように関係するかわからないんだけど、Vert.xのコアマニュアルの状態。

答えて

3

一つの答えがここにhttps://groups.google.com/d/msg/vertx/_2MzDDowMBM/nFoI_k6GAgAJ

である私は、この質問がたくさん出てくる見て、どのような多くの人が(私自身を含め) でドキュメントを欠場することはイベントバスが クラスタマネージャを使用していないということですイベントバスメッセージを送信する。私。あなたの例では、 Hazelcastをクラスタマネージャとして使用すると、Hazelcastクラスタが になり、適切に通信するようになります(Cluster Managerは正常です)。しかし、 イベントバスが原因次の1つ以上にあなたの他のドッキングウィンドウ のインスタンスとの通信に失敗している:

  1. 他のノードに間違ったIPアドレスを使用しようとしている(すなわちのIPドッカーインスタンス上のプライベートインターフェイスではなく、 は公に1にマッピングされた)
  2. ドッカーを転送するように設定されていないポートで通信しようとしている(あなたが 1を指定しない場合はイベントバスは、ダイナミックポートを選ぶ)

あなたは何ですか行うためのdは:

  1. は、他のノードは、[コマンドライン] -cluster-ホストを使用して(各インスタンスに話をするために使用するIPアドレス、 setClusterPublicHost [VertXOptions]または「vertx.cluster VERTXを教えてください。 [システムプロパティ]オプション
  2. イベントバス通信に使用するポートを明示的に指定し、Dockerがこれらのポートのトラフィックを確実に転送するようにします( "vertx.cluster.public.port" [Systemプロパティ]、setClusterPublicPort [VertXOptions]または-cluster-port [コマンドライン]オプション)。過去には、 私は15701を使用しました。これは覚えやすいためです(Hazelcastポートのfrom の '1')。

イベントバスが唯一の他のVERTXインスタンスのIP /ポート 情報と 消費者/プロデューサーの登録を管理するために、クラスタマネージャを使用しています。通信は クラスタ・マネージャとは独立して行われます。そのため、クラスタ・マネージャ を正しく構成して通信することができますが、イベント・バス の通信はまだありません。

両方のコンテナ が同じホストで実行されている場合は、上記の手順を両方実行する必要はありませんが、別のホストで を起動すると間違いなく開始します。

何か起こる可能性があるのは、イベントバスを介して通信するためにvert.x(ハローキャスティングではない)が取るべきIPを指定しないとき、vert.xはループバックインターフェイスを使用するということです。ここで問題となるのは、どのインタフェースを介して通信するか(ループバック、IPとのインタフェース、IPとの複数のインタフェースを持つことさえできる)がわからないということです。

この問題を克服するために、私はhttps://github.com/swisspush/vertx-cluster-watchdog/blob/master/src/main/java/org/swisspush/vertx/cluster/ClusterWatchdogRunner.java#L101

0

クラスタマネージャが正常に動作したら、クラスタマネージャの構成は、クラスタ内の各ノード(マシン/ドッカコンテナ)で同じである必要がありますかない方法を書きましたすべての構成を行います(クラスタ・マネージャのデフォルト構成を使用します)。

各ノードでイベントバス構成を一貫させる必要があるため、各ノードのクラスタホストをこのノード自体のIPアドレスと任意のポート番号に設定する必要があります(Vert以外のノード.xインスタンスを同じノードに配置するには、各Vert.xインスタンスに異なるポート番号を選択する必要があります)。例えば

ノードのIPアドレスが192.168.1.12であるならば、あなたは次の操作を行います:

VertxOptions options = new VertxOptions() 
       .setClustered(true) 
       .setClusterHost("192.168.1.56") // other node ip 
       .setClusterPort(17001) // it is ok because this is a different node 
       .setClusterManager(clusterManager); 
:IPアドレス192.168.1.56は、あなたが次のことを行うとされ、別のノード上の

VertxOptions options = new VertxOptions() 
       .setClustered(true) 
       .setClusterHost("192.168.1.12") // node ip 
       .setClusterPort(17001) // any arbitrary port but make sure no other Vert.x instances using same port on the same node 
       .setClusterManager(clusterManager); 

関連する問題