我嘗試通過多個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容器。只需爲每個圖像創建一個端口映射。
爲這些端口創建一個安全組,以便其他節點可以訪問這些端口。
您是否遇到問題,他們沒有形成集羣或無法從客戶端連接?請發佈配置詳細信息n集羣日誌語句。 –
我發現,AWS發現只保存IP地址,而不是Hazelcast節點的端口。這意味着,如果您在不同的端口上運行具有多個Vert.x的One MultiDocker映像。無法檢測到彼此。目前,我嘗試使用hazelcast服務器啓動一個新的docker進程。 verx節點再次註冊這個內部hazelcast服務器。並且這個hazelcast服務器對其他外部節點是可達的。但目前,如果這個工作,我沒有答案。 –
我相信它的公共IP地址配置是你所缺少的。所以請在這裏發佈HZ配置細節。 –