目前在standalone-ha模式下设置了一个keycloak集群,以便能够在docker swarm上运行。在keycloak中,用户会话被缓存在嵌入式的infinispan中,并且infinispan可以被配置为跨集群的分布式缓存。
我还将所有者设置为2,但问题是..在缩容过程中,如果包含缓存的两个所有者在缩容过程中都被杀死,则可能会丢失用户会话。
我也读过关于Infinispan缓存存储的文章,但我不确定如何配置。
问题1:是否可以将Keycloak Infinispan配置为使用Redis Store?
问题2:如果这是不可能的,有没有办法克服这个问题?
任何建议都会很有帮助。
发布于 2019-08-06 00:02:19
由于这个PR https://github.com/keycloak/keycloak/commit/056ba75a72b1595ca9fa471f5693201fd5b2c7ae默认情况下(Keycloak最新版本6.0.1),使用InfinispanChangelogBasedTransaction.java
的Infinispan Connection SPI
有一个非常特殊的CacheDecorator.java
用法,它将skipCacheStore
。这意味着,无论您是否使用持久性配置存储,该存储都将被忽略。
为了实现您想要的功能,除了配置存储之外,您还必须自定义大部分的SPI here https://github.com/keycloak/keycloak/tree/master/model/infinispan/src/main/resources/META-INF/services,以确保Keycloak将使用缓存存储。
这也不容易,因为在这个过程中涉及到很多额外的好处,例如,由于Keycloak使用Jboss的Marshaller,如果你定制这个SPI,你将不得不带上大部分的org.keycloak.models.sessions.infinispan
包并注册你的模块,以确保Wildfly能够看到要编组的实体。
另一件事是,在Redis中,你应该配置大多数指向一个公共数据库的缓存,除了authenticationSessions
,它不能和sessions
在同一个数据库中,否则会出现像RootAuthenticationSesssionEntity
被发现但被期望为SessionEntityWrapper
的冲突。
要恢复,这个过程将是痛苦的,但如果你想大胆地去做,这就是我实现它的方式:
private Configuration getRedisConfiguration(int database) {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.persistence()
.passivation(false)
.addStore(RedisCacheStoreConfigurationBuilder.class)
.ignoreModifications(false)
.fetchPersistentState(false)
.purgeOnStartup(false)
.preload(false)
.shared(true)
.addProperty("host", System.getenv("REDIS_HOST"))
.addProperty("port", System.getenv("REDIS_PORT"))
.addProperty("database", String.valueOf(database));
return cb.build();
}
您看到的RedisCacheStoreConfigurationBuilder
基本上是原始存储的精简版本,但我不需要前哨或服务器模式,我只想连接到主机、端口和数据库。
然后,我基本上复制了删除缓存相关的所有内容的org.keycloak.models.sessions.infinispan
,而不是正常地使用没有装饰器的缓存到skipCacheStore。
让我知道如果我能帮上什么忙,我会准备一篇更详细的文章来指导如何做到这一点,还包括一个存储库,其中将包含我正在谈论的代码。如果有人还在尝试,请让我知道更多。
发布于 2018-07-26 17:11:04
当期望动态扩展大型系统时,应该避免在配置中注册可用节点列表的约束。所以Redis节点发现在这里是一个好处。
Infinispan本身支持Redis Store作为实现SPI和添加XML实体的扩展,以简化配置:
但是在KeycloakInfinispan子系统中不支持这个扩展--因为WildFly依赖于WildFly。
因此,我希望通过以下任务使Infinispan可用于WildFly,以及Keycloak:
infinispam Redis Store jar创建jboss模块-参见modules/system/layers/base/org/infinispan/
-
class
和properties
:custom工作正在进行中,可能会发布代码和配置。
发布于 2017-08-28 22:41:23
在Infinispan后面使用Redis商店有什么特别的原因吗?
一种更简单的解决方案可能是将持久性配置为文件或共享数据库。对于这样的缓存用例,基于文件的持久性可能就足够了。有关配置基于文件的持久化的here的示例,请参阅Infinispan.或者,您可以存储到共享数据库,例如Postgresql,但这需要更多的设置(例如,参见ref card )。
https://stackoverflow.com/questions/45881926
复制相似问题