2016-07-25 17 views
0

我嘗試通過多個Docker容器在EC2節點上運行多個Vert.x實例。Multidocker中的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

我使用Hazelcast Amazon EC2的設置,但是這是行不通的,因爲節點自己只有一個公網IP(HAZ的設置elcastsetup)並且不可能添加端口。

如何在不同端口上的aws中通過hazelcast運行多個vertx(也許這個不同的端口解決方案不是最好的)。

感謝 馬塞爾

P.S:我試圖通過TCP-IP設置中添加節點,但它不允許混合AWS和TCP連接。

PPS:我不能,也不想用 「--net =主機」,在AWS ElasticBeanstalk

它看起來像這樣的: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

爲第1多克爾圖片,你應該在第二泊塢窗圖像通過

hazelcastConfig.getNetworkConfig().setPort(5701); 

設置端口5701 - 5702等

你不」不需要鏈接Docker容器。只需爲每個圖像創建一個端口映射。

爲這些端口創建一個安全組,以便其他節點可以訪問這些端口。

+0

您是否遇到問題,他們沒有形成集羣或無法從客戶端連接?請發佈配置詳細信息n集羣日誌語句。 –

+0

我發現,AWS發現只保存IP地址,而不是Hazelcast節點的端口。這意味着,如果您在不同的端口上運行具有多個Vert.x的One MultiDocker映像。無法檢測到彼此。目前,我嘗試使用hazelcast服務器啓動一個新的docker進程。 verx節點再次註冊這個內部hazelcast服務器。並且這個hazelcast服務器對其他外部節點是可達的。但目前,如果這個工作,我沒有答案。 –

+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);刪除後,它的作品。 –