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

Infinispan's JGroups not joining the same cluster in Docker services

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

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

Infinispan.xml 下面:

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

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

问题:

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

服务是 docker 来自 images = linux + tomcat + webapp 的容器,使用 docker compose v3.

启动

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

不是时间问题,因为我也尝试过显着延迟启动部署在堆栈中的第二个服务,但 2 个应用程序的 Infinispan 集群仍然只有一个成员它的视图(那个容器本身)。调用 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在下面,展示了overlay网络:

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 缓存加入并形成一个集群 - 所以两者应用程序可以在缓存中相互访问相同的数据 read/write。现在它们连接到相同的通道名称并且每个都成为一个只有一个成员的集群,即使我们将 jgroups 指向 external_addr.

到目前为止已尝试:

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

显然 external_addr="${ext-addr:docker.host.ip.address}" 未解析(或解析为空),因此使用 127.0.0.1bind_addrdocker.host.ip.address 是否由您设置(例如作为环境变量)?

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