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

多服务器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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:00:37