2016-07-25 4 views
0

複数のDocker Containerを介してEC2ノードで複数のVert.xインスタンスを実行しようとしています。Vert.xマルチドッカーのHazelcast AWS

コンテナA: ポートForwardning:5071 - > 5071 ローカルIP:172.17.0.4

コンテナB: ポートForwardning:5072 - > 5072 ローカルIP:172.17.0.5

コンテナC : ポートForwardning:5073 - > 5073 ローカルIP:172.17.0.6

iはHazelcast Amazon EC2のセットアップを使用しますが、ノード自身が一つだけ公開IPを持っているので、これは、動作しない(ハズで設定elcastsetup)、ポートを追加する可能性はありません。

どのように私は別のポート(おそらく、この異なるポートの解決策ではない)でawsでヘイルキャストを介して複数のvertxを実行することができます。

おかげ マルセル

P.s:私はTCP-IP設定を経由してノードを追加しようとしましたが、それは混合AWSとTCPの参加を許可されていません。

PPS:私はできませんし、それはこの1つのように見えるAWS ElasticBeanstalk

で "--net = host" を使用したくない:https://github.com/hazelcast/hazelcast/issues/4537

更新:

私のHCコンフィグ

JsonObject amazonConfig = clusterConfig.getJsonObject("aws"); 

    String publicIp = null; 
    String privateIp = null; 
    String localIp = InetAddress.getLocalHost().getHostAddress(); 

    logger.info("Found local IP: " + localIp); 

    try { 
     publicIp = doHttpUrlConnectionAction("http://169.254.169.254/latest/meta-data/public-ipv4"); 

     logger.info("Found public IP: " + publicIp); 

     privateIp = doHttpUrlConnectionAction("http://169.254.169.254/latest/meta-data/local-ipv4"); 
     logger.info("Found private IP: " + privateIp); 

    } catch (IOException | InterruptedException e) { 
     logger.fatal("Cannot detect public cloud ip"); 
     throw e; 
    } 

    logger.info("AWS Cluster config loaded"); 

    hazelcastConfig.getNetworkConfig().setPublicAddress(privateIp); 
    hazelcastConfig.getNetworkConfig().setPortAutoIncrement(false); 

    if (amazonConfig.containsKey("hazelcastPort")) { 
     logger.info("Use port " + amazonConfig.getString("hazelcastPort") + " for hazelcast"); 

     hazelcastConfig.getNetworkConfig() 
       .setPublicAddress(privateIp + ":" + amazonConfig.getString("hazelcastPort")); 

     hazelcastConfig.getNetworkConfig().setPort(Integer.valueOf(amazonConfig.getString("hazelcastPort"))); 
    } 

    // hazelcastConfig.setProperty("hazelcast.local.localAddress", 
    // localIp); 

    hazelcastConfig.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); 
    hazelcastConfig.getNetworkConfig().getJoin().getAwsConfig().setEnabled(true); 

    // hazelcastConfig.getNetworkConfig().getInterfaces().setEnabled(true).addInterface(localIp); 

    if (amazonConfig.containsKey("region")) { 
     hazelcastConfig.getNetworkConfig().getJoin().getAwsConfig().setRegion(amazonConfig.getString("region")); 
    } 
    if (amazonConfig.containsKey("accessKey")) { 
     hazelcastConfig.getNetworkConfig().getJoin().getAwsConfig() 
       .setAccessKey(amazonConfig.getString("accessKey")); 
    } 
    if (amazonConfig.containsKey("secretKey")) { 
     hazelcastConfig.getNetworkConfig().getJoin().getAwsConfig() 
       .setSecretKey(amazonConfig.getString("secretKey")); 
    } 

    try { 
     String hazelcastGroup = System.getenv("HAZELCASTGROUP"); 

     logger.info("Join Hazelcast Nodes with Tag HAZELCASTGROUP and Value " + hazelcastGroup); 

     hazelcastConfig.getNetworkConfig().getJoin().getAwsConfig().setTagKey("HAZELCASTGROUP"); 
     hazelcastConfig.getNetworkConfig().getJoin().getAwsConfig().setTagValue(hazelcastGroup); 

    } catch (Exception e) { 
     logger.error("Cannot detect hazelcastgroup: " + e.getMessage(), e); 

     throw e; 
    } 

    mgr = new HazelcastClusterManager(hazelcastConfig); 

    vertxOptions = new VertxOptions().setClusterManager(mgr).setClustered(true); 

ソリューション

// privateIp = doHttpUrlConnectionAction("http://169.254.169.254/latest/meta-data/local-ipv4"); 

hazelcastConfig.getNetworkConfig().setPublicAddress(privateIp); 

いけない第一ドッカーイメージのためsetPortAutoIncrement

を無効にし、2番目のドッカー画像に

hazelcastConfig.getNetworkConfig().setPort(5701); 

を経て5701にポートを設定する必要があります - 5702など

あなたドン」にDocker Containerをリンクする必要はありません。各画像のポートマッピングを作成するだけです。

他のノードがポートにアクセスできるように、このポートのセキュリティグループを作成します。

+0

クラスタを形成していない、またはクライアントから接続できないという問題に直面していますか?設定の詳細とクラスタログステートメントを投稿してください。 –

+0

AWS Discoveryは、Hazelcastノードのポートではなく、IPアドレスを保存するだけです。これは、差分ポート上に複数のVert.xがある1つのMultiDockerイメージを実行している場合に意味します。お互いを検出することはできません。現在、私はそこにヘーゼルキャストサーバーを持つ新しいドッカープロセスを開始しようとしています。 verxノードはこの内部ヘイズキャストサーバを再び登録します。このハローキャストサーバは他の外部ノードに到達可能です。しかし、現在、私はこれがうまくいけば、答えはありません。 –

+0

私はパブリックIPアドレスの設定はあなたが逃していると信じています。ですから、HZ設定の詳細をここに投稿してください。 –

答えて

1

ここに私の推薦があります。問題が解決しない場合は、HZログステートメントを投稿してください。

  1. localAddressのプロパティを追加する行のコメントを外します。 hazelcastConfig.setProperty("hazelcast.local.localAddress", localIp);
  2. 明示的にtcp-ip設定を無効にします。
  3. パブリックアドレスの設定をもう一度削除します。

    hazelcastConfig.getNetworkConfig().setPublicAddress(privateIp); 
    hazelcastConfig.getNetworkConfig().setPortAutoIncrement(false); 
    
    if (amazonConfig.containsKey("hazelcastPort")) { 
        logger.info("Use port " + amazonConfig.getString("hazelcastPort") + " for hazelcast"); 
        hazelcastConfig.getNetworkConfig().setPort(Integer.valueOf(amazonConfig.getString("hazelcastPort"))); 
    } 
    
  4. 可能であれば、デフォルトポート自体を使用しようとします。コメントで指摘したように、カスタムポートをサポートしていないHZの問題がありました。また、AWSClient仕様ではカスタムポートを指定できません。デフォルトポート5701,5702,5703を使用する傾向があります。ここには数ヶ月前に作成した拡張要求があります。 https://github.com/hazelcast/hazelcast-aws/issues/3

  5. また、ドッカーのコンテナが互いに通信できることを確認してください。

+1

あなたのコメントはインスピレーションでした。私のポストに正しい解決策を入力しました。ありがとう –

+0

主な問題はhazelcastConfig.getNetworkConfig()です。setPortAutoIncrement(false);これを取り除いた後で動作します。 –