目前在standalone-ha模式下设置keycloak集群,以便能够在docker swarm上运行。在keycloak中,用户会话缓存在嵌入式infinispan商店中,infinispan可以配置为整个集群中的分布式缓存。
我还将所有者设置为2,但问题是......在缩小规模期间,用户会话可能会丢失,如果包含缓存的所有者都在规模期间被杀死 - 下。
我还读过有关Infinispan Redis缓存存储的信息,但我不知道如何配置它。
问题1: 是否可以将Keycloak Infinispan配置为用户Redis商店?
问题2: 如果这是不可能的,有没有办法可以克服这个问题?
任何建议都会有所帮助。
答案 0 :(得分:2)
由于默认情况下此PR https://github.com/keycloak/keycloak/commit/056ba75a72b1595ca9fa471f5693201fd5b2c7ae(Keycloak最新版本6.0.1),使用Infinispan Connection SPI
的{{1}}对InfinispanChangelogBasedTransaction.java
的使用非常特殊,它将{ {1}}。这意味着无论您是否为存储配置持久性存储,该存储都将被忽略。
为了实现所需的功能,除了配置存储外,还必须在https://github.com/keycloak/keycloak/tree/master/model/infinispan/src/main/resources/META-INF/services处自定义大多数SPI,以确保Keycloak将使用缓存存储。
这也不容易,因为该过程涉及很多特权,例如,由于Keycloak使用的是Jboss的Marshaller,因此,如果您自定义此SPI,则必须带上大部分{{1} }打包并注册您的模块,以确保Wildfly能够看到要编组的实体。
另一件事是,您应该使用Redis配置指向一个公共数据库的大多数缓存,除了CacheDecorator.java
不能与skipCacheStore
处于同一数据库之外,否则,将会存在发生冲突,例如发现org.keycloak.models.sessions.infinispan
但预期会是authenticationSessions
。
要继续,整个过程将很痛苦,但是如果您想敢做,那就是我实现的目标:
sessions
您看到的RootAuthenticationSesssionEntity
基本上是原始存储的简化版本,但是我不需要Sentinel或Server模式,我只想连接到主机,端口和数据库。
然后,我基本上复制了SessionEntityWrapper
,删除了与删除缓存有关的所有内容,而不是通常不使用带有装饰器的缓存来跳过CacheStore。
让我知道我是否可以提供帮助,我将最准备一个帖子,指示如何执行此操作,其中还包含一个包含我所讨论的代码的存储库。如果有人仍在尝试此操作,请告诉我更多信息。
答案 1 :(得分:1)
在Infinispan背后使用Redis商店的任何特殊原因?
更简单的解决方案可能是为文件或共享数据库配置持久性。对于像这样的缓存用例,基于文件的持久性可能就足够了。有关使用基于文件的持久性配置Infinispan的示例,请参阅here。或者,您可以存储到共享数据库,例如Postgresql,但需要更多设置(例如,请参阅ref card)。
答案 2 :(得分:1)
当期望动态扩展大型系统时,可以避免在配置中注册可用节点列表的这种限制。因此,在这里发现Redis节点是有好处的。
Infinispan本身支持Redis Store作为实现SPI和添加XML实体以简化配置的扩展:
但是WildFly infinispan子系统中尚不支持此扩展-因为Keycloak依赖WildFly。
因此,我希望通过以下任务来为WildFly和Keycloak提供Infinispan Redis Store:
为infinispam redis存储罐创建jboss模块-请参见modules/system/layers/base/org/infinispan/
创建一个“自定义缓存存储”工厂,该工厂能够通过WildFly配置键/值属性实例化Redis存储对象(存储,服务器和连接池)。这也必须作为jboss模块添加到WildFly
使用WildFly infinispan子系统“本地缓存”“自定义”为工厂配置属性class
和properties
:https://wildscribe.github.io/WildFly/11.0/subsystem/infinispan/cache-container/local-cache/store/custom/index.html
工作正在进行中,可能会发布代码和配置。