我在马拉松上部署了一个dockerized dropwizard服务。我使用Hazelcast作为分布式缓存,我开始使用我的dropwizard服务。我已经设置了一个约束来确保每个容器都在一个唯一的主机上启动。
"constraints": [
[
"hostname",
"UNIQUE"
]
],
我在我的docker容器上公开了2个端口,10012
用于我的服务,10013
用于Hazelcast。我正在使用Zookeeper进行Dropwizard服务发现。因此,当我启动我的Hazelcast实例时,我可以访问运行我的docker容器的所有机器的主机名,并按如下所示添加所有这些主机名。
TcpIpConfig tcpIpConfig = join.getTcpIpConfig();
// finder is a handle to a service discovery service and the following gets me all the hosts on which my docker containers will run.
List<ServiceNode<ShardInfo>> nodes = finder.getAllNodes();
nodes.stream()
.peek(serviceNode -> log.info("Adding " + serviceNode.representation() + " to hazelcast."))
.map(serviceNode -> serviceNode.getHost())
.forEach(host -> tcpIpConfig.addMember(host));
tcpIpConfig.setRequiredMember(null).setEnabled(true);
现在问题: 如果我在部署Marathon时使用网络类型作为BRIDGE,那么我不知道docker容器主机,因此我的2个docker容器彼此不了解。它看起来像这样:
ip-10-200-2-219.ap-southeast-1.compute.internal (docker host) - 172.12.1.18 (docker container ip)
ip-10-200-2-220.ap-southeast-1.compute.internal (docker host) - 172.12.1.20 (docker container ip)
从zookeeper我得到了docker主机IP,但没有docker容器IP。
如果我使用网络类型作为HOST,那么一切正常,但问题是我必须确保我的docker容器正在运行的端口始终具有端口1001和10013可用。 (使用BRIDGE,docker容器端口绑定到随机端口)。
答案 0 :(得分:2)
<强>分析:强>
两个docker容器位于他们自己的网络中,本地化为从属。他们需要使用从站的公共IP和5701(或您正在使用的任何hazelcast端口)的桥接端口相互识别。
<强>解决方案强>
在TCP / IP配置中,在启动实例时设置公共地址和端口。所有实例都会这样做,他们将使用马拉松从属IP和用于它的随机端口相互通信。
使用marathon提供的HOST和PORT_5701变量,并在容器内部可用。
Config hzConfig = new Config();
hzConfig.getNetworkConfig().setPublicAddress(
String.format("%s:%s",
System.getenv("HOST"),
System.getenv("PORT_5701")));
请参阅hazelcast network config documentation以了解有关公共地址选项的更多信息。
答案 1 :(得分:1)
您可以使用TCP / IP发现机制并确保hazelcast节点绑定到docker容器的公共ip。虽然在部署之前,如果您知道docker容器IP,此解决方案可能会有所帮助。
<hazelcast>
...
<network>
...
<join>
<multicast enabled="false">
</multicast>
<tcp-ip enabled="true">
<member>docker-host1</member>
<member>docker-host2</member>
<member>172.12.1.20</member>
<member>192.168.1.21</member>
</tcp-ip>
...
</join>
...
</network>
...
</hazelcast>
答案 2 :(得分:0)
让hazelcast成员发现彼此并形成一个集群是棘手的。我最后听了@bitsofinfo的建议 - https://github.com/hazelcast/hazelcast/issues/9219
@santanu的回答是正确的。需要为hazelcast成员正确设置公共地址,以便能够相互发现。以下是执行此操作的参数化方法:https://github.com/gagangoku/hazelcast-docker