JGroups Infinispan не присоединяются к одному кластеру в сервисах Docker - PullRequest
0 голосов
/ 29 апреля 2018

(раздел запроса ниже к середине) Крест размещен на https://developer.jboss.org/message/982355

Окружающая среда : Инфиниспан 9.13, Встроенный кеш в кластере с jgroups, Однофайловое хранилище, Использование JGroups внутри сервисов Docker на одном хосте / демоне docker (пока не в AWS).

Infinispan.xml ниже:

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

Приложение = 2 веб-приложения + база данных

Выпуск

Когда я развертываю 2 веб-приложения в отдельных tomcats непосредственно на машине (еще не в докере), менеджер Infinispan, инициализирующий кэш (в каждом веб-приложении) формирует кластер с использованием jgroups (то есть работы) . Но с точно такой же конфигурацией (и тем же именем канала в jgroups), когда развертывает веб-приложения как сервисы в Docker, они не присоединяются к одному кластеру (скорее, они являются отдельными и имеют только одного члена в поле зрения - журналы ниже).

Службы представляют собой Docker-контейнеры из images = linux + tomcat + webapp и запускаются с использованием docker compose v3.

Я попробовал инструкции в https://github.com/belaban/jgroups-docker для контейнера, содержащего JGroups и пару демонстраций, где он предлагает , либо используя --network = host mode для сервисы docker ( это работает , но мы не можем этого сделать, так как в конфигурационных файлах для масштабирования потребуются отдельные порты), или передача поля external_addr = docker_host_IP_address в jgroups.xml ( это НЕ работает, и вопрос в том, как заставить это работать).

Это не проблема синхронизации , так как я также пытался поставить значительную задержку при запуске 2-го сервиса, развернутого в стеке, но все же в кластере Infinispan 2 приложений есть только один член в своем представлении (этот контейнер сам по себе) ). Вызов 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]

Окно 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 (как две службы в контейнерах для докеров) и jgroups.xml выше, чтобы кэш Infinispan в каждом из двух веб-приложений объединялся и формировал кластер, чтобы оба приложения могли получать доступ к одним и тем же данным друг другу для чтения / пиши в кеш. Прямо сейчас они подключаются к одному и тому же имени канала, и каждый становится кластером с одним участником, даже если мы указываем jgroups на external_addr.

Пробовал до сих пор:

  • Установка задержки при запуске второго сервиса, чтобы у первого было достаточно времени для рекламы.
  • JGroups - Запуск JGroups в Docker может развернуть контейнеры belaban / jgroups в виде двух сервисов в стеке, используя docker compose, и они могут сформировать кластер (chat.sh внутри контейнера показывает представление 2 членов).
  • Попробовал --net = host, который работает, но неосуществим. Попробовал external_addr = docker.host.ip в jgroups.xml, который является идеальным решением, но его не работает (журнал выше от этого).

Спасибо! Постараюсь предоставить любую конкретную информацию, если потребуется.

1 Ответ

0 голосов
/ 30 апреля 2018

Очевидно, external_addr="${ext-addr:docker.host.ip.address}" не разрешается (или восстанавливается до нуля), поэтому используется bind_addr из 127.0.0.1. docker.host.ip.address установлен вами (например, как переменная env)?

Атрибут external_addr должен указывать на действительный IP-адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...