最近,我加强了Keycloak部署,以使用专用的Infinispan群集作为remote-store
Keycloak各种缓存的额外持久层。更改本身进行得相当不错,尽管进行了更改之后,由于expired_code
错误消息,我们开始看到很多登录错误:
WARN [org.keycloak.events] (default task-2007) type=LOGIN_ERROR, realmId=my-realm, clientId=null, userId=null, ipAddress=192.168.50.38, error=expired_code, restart_after_timeout=true
通常,在同一时间段内从同一IP地址重复多次多次出现此错误消息。造成这种情况的原因似乎是最终用户的浏览器在登录时会无限重定向,直到浏览器本身停止循环为止。
我已经看到了各种GitHub问题(https://github.com/helm/charts/issues/8355),也记录了此行为,并且共识似乎是这是由Keycloak群集无法正确发现其成员引起的通过JGroups。
当您考虑到某些Keycloak缓存在中的默认配置中分布在Keycloak节点上时,此解释才有意义standalone-ha.xml
。但是,我已将这些高速缓存修改为本地高速缓存,并remote-store
指向我的新Infinispan群集,并且我认为我对该运行方式做出了一些不正确的假设,导致此错误开始发生。
这是我的Keycloak缓存配置的方式:
WARN [org.keycloak.events] (default task-2007) type=LOGIN_ERROR, realmId=my-realm, clientId=null, userId=null, ipAddress=192.168.50.38, error=expired_code, restart_after_timeout=true
请注意,与默认standalone-ha.xml
配置文件相比,此缓存配置的大部分保持不变。我在这里所做的更改是将以下缓存更改为local
并将它们指向我的远程Infinispan群集:
sessions
authenticationSessions
offlineSessions
clientSessions
offlineClientSessions
loginFailures
actionTokens
work
这是我的remote-cache
服务器的配置:
true
org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory
true
org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory
true
org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory
true
org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory
true
org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory
true
org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory
true
org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory
true
org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory
这是在Infinispan端配置我的缓存的方式:
我相信我对带有远程存储的本地缓存的工作方式做出了一些错误的假设,我希望有人能够为我解决这个问题。我的意图是使Infinispan群集成为Keycloak所有缓存的真实来源。通过将每个缓存都设置为本地,我假设数据将通过Infinispan集群复制到每个Keycloak节点,这样,对本地authenticationSessions
缓存的写入keycloak-0
将keycloak-1
通过Infinispan集群同步持久化。
我认为正在发生的事情是,就将那个值持久保存到远程Infinispan群集而言,对Keycloak上的本地缓存的写入并不同步。换句话说,对authenticationSessions
高速缓存执行写操作时,在等待将此值写入Infinispan群集时不会阻塞,因此在另一个Keycloak节点上立即读取此数据会导致本地和本地发生高速缓存未命中。 Infinispan集群。
我正在寻找一些帮助来确定为什么当前配置导致了此问题,并澄清了remote-store
- 的行为-是否有办法将缓存写入由a支持的本地缓存remote-store
以使其同步?如果没有,是否有更好的方法来完成我要在这里完成的工作?
其他一些潜在的相关细节:
Keycloak和Infinispan都被部署到Kubernetes集群中的相同名称空间。
我正在KUBE_PING
用于JGroups发现。
使用Infinispan控制台,我可以验证复制到所有Infinispan节点的所有缓存中是否包含一定数量的条目-它们并未完全使用。
如果将新领域添加到一个Keycloak节点,它将成功显示在其他Keycloak节点上,这使我相信work
缓存将在所有Keycloak节点之间传播。
如果我登录到一个Keycloak节点,则我的会话仍保留在其他Keycloak节点上,这使我相信与会话相关的缓存将在所有Keycloak节点上传播。
我使用Keycloak的粘性会话作为对此的临时解决方案,但是我认为解决这些潜在的缓存问题是一种更永久的解决方案。
提前致谢!