同一主机下第二个Keycloak实例启动报IndexOutOfBoundsException错误求助
解决同一主机多Keycloak实例启动的IndexOutOfBoundsException问题
根据你提供的错误栈,这个异常是Keycloak在初始化Infinispan用户会话缓存时触发的,根源是分段索引计算出现了负数(fromIndex < 0: -1),大概率是多实例之间的缓存配置冲突或残留数据导致的。下面是几个针对性的排查和修复方案:
1. 隔离两个实例的Infinispan缓存配置
同一主机运行多Keycloak实例时,必须保证它们的Infinispan集群通信和存储完全隔离:
- 修改第二个实例的
standalone-ha.xml(或你使用的配置文件)中的集群端口:
找到<socket-binding-group>下的jgroups-tcp端口,从默认的7600改成7601(或其他未被占用的端口):<socket-binding name="jgroups-tcp" port="7601"/> - 指定独立的缓存存储路径:
在<cache-container>的<file-store>配置中,修改path为专属目录:<file-store path="data/infinispan/instance2" passivation="false" purge="false"/>
2. 清理第二个实例的本地缓存残留
如果之前第二个实例启动失败过,本地缓存目录可能存在损坏的状态数据(比如异常的BitSet索引),直接删除缓存目录再重启:
- 找到Keycloak的
standalone/data目录 - 删除
infinispan文件夹下的所有内容(针对第二个实例的专属目录) - 重新启动第二个实例
3. 确保实例的节点ID唯一
Keycloak集群中每个实例需要唯一的节点标识,否则缓存初始化时会出现状态混乱:
- 启动第二个实例时添加JVM参数:
./standalone.sh -Djboss.node.name=keycloak-instance2 -c standalone-ha.xml - 或者在配置文件中设置唯一的
node-identifier:<spi name="hostname"> <provider name="default" enabled="true"> <properties> <property name="node-identifier" value="instance2"/> </properties> </provider> </spi>
4. 排查版本BUG并升级
这个异常在Keycloak的部分旧版本(比如14.x及更早)中是已知问题,是Infinispan缓存初始化时的分段索引处理逻辑缺陷导致的。如果你的Keycloak版本较旧,建议升级到最新的LTS稳定版本(比如22.x或23.x),官方已经修复了这类缓存初始化的异常。
5. 检查JVM运行环境隔离
确保两个实例的JVM运行环境没有冲突:
- 为第二个实例指定独立的临时目录:
./standalone.sh -Djava.io.tmpdir=/tmp/keycloak-instance2 -c standalone-ha.xml - 检查内存配置,确保第二个实例有足够的堆内存(比如
-Xmx2g),内存不足可能导致缓存数据写入异常。
附:你提供的错误日志
Caused by: java.lang.IndexOutOfBoundsException: fromIndex < 0: -1 Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at java.util.BitSet.nextClearBit(BitSet.java:744) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.initializer.InitializerState.getNextUnfinishedSegmentFromIndex(InitializerState.java:102) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.initializer.InitializerState.updateLowestUnfinishedSegment(InitializerState.java:98) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.initializer.InitializerState.markSegmentFinished(InitializerState.java:94) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer.startLoadingImpl(InfinispanCacheInitializer.java:187) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer.startLoading(InfinispanCacheInitializer.java:108) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.initializer.CacheInitializer.loadSessions(CacheInitializer.java:41) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory$7.run(InfinispanUserSessionProviderFactory.java:317) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:227) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory.loadSessionsFromRemoteCache(InfinispanUserSessionProviderFactory.java:306) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory.loadSessionsFromRemoteCaches(InfinispanUserSessionProviderFactory.java:298) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory.access$500(InfinispanUserSessionProviderFactory.java:68) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory$1.lambda$onEvent$0(InfinispanUserSessionProviderFactory.java:127) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:227) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransactionWithTimeout(KeycloakModelUtils.java:267) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory$1.onEvent(InfinispanUserSessionProviderFactory.java:121) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.services.DefaultKeycloakSessionFactory.publish(DefaultKeycloakSessionFactory.java:69) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.keycloak.services.resources.KeycloakApplication.<init>(KeycloakApplication.java:170) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:152) Aug 14 17:23:58 keycloak.srv2 sh[2512]: [Server:server-one] ... 31 more
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

