keycloak - ISPN 缓存的 Keycloak 和失效模式
问题描述
我想为用户会话在失效模式下配置带有嵌入式ISPN缓存的Keycloak。
根据文档,失效模式意味着每个节点都有自己的缓存,并且只有失效才会传播到其他节点(缓存仅对读取操作有用)。我知道性能不是最佳的,但 JDBC 存储成为我看来很有趣的单一事实来源。此外,由于我每周需要存储 100 万个用户会话,ISPN 缓存很快就会被填满(6GB 实例),并且会话可能会使用钝化/激活机制以高频率从数据库中写入/读取。
http://infinispan.org/docs/stable/user_guide/user_guide.html#replicated_mode
但我无法让它工作,没有错误,但行为不是预期的:在几次登录操作后数据库仍然是空的。
<subsystem xmlns="urn:jboss:domain:infinispan:6.0">
<cache-container name="keycloak" module="org.keycloak.keycloak-model-infinispan">
<transport lock-timeout="60000"/>
<local-cache name="realms">
<object-memory size="10000"/>
</local-cache>
<local-cache name="users">
<object-memory size="10000"/>
</local-cache>
<invalidation-cache name="sessions" statistics-enabled="true">
<binary-memory eviction-type="COUNT" size="1000"/>
<expiration lifespan="180000"/>
<jdbc-store data-source="InfinispanDS"
dialect="POSTGRES"
fetch-state="false"
passivation="false"
preload="false"
purge="false"
shared="true"
singleton="false">
<table prefix="ISPN">
<id-column name="ID_COLUMN" type="VARCHAR(255)"/>
<data-column name="DATA_COLUMN" type="BYTEA"/>
<timestamp-column name="TIMESTAMP_COLUMN" type="BIGINT"/>
</table>
</jdbc-store>
</invalidation-cache>
</cache-container>
</subsystem>
<xa-datasource jndi-name="java:jboss/datasources/InfinispanDS" pool-name="InfinispanDS" enabled="true" use-java-context="true" spy="true">
<driver>postgresql</driver>
<xa-datasource-property name="URL">jdbc:postgresql://localhost:5432/keycloak_ispn</xa-datasource-property>
<security>
<user-name>postgres</user-name>
<password>***</password>
</security>
<validation>
<use-fast-fail>true</use-fast-fail>
<validate-on-match>false</validate-on-match>
<background-validation>true</background-validation>
<background-validation-millis>60000</background-validation-millis>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
</validation>
</xa-datasource>
有人可以向我确认这应该有效吗?
(另一种选择是使用具有 eviction-type="COUNT" 和 size="1" 的分布式缓存,这实际上有效,但我猜根本没有更多缓存)。
谢谢
更新 15:09
其实有迹可循:
15:01:07,748 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanAuthenticationSessionProviderFactory] (default task-1) [node11] Registered cluster listeners
15:01:12,147 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProvider] (default task-1) getUserSessionWithPredicate(2cd1a484-1ba6-4f69-8aec-e85f56029bef): found in local cache
15:01:12,149 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanCodeToTokenStoreProviderFactory] (default task-1) Not having remote stores. Using normal cache 'actionTokens' for single-use cache of code
15:01:12,220 DEBUG [org.keycloak.models.sessions.infinispan.changes.InfinispanChangelogBasedTransaction] (default task-1) Replace failed for entity: bd8fe447-b350-45a7-b785-4a4a0c40cb83, old version 9f465b0f-a2ac-407c-a9a1-5f97dca0e337, new version f8b2cf82-c84b-4e57-a058-5e44dba58324. Will try again
- 缺口
解决方案
推荐阅读
- python - 在不拟合的情况下初始化 sklearn Scaler
- groovy - Groovy Rest 客户端:解析“应用程序/json”时出错
- javascript - 如何解析字符串 Unirest 响应
- c# - 如何从 C# 访问谷歌云存储桶
- mysql - MySQL - 链接多个表的建议 - 这是对的吗?
- docker - 删除失败节点后 Docker Swarm 中的孤立任务
- php - PHP包含来自其他文件夹的文件
- powerapps - 将数据保存为文本
- javascript - JQuery - 全页页面滚动功能
- node.js - delivery.js:从服务器到客户端的文件传输不起作用