在DCOS / Marathon和docker上进行Hazelcast TCP / IP发现

我有一个在马拉松上部署的dockerized dropwizard服务。 我使用Hazelcast作为分布式caching,我开始有我的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); 

现在的问题:如果我使用networkingtypes作为BRIDGE在马拉松上部署,那么我不知道docker容器主机,因此我的2docker容器不知道对方。 它看起来像这样:

 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。

如果我使用networkingtypes作为HOST,那么一切正常,但问题是,我必须确保我的docker集装箱运行的端口总是有端口1001和10013可用。 (使用BRIDGEdocker容器端口绑定到一个随机的端口)。

分析:

这两个docker集装箱是在他们自己的networking本地化到奴隶。 他们需要使用从机的公网IP和5701的桥接端口(或者您使用的任何榛树端口)来识别对方。

在TCP / IPconfiguration中,在启动实例时设置公共地址和端口。 所有的实例都会这样做,他们将使用马拉松从IP和随机端口来相互通话。

使用容器内可用的marathon提供的HOST和PORT_5701variables来执行此操作。

 Config hzConfig = new Config(); hzConfig.getNetworkConfig().setPublicAddress( String.format("%s:%s", System.getenv("HOST"), System.getenv("PORT_5701"))); 

请参阅hazelcastnetworkingconfiguration文档以更多地了解公共地址选项。

您可以使用TCP / IP发现机制,并确保hazelcast节点绑定到docker容器的公共ip。 虽然在部署之前,如果您知道docker集装箱IP,此解决​​scheme可能会有所帮助。

<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>

让榛色成员发现彼此并形成一个群集是棘手的。 我结束了@bitsofinfo的build议 – https://github.com/hazelcast/hazelcast/issues/9219

@santanu的回答是正确的。 公众地址需要设置适当的榛色成员能够发现对方。 这是一个参数化的方式: https : //github.com/gagangoku/hazelcast-docker