(раздел запроса ниже к середине)
Крест размещен на 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, который является идеальным решением, но его не работает (журнал выше от этого).
Спасибо! Постараюсь предоставить любую конкретную информацию, если потребуется.