使用TCPIP在多节点docker环境中进行Hazelcast

mag*_*omy 6 tcp-ip hazelcast docker

我目前正在努力解决以下问题:

我有一个Java EE应用程序,它应该能够在集群中运行(实际上是这样).对于节点之间的数据交换,我使用Hazelcast 3.3.3.由于我们的客户害怕UDP,我们使用TCP.因此,我为每个节点配置3个hazelcast参数:要使用的网络接口,端口和群集成员.在现实生活中(不是码头环境)一切正常.现在我想将我的Java EE服务器放入docker容器(每个节点一个),并通过Hazelcast链接它们.

我做的是:

在运行docker容器的主机上,我创建了几个虚拟网络接口(172.21.0.X).对于每个docker容器,我提供了网络映射,如-p 172.21.0.X:5190:5190(5190是我用于Hazelcast的端口)

在我的容器内的Java EE应用程序中,我配置了hazelcast来监听接口172.21.0.X,端口5190成员172.21.0.X:5190,......现在的问题是:docker将分配一个内部IP号到每个投币器.事先我无法确定哪个IP号码码头会分配.它绝对不是我想要使用的IP(172.21.0.X).Hazelcast启动并告诉我:找不到匹配的界面.当然不是.Hazelcast将检查docker容器的IP接口,类似于172.4.XX. 这不适合我给hazelcast的配置(使用172.21.XX).

到目前为止,似乎无法指定docker容器的内部IP号.我可以从正在运行的容器中查询它,但由于我需要在启动容器之前完成Java EE服务器的配置,所以为时已晚.

有什么提示吗?是否可以使用TCPIP运行Hazelcast?

小智 5

这个帖子和Nick Scavelli的回答是我认为你正在寻找的.

https://groups.google.com/forum/#!msg/vertx/MvKcz_aTaWM/QM6CfllX9HQJ


gre*_*ell 4

该线程提供了答案和示例: https ://groups.google.com/d/msg/orient-database/ehfKcInWZXs/wxs8xLUOGB8J

基本上你在 hazelcast 文件中使用 hazelcast 变量,即

<property name="hazelcast.local.localAddress">${hazelcast.ip}</property>
Run Code Online (Sandbox Code Playgroud)

然后,当您运行包含的 docker 时,您添加:

-e IP=`ip route | awk '/default/ { print  $9 }'`
Run Code Online (Sandbox Code Playgroud)

它在 docker 容器中设置环境变量。然后在那里你做这样的事情:

CMD ["java", "-Dhazelcast.ip=${IP}", ...
Run Code Online (Sandbox Code Playgroud)

因此,它采用 docker 环境变量,并将其作为定义放入 java 中,然后 hazelcast 在运行时挑选并替换到它的配置文件中。