Jboss 密钥斗篷-Infinispan Redis缓存存储

Jboss 密钥斗篷-Infinispan Redis缓存存储,jboss,wildfly,infinispan,keycloak,Jboss,Wildfly,Infinispan,Keycloak,目前正在以独立ha模式设置KeyClope群集,以便能够在docker swarm上运行。在KeyClope中,用户会话缓存在嵌入式infinispan存储中,infinispan可以配置为集群中的分布式缓存 我还将所有者设置为2,但问题是。。在缩小过程中,如果包含缓存的两个所有者在缩小过程中都被杀死,则用户会话有可能丢失 我也读过Infinispan Redis缓存存储,但我不知道如何配置它 问题1: 是否可以将KeyClope Infinispan配置为用户Redis商店 问题2: 如果这是

目前正在以独立ha模式设置KeyClope群集,以便能够在docker swarm上运行。在KeyClope中,用户会话缓存在嵌入式infinispan存储中,infinispan可以配置为集群中的分布式缓存

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

我也读过Infinispan Redis缓存存储,但我不知道如何配置它

问题1: 是否可以将KeyClope Infinispan配置为用户Redis商店

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


任何建议都会有帮助。

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


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

当需要动态扩展大型系统时,需要避免在配置中注册可用节点列表的约束。因此,Redis节点发现在这里是一个优势

Infinispan本身支持Redis Store作为实现SPI和添加XML实体以简化配置的扩展:

但是这个扩展在WildFly infinispan子系统中还不受支持,因为KeyClope依赖于WildFly

因此,我预计以下任务将使Infinispan Redis Store可用于WildFly,以及KeyClope:

  • 为infinispam redis store jar创建jboss模块-请参阅
    modules/system/layers/base/org/infinispan/

  • 创建一个“自定义缓存存储”工厂,能够从WildFly配置键/值属性实例化Redis存储对象(存储、服务器和连接池)。这也必须作为jboss模块添加到WildFly中

  • 使用WildFly infinispan子系统“本地缓存”“自定义”配置此工厂的属性
    class
    properties

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

由于此PR,默认情况下(KeyClope最新版本6.0.1)使用
InfinispanChangelogBasedTransaction.java的
Infinispan连接SPI
特别使用了
CacheDecorator.java
,它将
skipCacheStore
。这意味着,无论您是否使用持久性配置存储,该存储都将被忽略

为了实现您想要的,除了配置存储之外,您还必须在这里自定义大多数SPI,以确保KeyClope将使用缓存存储

这也不是一件容易的事,因为在这个过程中有很多额外的好处,例如,因为KeyClope使用Jboss的Marshaller,如果您自定义此SPI,则必须携带大部分
org.keydepot.models.sessions.infinispan
包并注册您的模块,以确保Wildfly能够看到要访问的实体

另一件事是,您应该使用Redis配置指向一个公共数据库的大多数缓存,除了
authenticationSessions
不能与
sessions
位于同一数据库中,否则,将出现冲突,如正在找到
rootAuthenticationsSessionEntity
,但预期将是
SessionEntityRapper

要继续,这个过程将是痛苦的,但如果你想勇敢地去做,我就是这样做到的:

  • 引入了自定义InfinispanConnectionProviderFactory,以便完全能够使用infinispan配置,然后配置我的容器,如:
private配置getRedisConfiguration(int数据库){
ConfigurationBuilder cb=新的ConfigurationBuilder();
cb.persistence()
.钝化(假)
.addStore(RedisCacheStoreConfigurationBuilder.class)
.忽略修改(错误)
.fetchPersistentState(false)
.purgeOnStartup(错误)
.预加载(错误)
.共享(真实)
.addProperty(“主机”,System.getenv(“REDIS_主机”))
.addProperty(“端口”,System.getenv(“REDIS_端口”))
.addProperty(“数据库”,String.valueOf(数据库));
返回cb.build();
}
您看到的RedisCacheStoreConfigurationBuilder基本上是原始存储的精简版本,但我不需要Sentinel或服务器模式,我只想连接到主机、端口和数据库

然后我基本上复制了
org.keydape.models.sessions.infinispan
删除所有与删除缓存相关的内容,而不是在没有装饰器的情况下正常使用缓存来skipCacheStore


让我知道,如果我能在某些方面提供帮助,我将准备一篇文章,详细说明如何做到这一点,其中还包括一个包含我正在谈论的代码的存储库。如果有人仍在尝试此操作,请让我了解更多信息。

能否将缩小策略配置为一次只终止一台服务器?Infinispan应该检测丢失的服务器,并在剩余节点上重新平衡缓存在该服务器上的会话。当您使用Swarm时,这可能很有趣:这是真的,但如果您想动态扩展,则必须配置/注册(可能很长)服务器节点列表(Infinispan或postgresql)是一个很大的限制。在动态负载平衡器后面有一个Redis Store作为infinispan后端,可以避免在扩展时进行任何维护。(我们在Openshift/Kubernetes中部署)如果使用远程Infinispan客户端,这些