Vertd Hazelcast在Multidocker AWS中

时间:2016-07-25 06:00:10

标签: amazon-ec2 hazelcast vert.x

我尝试通过多个Docker容器在EC2节点上运行多个Vert.x实例。

容器A:   港口转发:5071 - > 5071   本地IP:172.17.0.4

容器B:   港口前进:5072 - > 5072   本地IP:172.17.0.5

容器C:   港口前锋:5073 - > 5073   本地IP:172.17.0.6

我使用Hazelcast Amazon EC2安装程序,但这不起作用,因为节点本身只有一个公共IP(在Hazelcastsetup中设置)并且无法添加端口。

如何在不同端口的aws中通过hazelcast运行多个vertx(也许这个不同的端口解决方案不是最好的)。

由于 烫发

P.s。:我试图通过tcp-ip setup添加节点,但不允许混合AWS和tcp join。

P.p.s:我不能也不想使用" - net = host"在AWS ElasticBeanstalk中

看起来像这样:https://github.com/hazelcast/hazelcast/issues/4537

更新

我的HC Config

    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

对于第一个Docker镜像,您应该通过

将端口设置为5701
hazelcastConfig.getNetworkConfig().setPort(5701);
第二个Docker Image上的

- 5702等等

您不需要链接Docker容器。只需为每个图像进行一次移植。

为此端口创建安全组,以便其他节点可以访问端口。

1 个答案:

答案 0 :(得分: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. 还要确保docker容器能够相互通信。