10.2. 配置缓存
Red Hat build of Keycloak 提供了一个缓存配置文件,该文件位于 conf/cache-ispn.xml
。
缓存配置是常规的 {infinispan_configuring_docs}[Infinispan 配置文件]。
下表提供了红帽构建的 Keycloak 使用的特定缓存概述。您可以在 conf/cache-ispn.xml
中配置这些缓存:
缓存名称 | 缓存类型 | 描述 |
---|---|---|
realms | Local | 缓存持久的域数据 |
users | Local | 缓存持久的用户数据 |
授权 | Local | 缓存持久的授权数据 |
keys | Local | 缓存外部公钥 |
crl | Local | X.509 authenticator CRL 的缓存 |
work | 复制 | 在节点间传播无效消息 |
authenticationSessions | 分布式 | 缓存身份验证会话,在身份验证过程中创建/销毁/过期 |
会话 | 分布式 | 缓存持久的用户会话数据 |
clientSessions | 分布式 | 缓存持久的客户端会话数据 |
offlineSessions | 分布式 | 缓存保留离线用户会话数据 |
offlineClientSessions | 分布式 | 缓存保留离线客户端会话数据 |
loginFailures | 分布式 | 跟踪失败的登录、欺诈检测 |
actionTokens | 分布式 | 缓存操作令牌 |
10.2.1. 缓存类型和默认值 复制链接链接已复制到粘贴板!
本地缓存
红帽 Keycloak 的构建会在本地缓存持久数据,以避免对数据库进行不必要的往返。
使用本地缓存将以下数据保存在集群中的每个节点中:
- 域和 相关数据,如客户端、角色和组。
- 用户和 相关数据,如授权角色和组成员身份。
- 授权和 相关数据,如资源、权限和策略。
- keys
域、用户和授权的本地缓存配置为默认容纳最多 10,000 个条目。本地密钥缓存每默认值最多可容纳 1,000 个条目,默认为每小时过期。因此,密钥会被强制从外部客户端或身份提供程序定期下载。
为了实现最佳运行时并避免对数据库的额外往返,您应该考虑查看每个缓存的配置,以确保最大条目数与数据库的大小一致。您可以缓存更多条目,通常服务器需要从数据库获取数据。您应该评估内存利用率和性能之间的利弊。
本地缓存无效
本地缓存提高了性能,但在多节点设置中添加了一个挑战。
当一个红帽构建的 Keycloak 节点更新共享数据库中数据时,所有其他节点都需要了解它,因此它们会导致数据从其缓存中无效。
工作
缓存是一种复制缓存,用于发送这些失效消息。这个缓存中的条目/消息非常短,您不应该预期这个缓存的大小会随时间增长。
身份验证会话
每当用户尝试进行身份验证时,都会创建身份验证会话。身份验证过程完成后或达到其过期时间后会自动销毁。
authenticationSessions
分布式缓存用于存储身份验证会话,以及在身份验证过程中与其关联的任何其他数据。
通过依赖可分布式缓存,身份验证会话可供集群中的任何节点使用,以便用户可以重定向到任何节点,而不会丢失其身份验证状态。但是,生产环境就绪的部署应始终考虑会话关联,而是将用户重定向到初始创建会话的节点。通过这样做,您要避免节点间不必要的状态传输,并改进 CPU、内存和网络利用率。
用户会话
经过身份验证后,将创建一个用户会话。用户会话跟踪您的活跃用户及其状态,以便他们可以无缝地向任何应用程序进行身份验证,而无需再次要求其凭证。对于每个应用程序,用户使用客户端会话进行身份验证,以便服务器可以根据应用程序跟踪用户通过 进行身份验证的应用程序及其状态。
当用户执行注销时,用户和客户端会话都会自动销毁,客户端会执行令牌撤销,或者因为达到它们的过期时间而被销毁。
会话数据默认存储在数据库中,并按需载入到以下缓存:
-
会话
-
clientSessions
通过依赖可分布式缓存,缓存的用户和客户端会话可供集群中的任何节点使用,以便用户可以重定向到任何节点,而无需从数据库加载会话数据。但是,生产环境就绪的部署应始终考虑会话关联,而是将用户重定向到初始创建会话的节点。通过这样做,您要避免节点间不必要的状态传输,并改进 CPU、内存和网络利用率。
对于用户会话和客户端会话的内存缓存,默认为每个节点,10000 个条目会减少红帽构建的 Keycloak 的总内存用量。内部缓存将只为每个缓存条目使用一个所有者运行。
离线用户会话
作为 OpenID Connect Provider,服务器能够对用户进行身份验证并发布离线令牌。在身份验证成功后发出离线令牌时,服务器会创建一个离线用户会话和离线客户端会话。
以下缓存用于存储离线会话:
- offlineSessions
- offlineClientSessions
与用户和客户端会话缓存一样,离线用户和客户端会话缓存默认限制为每个节点 10000 条目。根据需要,从内存驱除的项目将从数据库根据需要加载。
密码过期强制检测
loginFailures
分布式缓存用于跟踪失败登录尝试的数据。对于在多节点红帽构建的 Keycloak 设置中工作,Brute Force Protection 功能需要这个缓存。
操作令牌
当用户需要异步确认操作(例如,忘记密码流发送的电子邮件中)时,可以使用操作令牌。actionTokens
分布式缓存用于跟踪有关操作令牌的元数据。
10.2.2. volatile 用户会话 复制链接链接已复制到粘贴板!
默认情况下,常规用户会话存储在数据库中,并按需加载到缓存中。可以配置红帽构建的 Keycloak,以仅将常规用户会话存储在缓存中,并最小化对数据库的调用。
由于此设置中的所有会话都存储在内存中,因此与此相关的两个副作用:
- 当所有红帽构建的 Keycloak 节点重启时,会丢失会话。
- 增加了内存消耗。
在使用易失性用户会话时,缓存是用户和客户端会话的真实来源。Red Hat build of Keycloak 会自动调整可在内存中存储的条目数量,并增加副本数以防止数据丢失。
由于可能较高的内存用量,不建议在大量使用离线会话时使用易失性用户会话。对于易失性会话,可以在内存中缓存时间离线会话,使用 SPI 选项 spi-user-sessions-infinispan-offline-client-session-cache-entry-lifespan-override
和 spi-user-sessions-infinispan-offline-session-cache-entry-lifespan-override
。
按照以下步骤启用此设置:
使用以下命令禁用
persistent-user-sessions
功能:bin/kc.sh start --features-disabled=persistent-user-sessions ...
bin/kc.sh start --features-disabled=persistent-user-sessions ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
启用 多站点功能时,无法禁用
。
persistent-
user-sessions
10.2.3. 配置缓存最大大小 复制链接链接已复制到粘贴板!
为了减少内存用量,可以将上限放在存储在给定缓存中的条目数。要在缓存上指定 的上限,您必须提供以下命令行参数 --cache-embedded-${CACHE_NAME}-max-count=
,用 ${CACHE_NAME}
替换要应用上限的缓存名称。例如,要将上限 1000
应用到 offlineSessions
缓存,您需要 configure --cache-embedded-offline-sessions-max-count=1000
。在以下缓存上不能定义上限: actionToken
,authenticationSessions
,loginFailures
,work
。
在启用易失性会话时,不支持为 会话
、clientSessions
、offlineSessions
和 offlineClientSessions
设置最大缓存大小。
10.2.4. 指定您自己的缓存配置文件 复制链接链接已复制到粘贴板!
要指定您自己的缓存配置文件,请输入以下命令:
bin/kc.[sh|bat] start --cache-config-file=my-cache-file.xml
bin/kc.[sh|bat] start --cache-config-file=my-cache-file.xml
配置文件相对于 conf/
目录。
10.2.5. 远程服务器的 CLI 选项 复制链接链接已复制到粘贴板!
为了配置红帽构建的 Keycloak 服务器配置,以实现高可用性和多节点集群设置,包括以下 CLI 选项 cache-remote-host
、cache-remote-port
、cache-remote-username
和 cache-remote-password
简化 XML 文件中的配置。存在任何声明的 CLI 参数后,XML 文件中应当没有与远程存储相关的配置。
10.2.5.1. 连接到不安全的 Infinispan 服务器 复制链接链接已复制到粘贴板!
不建议在生产环境中禁用安全性!
在开发或测试环境中,启动不安全的 Infinispan 服务器更容易。对于这些用例,CLI 选项 cache-remote-tls-enabled
会禁用红帽构建的 Keycloak 和 Data Grid 之间的加密(TLS)。如果 Data Grid 服务器被配置为只接受加密的连接,则 Red Hat build of Keycloak 无法启动。
CLI 选项 cache-remote-username
和 cache-remote-password
是可选的,如果未设置,红帽构建的 Keycloak 将连接到 Data Grid 服务器,而无需提供任何凭证。如果 Data Grid 服务器启用了身份验证,红帽构建的 Keycloak 将无法启动。