You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak从19升级到25后JDBC_PING分布式缓存异常问题

Keycloak 19升级至25后JDBC-PING分布式缓存服务发现异常

问题概述

AWS ECS容器部署的Keycloak,原通过JDBC-PING实现分布式缓存服务发现。升级至25版本后,所有业务功能正常,但分布式缓存集群无法形成,出现JGroups初始化失败错误,JGROUPSPING表可正常写入节点记录。

核心错误信息

java.lang.IllegalStateException: Failed to start JGroups channel
Caused by: org.jgroups.protocols.JGroupsException: failed to join cluster [keycloak]

补充日志

JGRP000013: Failed to join cluster [keycloak], exception: java.lang.IllegalStateException: failed to start channel
JGRP000034: Received discovery response for cluster keycloak from null: no physical address found

当前Infinispan配置

<infinispan
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="urn:infinispan:config:15.0 http://www.infinispan.org/schemas/infinispan-config-15.0.xsd"
      xmlns="urn:infinispan:config:15.0">

  <!-- 自定义JGroups栈配置 -->
  <jgroups>
    <stack name="jdbc-ping-tcp" extends="tcp">
      <JDBC_PING connection_driver="org.postgresql.Driver"
                 connection_username="${env.KC_DB_USERNAME}" connection_password="${env.KC_DB_PASSWORD}"
                 connection_url="jdbc:postgresql://${env.KC_DB_URL_HOST}/${env.KC_DB_URL_DATABASE}"
                 initialize_sql="CREATE TABLE IF NOT EXISTS JGROUPSPING (own_addr varchar(200) NOT NULL, cluster_name varchar(200) NOT NULL, ping_data BYTEA, constraint PK_JGROUPSPING PRIMARY KEY (own_addr, cluster_name));"
                 info_writer_sleep_time="500"
                 remove_all_data_on_view_change="true"
                 stack.combine="REPLACE"
                 stack.position="MPING" />
    </stack>
  </jgroups>
  
  <cache-container name="keycloak">
    <transport lock-timeout="60000" stack="jdbc-ping-tcp"/>
    <local-cache name="realms" simple-cache="true">
      <encoding>
        <key media-type="application/x-java-object"/>
        <value media-type="application/x-java-object"/>
      </encoding>
      <memory max-count="10000"/>
    </local-cache>
    <local-cache name="users" simple-cache="true">
      <encoding>
        <key media-type="application/x-java-object"/>
        <value media-type="application/x-java-object"/>
      </encoding>
      <memory max-count="10000"/>
    </local-cache>
    <distributed-cache name="sessions" owners="2">
      <expiration lifespan="-1"/>
    </distributed-cache>
    <distributed-cache name="authenticationSessions" owners="2">
      <expiration lifespan="-1"/>
    </distributed-cache>
    <distributed-cache name="offlineSessions" owners="2">
      <expiration lifespan="-1"/>
    </distributed-cache>
    <distributed-cache name="clientSessions" owners="2">
      <expiration lifespan="-1"/>
    </distributed-cache>
    <distributed-cache name="offlineClientSessions" owners="2">
      <expiration lifespan="-1"/>
    </distributed-cache>
    <distributed-cache name="loginFailures" owners="2">
      <expiration lifespan="-1"/>
    </distributed-cache>
    <local-cache name="authorization">
      <encoding>
        <key media-type="application/x-java-object"/>
        <value media-type="application/x-java-object"/>
      </encoding>
      <memory max-count="10000"/>
    </local-cache>
    <replicated-cache name="work">
      <expiration lifespan="-1"/>
    </replicated-cache>
    <local-cache name="keys">
      <encoding>
        <key media-type="application/x-java-object"/>
        <value media-type="application/x-java-object"/>
      </encoding>
      <expiration max-idle="3600000"/>
      <memory max-count="1000"/>
    </local-cache>
    <distributed-cache name="actionTokens" owners="2">
      <encoding>
        <key media-type="application/x-java-object"/>
        <value media-type="application/x-java-object"/>
      </encoding>
      <expiration max-idle="-1" lifespan="-1" interval="300000"/>
      <memory max-count="-1"/>
    </distributed-cache>
  </cache-container>
</infinispan>

解决方案建议

1. 适配JDBC-PING表结构

新版本JGroups的节点地址字段长度可能超出原配置的200字符,修改initialize_sql中的own_addr字段长度:

CREATE TABLE IF NOT EXISTS JGROUPSPING (own_addr varchar(300) NOT NULL, cluster_name varchar(200) NOT NULL, ping_data BYTEA, constraint PK_JGROUPSPING PRIMARY KEY (own_addr, cluster_name));

2. 修复TCP栈IP绑定配置

AWS ECS容器IP动态分配,需明确指定JGroups绑定地址,在自定义栈中添加TCP配置:

<stack name="jdbc-ping-tcp" extends="tcp">
  <TCP bind_addr="${env.JGROUPS_BIND_ADDR:0.0.0.0}" bind_port="${env.JGROUPS_BIND_PORT:7800}" />
  <JDBC_PING ... />
</stack>

同时在Keycloak启动参数中添加:-e JGROUPS_BIND_ADDR=0.0.0.0,确保容器能监听所有网卡。

3. 移除冲突配置项

remove_all_data_on_view_change="true"在新版本中可能引发集群视图异常,暂时移除该配置,后续手动清理JGROUPSPING表历史数据。

4. 验证网络连通性

  • 确保ECS安全组和网络ACL放行7800端口的TCP流量,允许容器间互通。
  • 若使用Fargate,需采用awsvpc网络模式,让容器获取独立私有IP,避免端口映射冲突。

5. 确认依赖完整性

Keycloak 25基于Quarkus重构,需确保PostgreSQL驱动已正确引入:启动时添加参数--db=postgres,或在容器镜像中手动加入驱动依赖。

内容的提问来源于stack exchange,提问作者Kushan Sameera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:52:32