当前位置: 首页 > 知识库问答 >
问题:

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

阎宾实
2023-03-14

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

我有一个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。十: 5190:5190(5190是我用于Hazelcast的端口)

在容器中的Java EE应用程序中,我将hazelcast配置为侦听接口172.21.0。十、 端口5190成员172.21.0。十: 5190,。。。。。。现在的问题是:docker将为每个共有者分配一个内部IP号码。事先我不能确定docker将分配哪个IP号码。它肯定不是我想要使用的IP(172.21.0.X)。Hazelcast启动并告诉我:没有找到匹配的接口。当然不是。Hazelcast将检查docker容器的IP接口,类似于172.4。XX。这不符合我给hazelcast的配置(使用172.21.X.X)。

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

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

共有2个答案

董高逸
2023-03-14

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

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

然后在启动docker容器时传递参数(我使用正式的hazelcast映像和mount文件夹,配置使用-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

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

希望这有帮助。

单品
2023-03-14

此线程提供了答案和示例: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在运行时将其挑选出来并替换到它的配置文件中。

 类似资料:
  • 我目前的设置是运行多个节点实例,使用PM2来管理实例并充当负载平衡器。 目前,我正在npm上使用包,但如果有更好的替代方案,我绝不会与此联系在一起。 我希望套接字或多或少地推送数据单向从服务器到客户机,避免任何来自客户机到服务器。 到目前为止,我的解决方案是旋转另一个单独充当websocket服务器的节点实例。 我不确定这是最好的选择,我正在尝试看看是否有其他推荐的方法来管理跨多个节点实例的web

  • 我正在进行一项预定的工作,该工作将以一定的间隔运行(例如每天下午1点),通过Cron安排。我正在使用Java和Spring。 编写计划作业非常简单 - 它确实如此:从db中抓取人员列表将某些条件,为每个人做一些计算并触发消息。 我正在本地和测试中开发单节点环境,但是当我们投入生产时,它将是多节点环境(带有负载均衡器等)。我关心的是多节点环境会如何影响计划的作业? 我的猜测是,我可能(或很可能)最终

  • 问题内容: 我想把头围在Docker上,但是很难弄清楚。我试图在我的小项目(MERN堆栈)中实现它,并且我在思考如何区分开发(可能是登台)和生产环境。 我看到了一个示例,其中他们使用了2个Docker文件和2个docker-compose文件(每个对都包含一个env,因此Dockerfile + docker-compose.yml用于prod,Dockerfile-dev + docker-co

  • 目前,我们使用Apache Ignite.NET瘦客户机缓存不同的数据集。对于每个数据请求,我们使用通过IIgniteClient.createCache ()方法创建的单独缓存。一个缓存包含一组具有相同属性的Enities,在过期后应独立于其他缓存删除。 问题是,在生产中,我们希望有许多应用程序(环境)实例与一个Apache Ignite实例一起工作。每个应用程序实例都应该能够使用与其他应用程序

  • 问题内容: 我已经使用vs docker扩展 来创建docker文件。但我不知道使用docker- compose.debug.yml调试代码的“正确”方法是什么,例如,如何设置环境。所以我只要按F5键,所有的魔术都将发生 我确实找到了一种调试代码的方法。首先在终端中运行。然后使用容器内节点开发:Visual Studio Code中的launch.json 附加到我在docker 中的节点。 但

  • 三个主机的名称: Storm-光轮:这个id光轮主机。 Storm-SV-1:这是第一主管。 2)在nimbus主机上运行storm ui(192.168.3.132) 3)在nimbus主机上运行storm nimbus(192.168.3.132) 4)在ui页面(http://192.168.3.132:8080/)中验证nimbus状态。 > 两个主管出现在UI页面上。:好的 在每个主管页