dcos/marathon和docker上的hazelcast tcp/ip发现

dvtswwa3  于 2021-06-21  发布在  Mesos
关注(0)|答案(3)|浏览(487)

我在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集装箱港口被绑定到一个随机的港口上。

p1tboqfb

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>

jrcvhitl

jrcvhitl2#

分析:
这两个docker容器位于它们自己的网络中,该网络定位于从属容器。它们需要使用从机的公共ip和5701所连接的桥接端口(或您正在使用的任何hazelcast端口)相互识别。
解决方案
在tcp/ip配置中,设置启动示例时的公共地址和端口。所有示例都将这样做,它们将使用marathon从属ip和用于该ip的随机端口相互通信。
使用marathon提供的主机和端口\u5701变量以及容器内的可用变量来执行此操作。

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

请参阅hazelcast网络配置文档,了解有关公共地址选项的更多信息。

sigwle7e

sigwle7e3#

让hazelcast成员互相发现并形成一个集群是很棘手的。最后我听从了@bitsofinfo的建议-https://github.com/hazelcast/hazelcast/issues/9219
@桑塔努的回答是正确的。为了让hazelcast成员能够发现彼此,需要正确设置公共广播。以下是一种参数化方法:https://github.com/gagangoku/hazelcast-docker

相关问题