首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Keycloak - Infinispan缓存存储

Keycloak - Infinispan缓存存储
EN

Stack Overflow用户
提问于 2017-08-25 20:54:27
回答 3查看 7.4K关注 0票数 12

目前在standalone-ha模式下设置了一个keycloak集群,以便能够在docker swarm上运行。在keycloak中,用户会话被缓存在嵌入式的infinispan中,并且infinispan可以被配置为跨集群的分布式缓存。

我还将所有者设置为2,但问题是..在缩容过程中,如果包含缓存的两个所有者在缩容过程中都被杀死,则可能会丢失用户会话。

我也读过关于Infinispan缓存存储的文章,但我不确定如何配置。

问题1:是否可以将Keycloak Infinispan配置为使用Redis Store?

问题2:如果这是不可能的,有没有办法克服这个问题?

任何建议都会很有帮助。

EN

回答 3

Stack Overflow用户

发布于 2019-08-06 00:02:19

由于这个PR https://github.com/keycloak/keycloak/commit/056ba75a72b1595ca9fa471f5693201fd5b2c7ae默认情况下(Keycloak最新版本6.0.1),使用InfinispanChangelogBasedTransaction.javaInfinispan 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的冲突。

要恢复,这个过程将是痛苦的,但如果你想大胆地去做,这就是我实现它的方式:

  • 引入了一个自定义的InfinispanConnectionProviderFactory,以便拥有使用infinispan配置的完整功能,然后配置我的容器,如:

代码语言:javascript
运行
复制
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。

让我知道如果我能帮上什么忙,我会准备一篇更详细的文章来指导如何做到这一点,还包括一个存储库,其中将包含我正在谈论的代码。如果有人还在尝试,请让我知道更多。

票数 8
EN

Stack Overflow用户

发布于 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/

  • Create a "Custom Cache Store“工厂,能够从WildFly配置键/值属性实例化redis store对象(存储、服务器和连接池)。必须将其作为jboss模块添加到WildFly中,以便使用本地缓存子系统“

-

  • “WildFly”为此工厂配置属性classproperties:custom

工作正在进行中,可能会发布代码和配置。

票数 2
EN

Stack Overflow用户

发布于 2017-08-28 22:41:23

在Infinispan后面使用Redis商店有什么特别的原因吗?

一种更简单的解决方案可能是将持久性配置为文件或共享数据库。对于这样的缓存用例,基于文件的持久性可能就足够了。有关配置基于文件的持久化的here的示例,请参阅Infinispan.或者,您可以存储到共享数据库,例如Postgresql,但这需要更多的设置(例如,参见ref card )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45881926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档