【问题标题】:Hazelcast in multinode docker environments with TCPIP使用 TCPIP 的多节点 docker 环境中的 Hazelcast
【发布时间】:2015-07-18 03:47:48
【问题描述】:

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

我有一个可以在集群中运行的 Java EE 应用程序(它确实可以)。对于节点之间的数据交换,我使用 Hazelcast 3.3.3。 由于我们的客户害怕 UDP,我们使用 TCP。 所以我为每个节点配置了 3 个 hazelcast 参数: 要使用的网络接口、端口和集群成员。 在现实生活中(不是 docker 环境)一切正常。 现在我想将我的 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 会为每个 cointainer 分配一个内部 IP 号。事先我无法确定 docker 将分配哪个 IP 号。 它绝对不是我想使用的 IP (172.21.0.X)。 Hazelcast 启动并告诉我:找不到匹配的接口。当然不是。 Hazelcast 将检查 docker 容器的 IP 接口,类似于 172.4.XX。这不适合我给 hazelcast 的配置(使用 172.21.X.X)。

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

对此有任何提示吗?是否可以让 Hazelcast 使用 TCPIP 运行?

【问题讨论】:

标签: docker hazelcast tcp-ip


【解决方案1】:

这个帖子提供了一个答案和一个例子: https://groups.google.com/d/msg/orient-database/ehfKcInWZXs/wxs8xLUOGB8J

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

<property name="hazelcast.local.localAddress">${hazelcast.ip}</property>

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

-e IP=`ip route | awk '/default/ { print  $9 }'`

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

CMD ["java", "-Dhazelcast.ip=${IP}", ...

所以它使用 docker env 变量,并作为定义进入 java,然后 hazelcast 在运行时挑选并替换到它的配置文件中。

【讨论】:

  • 属性 hazelcast.local.localAddress 不再有效
【解决方案2】:

我想更新@gremwell 的答案,因为现在它不太正确。属性 hazelcast.local.localAddress 不再有效。相反,应该把这个 sn-p 放在 hazelcast.xml 中

   <network>
        <public-address>${hazelcast.ip}:${hazelcast.port}</public-address>
        <port auto-increment="false" port-count="100">${hazelcast.port}</port>
        ...
   </network>

然后在启动 docker 容器时传递参数(我使用官方 hazelcast 映像并使用 -v 标志在我的配置中挂载文件夹)

sudo docker run -p 5701:5701 -e JAVA_OPTS="-Dhazelcast.config=/etc/conf/hazelcast.xml -Dhazelcast.ip=`ip route get 8.8.8.8 | awk '{print $NF; exit}'` -Dhazelcast.port=5701" -v /data/docker/hazelcast:/etc/conf -ti hazelcast/hazelcast

命令-Dhazelcast.ip=ip route get 8.8.8.8 | awk '{print $NF; exit}' 获取主机IP 并将其作为hazelcast.ip 变量传递到配置文件中。 内部端口和 docker 端口映射在 3 个地方应该是类似 5701。下一个容器使用 5702 运行,依此类推。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2021-10-13
    相关资源
    最近更新 更多