Keycloak高可用架构:分布式缓存有效性检测问题
Keycloak分布式缓存正常工作的检测方法
先修正你的测试方式
你直接访问节点A和节点B的测试方法本身存在问题,核心原因有两个:
- Keycloak的会话Cookie默认绑定当前访问的域名/端口,直接访问不同节点会让浏览器生成两个独立的Cookie,自然无法共享会话。
- 如果节点间未配置共享加密密钥,节点B无法解密节点A生成的会话数据,会直接失效原有会话,导致两边都登出。
正确的测试姿势应该走负载均衡器:通过HAProxy的统一域名访问Keycloak,登录后手动让HAProxy转发请求到另一个节点(比如临时禁用当前节点、调整权重),再操作页面验证是否保持登录状态。
具体检测缓存正常的方法
1. 确认Infinispan集群状态
在每个Keycloak节点的控制台日志中,搜索ISPN000094: Received new cluster view,确认两个节点都在集群成员列表内。也可以通过管理API查询缓存状态:
# 替换为你的管理员账号、密码和负载均衡地址 curl -u admin:admin http://<负载均衡地址>/admin/serverinfo
在返回的JSON结果中,找到infinispan相关字段,查看集群节点数量和各类缓存的运行状态。
2. 验证跨节点会话同步
- 通过负载均衡器登录Keycloak,打开浏览器开发者工具的
Application标签,记录KEYCLOAK_SESSION和KEYCLOAK_SESSION_LEGACY的Cookie值。 - 强制HAProxy将后续请求转发到另一个节点(比如临时修改HAProxy配置,把当前节点权重设为0)。
- 刷新页面,检查Cookie是否有效、页面是否保持登录状态;同时查看目标节点的日志,搜索
Session loaded from cache,确认会话数据从分布式缓存中加载成功。
3. 检查缓存配置一致性
确保两个Keycloak节点的Infinispan配置完全一致,重点核对:
jdbc_ping的数据库连接配置是否相同,确认JGROUPSPING表中存在两个节点的订阅记录。- 是否配置了共享加密密钥:在
docker-compose.yml中给两个节点添加相同的环境变量:environment: - KC_SPI_CONNECTIONS_INFINISPAN_CACHE_CONTAINER_ENCRYPTION_KEY=<32位共享密钥> - 确认会话类缓存(如
sessions、authenticationSessions)的模式为DIST_SYNC(分布式同步),可通过节点日志中ISPN000128: Infinispan version下方的缓存配置信息验证。
4. 测试配置与令牌缓存同步
- 登录管理控制台后,在节点A创建一个新角色,通过负载均衡器切换到节点B,检查该角色是否存在(验证配置类缓存同步)。
- 登录前端应用获取访问令牌,将请求转发到节点B,用该令牌调用用户信息接口,确认能正常返回用户数据(验证令牌缓存同步)。
内容的提问来源于stack exchange,提问作者Enricosoft
相关产品推荐
相关产品推荐

