java #infinispan #jgroups
#java #infinispan #jgroups
Вопрос:
Я пытаюсь настроить реплицированный встроенный кэш Infinispan.
При использовании демонстрационного кода для программной настройки кэша все работает, как и ожидалось (https://github.com/infinispan/infinispan-simple-tutorials/tree/main/infinispan-embedded/cache-replicated)
Теперь я хочу настроить его на использование определенного списка начальных хостов.
Итак, я немного изменил код, чтобы быть :
public class TestGenerate
{
public static void main(String[] args) throws InterruptedException
{
// Setup up a clustered cache manager
GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder();
GlobalConfiguration globalConfiguration = global.transport().defaultTransport().addProperty("configurationFile", "jgroups.xml").build();
// Initialize the cache manager
DefaultCacheManager cacheManager = new DefaultCacheManager(globalConfiguration);
// Create a replicated synchronous configuration
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.clustering().cacheMode(CacheMode.REPL_SYNC);
Configuration cacheConfig = builder.build();
// Create a cache
Cache<String, String> cache = cacheManager.administration()
.withFlags(CacheContainerAdmin.AdminFlag.VOLATILE)
.getOrCreateCache("cache", cacheConfig);
// Store the current node address in some random keys
for(int i=0; i < 10; i ) {
cache.put(UUID.randomUUID().toString(), cacheManager.getNodeAddress());
}
// Display the current cache contents for the whole cluster
System.out.println("--------------- whole cluster");
cache.entrySet().forEach(entry -> System.out.printf("%s = %sn", entry.getKey(), entry.getValue()));
// Display the current cache contents for this node
System.out.println("--------------- this node");
cache.getAdvancedCache().withFlags(Flag.SKIP_REMOTE_LOOKUP)
.entrySet().forEach(entry -> System.out.printf("%s = %sn", entry.getKey(), entry.getValue()));
Thread.currentThread().join();
}
}
Мой файл конфигурации JGroups очень минимальный :
<config xmlns="urn:org:jgroups"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd">
<TCP bind_port="7950" />
<TCPPING initial_hosts="192.168.42.100[7950],192.165.10.52[7950]"/>
</config>
Проблема в том, что кэш не запускается :
sept. 21, 2021 1:49:01 PM org.infinispan.factories.GlobalComponentRegistry preStart
INFO: ISPN000128: Infinispan version: Infinispan 'Taedonggang' 12.1.7.Final
sept. 21, 2021 1:49:01 PM org.infinispan.marshall.core.impl.DelegatingUserMarshaller start
INFO: ISPN000556: Starting user marshaller 'org.infinispan.commons.marshall.ImmutableProtoStreamMarshaller'
sept. 21, 2021 1:49:01 PM org.infinispan.remoting.transport.jgroups.JGroupsTransport start
INFO: ISPN000078: Starting JGroups channel ISPN
sept. 21, 2021 1:49:02 PM org.infinispan.remoting.transport.jgroups.JGroupsTransport startJGroupsChannelIfNeeded
INFO: ISPN000079: Channel ISPN local address is null, physical addresses are [192.168.42.100:7950]
sept. 21, 2021 1:49:02 PM org.infinispan.remoting.transport.jgroups.JGroupsTransport stop
INFO: ISPN000080: Disconnecting JGroups channel ISPN
Exception in thread "main" org.infinispan.manager.EmbeddedCacheManagerStartupException: org.infinispan.commons.CacheConfigurationException: Error starting component org.infinispan.topology.ClusterTopologyManager
at org.infinispan.manager.DefaultCacheManager.internalStart(DefaultCacheManager.java:755)
at org.infinispan.manager.DefaultCacheManager.start(DefaultCacheManager.java:718)
at org.infinispan.manager.DefaultCacheManager.<init>(DefaultCacheManager.java:296)
at org.infinispan.manager.DefaultCacheManager.<init>(DefaultCacheManager.java:219)
at TestGenerate.main(TestGenerate.java:43)
Caused by: org.infinispan.commons.CacheConfigurationException: Error starting component org.infinispan.topology.ClusterTopologyManager
at org.infinispan.factories.impl.BasicComponentRegistryImpl.startWrapper(BasicComponentRegistryImpl.java:572)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.access$700(BasicComponentRegistryImpl.java:30)
at org.infinispan.factories.impl.BasicComponentRegistryImpl$ComponentWrapper.running(BasicComponentRegistryImpl.java:787)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.startDependencies(BasicComponentRegistryImpl.java:622)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.doStartWrapper(BasicComponentRegistryImpl.java:586)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.startWrapper(BasicComponentRegistryImpl.java:564)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.access$700(BasicComponentRegistryImpl.java:30)
at org.infinispan.factories.impl.BasicComponentRegistryImpl$ComponentWrapper.running(BasicComponentRegistryImpl.java:787)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.startDependencies(BasicComponentRegistryImpl.java:622)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.doStartWrapper(BasicComponentRegistryImpl.java:586)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.startWrapper(BasicComponentRegistryImpl.java:564)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.access$700(BasicComponentRegistryImpl.java:30)
at org.infinispan.factories.impl.BasicComponentRegistryImpl$ComponentWrapper.running(BasicComponentRegistryImpl.java:787)
at org.infinispan.factories.AbstractComponentRegistry.internalStart(AbstractComponentRegistry.java:354)
at org.infinispan.factories.AbstractComponentRegistry.start(AbstractComponentRegistry.java:250)
at org.infinispan.manager.DefaultCacheManager.internalStart(DefaultCacheManager.java:750)
... 4 more
Caused by: java.lang.NullPointerException: Cannot invoke "Object.equals(Object)" because the return value of "org.infinispan.remoting.transport.Transport.getAddress()" is null
at org.infinispan.topology.TopologyManagementHelper.executeOnCoordinator(TopologyManagementHelper.java:83)
at org.infinispan.topology.ClusterTopologyManagerImpl.fetchRebalancingStatusFromCoordinator(ClusterTopologyManagerImpl.java:162)
at org.infinispan.topology.ClusterTopologyManagerImpl.start(ClusterTopologyManagerImpl.java:153)
at org.infinispan.topology.CorePackageImpl$3.start(CorePackageImpl.java:74)
at org.infinispan.topology.CorePackageImpl$3.start(CorePackageImpl.java:58)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.invokeStart(BasicComponentRegistryImpl.java:604)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.doStartWrapper(BasicComponentRegistryImpl.java:595)
at org.infinispan.factories.impl.BasicComponentRegistryImpl.startWrapper(BasicComponentRegistryImpl.java:564)
... 19 more
Если я использую демонстрационный код, метод getAddress() действительно вернет что-то (мое имя хоста и номер), но с изменением адрес действительно равен null.
Должен ли я вручную настраивать адрес? Как?
РЕДАКТИРОВАТЬ: после некоторого поиска, когда я использую демонстрационный код, метод receiveClusterView(View) из класса JGroupsTransport вызывается перед методом executeOnCoordinator(…) в классе TopologyManagementHelper, который задает адрес.
При использовании моего файла конфигурации xml receiveClusterView(просмотр) не вызывается перед методом executeOnCoordinator(), и поэтому getAddress() завершается с ошибкой.
Окружающая среда :
infinispan-core v12.1.7.Final
jgroups v4.2.12.Final (как зависимость от maven)
принять-openjdk v15.0.2
macOS Big Sur
Ответ №1:
Ваша конфигурация слишком минималистична 🙂
Infinispan требует членства в группе JGroups и надежной передачи для правильной работы.
Кроме того, обнаружение сбоев может быть полезно, если вы не хотите потерять данные при сбое узлов.
Комментарии:
1. Большое спасибо за ваш ответ. Есть ли возможность найти образец файла конфигурации?
2. Infinispan отправляет некоторые конфигурации JGroups по умолчанию. Проверьте их здесь: github.com/infinispan/infinispan/tree/main/core/src/main /. … Кроме того, infinispan.org/docs/stable/titles/embedding /… показывает, как их использовать или настраивать, если требуется.
3. Большое спасибо, я попробовал один из этих файлов, он не удался из-за некоторых полей xml, которые были недействительными, возможно, я не использовал правильную версию в это время.
4. Последний вопрос, можем ли мы смешивать режимы UDP и TCP в одном файле конфигурации?
5. нет, только один транспорт для каждой конфигурации.
Ответ №2:
Чтобы избежать необходимости создавать полный допустимый стек JGroups, я бы использовал наследование поверх одного из предоставленных стеков
<infinispan>
<jgroups>
<!-- Creates a custom JGroups stack named "my-stack". -->
<!-- Inherits properties from the default TCP stack. -->
<stack name="my-stack" extends="tcp">
<!-- Uses TCPPING as the discovery mechanism instead of MPING -->
<TCPPING initial_hosts="192.168.42.100[7950],192.165.10.52[7950]"
stack.combine="REPLACE"
stack.position="MPING" />
</stack>
</jgroups>
<cache-container name="default" statistics="true">
<!-- Uses "my-stack" for cluster transport. -->
<transport cluster="${infinispan.cluster.name}"
stack="my-stack"
node-name="${infinispan.node.name:}"/>
</cache-container>
</infinispan>
Обратитесь к https://infinispan.org/docs/stable/titles/embedding/embedding.html#jgroups-default_cluster-transport для получения более подробной информации
Комментарии:
1. Очень интересно, вы знаете, как я мог бы выполнить то же самое без использования файла конфигурации? Я программно настраиваю свой встроенный infinispan.
2. Нет, эта функциональность является частью анализатора конфигурации Infinispan, а не JGroups’. Вам нужно будет предоставить «полную» конфигурацию на основе настроек по умолчанию: github.com/infinispan/infinispan/tree/main/core/src/main /…
3. Я понимаю. Спасибо за ваше предложение.