我尝试通过多个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镜像,您应该通过
将端口设置为5701hazelcastConfig.getNetworkConfig().setPort(5701);
第二个Docker Image上的- 5702等等
您不需要链接Docker容器。只需为每个图像进行一次移植。
为此端口创建安全组,以便其他节点可以访问端口。
答案 0 :(得分:1)
以下是我的建议。如果它没有解决问题,那么请发布HZ日志声明。
hazelcastConfig.setProperty("hazelcast.local.localAddress", localIp);
第二次删除公共地址的设置。
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")));
}
如果可以,请尝试使用默认端口。正如您在评论中指出的那样,HZ存在一个问题,即不支持自定义端口。此外,AWSClient规范不允许指定自定义端口,它们倾向于使用默认端口5701,5702,5703。这是我几个月前创建的增强请求。 https://github.com/hazelcast/hazelcast-aws/issues/3
还要确保docker容器能够相互通信。