我在marathon上部署了一个停靠的dropwizard服务。我使用hazelcast作为分布式缓存,我启动了dropwizard服务的一部分。我设置了一个约束,以确保每个容器在一个唯一的主机上启动。
"constraints": [
[
"hostname",
"UNIQUE"
]
],
我在docker容器上暴露了两个端口, 10012
为了我的服务和 10013
为了哈泽尔卡斯特。我正在使用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上部署时使用network type作为网桥,那么我不知道docker容器主机,因此我的两个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。
如果我使用网络类型作为主机,那么一切都正常,但问题是,我必须确保docker容器运行的端口始终具有可用的端口1001和10013(通过网桥,docker集装箱港口被绑定到一个随机的港口上。
3条答案
按热度按时间p1tboqfb1#
您可以使用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>
jrcvhitl2#
分析:
这两个docker容器位于它们自己的网络中,该网络定位于从属容器。它们需要使用从机的公共ip和5701所连接的桥接端口(或您正在使用的任何hazelcast端口)相互识别。
解决方案
在tcp/ip配置中,设置启动示例时的公共地址和端口。所有示例都将这样做,它们将使用marathon从属ip和用于该ip的随机端口相互通信。
使用marathon提供的主机和端口\u5701变量以及容器内的可用变量来执行此操作。
请参阅hazelcast网络配置文档,了解有关公共地址选项的更多信息。
sigwle7e3#
让hazelcast成员互相发现并形成一个集群是很棘手的。最后我听从了@bitsofinfo的建议-https://github.com/hazelcast/hazelcast/issues/9219
@桑塔努的回答是正确的。为了让hazelcast成员能够发现彼此,需要正确设置公共广播。以下是一种参数化方法:https://github.com/gagangoku/hazelcast-docker