多服务器Docker-Compose部署Keycloak实例,JDBC-PING缓存共享方案咨询
Keycloak跨服务器集群缓存共享解决方案
核心问题分析
当前配置的关键问题:
JGROUPS_DISCOVERY_EXTERNAL_IP设为容器名称,仅在单服务器Docker内网有效,跨服务器无法解析- 两台服务器的Docker网络孤立,Keycloak集群通信端口未对外开放
- JDBC-PING缺少明确配置,未确保节点元数据写入共享外部数据库
具体修复步骤
1. 修正集群节点外部IP配置
将JGROUPS_DISCOVERY_EXTERNAL_IP替换为对应服务器的内网/公网IP,而非容器名。例如:
- 服务器1的Keycloak实例:
JGROUPS_DISCOVERY_EXTERNAL_IP=192.168.1.10 - 服务器2的Keycloak实例:
JGROUPS_DISCOVERY_EXTERNAL_IP=192.168.1.11
2. 开放集群通信端口
Keycloak集群依赖JGroups端口,需在两台服务器上开放并映射:
- 在Docker Compose的Keycloak服务中添加端口映射:
ports: - "8080:8080" - "7600:7600" # JGroups TCP通信默认端口 - 服务器防火墙放行
7600端口,确保跨服务器能互相访问该端口。
3. 明确JDBC-PING数据库配置
添加环境变量让JDBC-PING复用Keycloak的共享数据库连接:
JGROUPS_DISCOVERY_PROPERTIES=datasource_jndi_name=java:jboss/datasources/KeycloakDS
此配置确保集群节点信息写入共享的外部MySQL库,实现跨服务器节点发现。
4. 统一集群名称
给所有Keycloak实例添加相同集群名称,避免节点分散到不同集群:
KC_CLUSTER=keycloak-cluster
修正后的单服务器Docker Compose示例(服务器1)
version: '3' services: keycloak-clustered-3: build: ./keycloak container_name: keycloak-clustered-3 command: start-dev ports: - "8080:8080" - "7600:7600" environment: - KEYCLOAK_ADMIN=admin - KEYCLOAK_ADMIN_PASSWORD=admin - KC_DB=mysql - KC_DB_URL_HOST=dbhost - KC_DB_URL_DATABASE=keycloak - KC_DB_USERNAME=keycloak - KC_DB_PASSWORD=password - KC_LOG_LEVEL=INFO,org.infinispan:DEBUG,org.jgroups:DEBUG - JGROUPS_DISCOVERY_EXTERNAL_IP=192.168.1.10 - KC_PROXY=edge - JGROUPS_DISCOVERY_PROTOCOL=JDBC_PING - JGROUPS_DISCOVERY_PROPERTIES=datasource_jndi_name=java:jboss/datasources/KeycloakDS - KC_CLUSTER=keycloak-cluster networks: - keycloak-net nginx: image: nginx:1.23.4 restart: unless-stopped container_name: nginx ports: - "80:80" depends_on: - keycloak-clustered-3 volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro networks: - keycloak-net networks: keycloak-net:
服务器2的配置只需修改JGROUPS_DISCOVERY_EXTERNAL_IP为自身IP,调整端口映射(如8081:8080)即可。
集群状态验证
启动实例后,查看Keycloak日志,搜索ISPN000094: Received new cluster view,若日志中出现跨服务器的节点ID,说明集群组建成功。也可通过Keycloak管理控制台的Server Info -> Cluster页面查看节点列表。
内容的提问来源于stack exchange,提问作者samibe
相关产品推荐
相关产品推荐

