gpt4 book ai didi

docker - Infinispan 的 JGroups 没有加入 Docker 服务中的同一个集群

转载 作者:行者123 更新时间:2023-12-01 14:38:14 24 4
gpt4 key购买 nike

(下面中间的查询部分)交叉张贴在 https://developer.jboss.org/message/982355

环境:无穷无尽 9.13,带有 jgroups 的集群中的嵌入式缓存,单一文件存储,在单个 docker 主机/守护程序中使用 Docker 服务中的 JGroups (尚未在 AWS 中)。

下面的 Infinispan.xml:

<jgroups><stack-file name="external-file" path="${path.to.jgroups.xml}"/></jgroups>

应用程序 = 2 个网络应用程序 + 数据库

问题:

当我直接在一台机器上(还不是 docker)在单独的 tomcats 中部署 2 个 webapps 时,初始化缓存的 Infinispan 管理器(在每个 webapp 中)使用 jgroups 形成一个集群(即它有效)。但是使用完全相同的配置(以及 jgroups 中的相同 channel 名称),当 将 webapps 作为 docker 中的服务部署时,它们不会加入同一个集群(而是它们是独立的并且只有一个成员在查看 - 下面的日志)。

这些服务是来自 images = linux + tomcat + webapp 的 docker 容器,并使用 docker compose v3 启动。

我已经在 https://github.com/belaban/jgroups-docker尝试了这些说明对于包含 JGroups 的容器和一些演示,它建议 使用 --network=host 模式 用于 docker 服务(这确实有效,但我们不能这样做,因为如果我们缩放,配置文件将需要有单独的端口),或在 jgroups.xml 中传递 external_addr=docker_host_IP_address 字段(这不起作用,查询是如何使它起作用)。

不是时间问题,因为我还尝试在启动部署在堆栈中的第二个服务时设置显着延迟,但 2 个应用程序的 Infinispan 集群在它的 View 中仍然只有一个成员(那个容器本身)。调用 cacheManager.getMembers() 也只会在每个应用程序中显示一个条目(应该显示 2 个)。

日志仅显示第一个应用中的一个成员:

org.infinispan.remoting.transport.jgroups.JGroupsTransport.receiveClusterView ISPN000094: Received new cluster view for channel CHANNEL_NAME: [FirstContainerId-6292|0] (1) [FirstContainerId-6292].

org.infinispan.remoting.transport.jgroups.JGroupsTransport.startJGroupsChannelIfNeeded ISPN000079: Channel CHANNEL_NAME local address is FirstContainerId-6292, physical addresses are [10.xx.yy.zz:7800]

日志在第二个应用中只显示一个成员:

org.infinispan.remoting.transport.jgroups.JGroupsTransport.receiveClusterView ISPN000094: Received new cluster view for channel CHANNEL_NAME: [SecondContainerId-3502|0] (1) [SecondContainerId-3502]

29-Apr-2018 11:47:42.357 INFO [localhost-startStop-1] org.infinispan.remoting.transport.jgroups.JGroupsTransport.startJGroupsChannelIfNeeded ISPN000079: Channel CHANNEL_NAME local address is 58cfa4b95c16-3502, physical addresses are [10.xx.yy.zz:7800]

docker compose V3 在下方并显示覆盖网络:

version: "3"
services:
app1:
image: app1:version
ports:
- "fooPort1:barPort"
volumes:
- "foo:bar"
networks:
- webnet

app2:
image: app2:version
ports:
- "fooPort2:barPort"
volumes:
- "foo:bar"
networks:
- webnet
volumes:
dbdata:

networks:
webnet:

部署 使用 $docker stack deploy --compose-file docker-compose.yml OurStack

JGroups.xml 的相关配置部分如下:

<TCP
external_addr="${ext-addr:docker.host.ip.address}"

bind_addr="${jgroups.tcp.address:127.0.0.1}"

bind_port="${jgroups.tcp.port:7800}"

enable_diagnostics="false"

thread_naming_pattern="pl"

send_buf_size="640k"

sock_conn_timeout="300"

bundler_type="sender-sends-with-timer"

thread_pool.min_threads="${jgroups.thread_pool.min_threads:1}"

thread_pool.max_threads="${jgroups.thread_pool.max_threads:10}"

thread_pool.keep_alive_time="60000"/>

<MPING bind_addr="${jgroups.tcp.address:127.0.0.1}"

mcast_addr="${jgroups.mping.mcast_addr:228.2.4.6}"

mcast_port="${jgroups.mping.mcast_port:43366}"

ip_ttl="${jgroups.udp.ip_ttl:2}"/>

代码类似于:

DefaultCacheManager manager = new DefaultCacheManager(jgroupsConfigFile.getAbsolutePath());

Cache someCache = new Cache(manager.getCache("SOME_CACHE").getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES));

查询:我们如何使用上面的 docker-compose(作为 docker 容器中的两个服务)和 jgroups.xml 进行部署,以便两个 webapps 中的每一个中的 Infinispan 缓存加入并形成一个集群——这样两个应用程序就可以访问彼此读取的相同数据/写入缓存。现在它们连接到相同的 channel 名称,并且每个都成为一个只有一个成员的集群,即使我们将 jgroups 指向 external_addr。

到目前为止已尝试:

  • 延迟第二个服务的启动,以便第一个有足够的时间做广告。
  • JGroups - 在 Docker 中运行 JGroups 可以使用 docker compose 将 belaban/jgroups 容器部署为堆栈中的两个服务,并且它们能够形成一个集群(容器内的 chat.sh 显示 2 个成员 View )。
  • 尝试了 --net=host ,但不可行。在 jgroups.xml 中尝试了 external_addr=docker.host.ip,这是理想的解决方案,但它不起作用(上面的日志来自于此)。

谢谢!如果需要,将尝试提供任何具体信息。

最佳答案

显然 external_addr="${ext-addr:docker.host.ip.address}"不解析(或解析为空),所以 bind_addr127.0.0.1用来。是docker.host.ip.address由您设置(例如作为环境变量)?

external_addr属性应指向有效的 IP 地址。

关于docker - Infinispan 的 JGroups 没有加入 Docker 服务中的同一个集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50086557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com