8.2. 配置缓存
Red Hat build of Keycloak 提供了一个缓存配置文件,其默认设置位于 conf/cache-ispn.xml
。
缓存配置是常规 Infinispan 配置文件。
下表介绍了红帽对 Keycloak 使用的特定缓存。您可以在 conf/cache-ispn.xml
中配置这些缓存:
缓存名称 | 缓存类型 | 描述 |
---|---|---|
realms | Local | 缓存持久的域数据 |
users | Local | 缓存持久的用户数据 |
授权 | Local | 缓存持久的授权数据 |
keys | Local | 缓存外部公钥 |
work | 复制 | 在节点间传播无效消息 |
authenticationSessions | 分布式 | 缓存身份验证会话,在身份验证过程中创建/销毁/过期 |
会话 | 分布式 | 缓存用户会话,在退出、令牌撤销或过期时成功进行身份验证并销毁 |
clientSessions | 分布式 | 缓存客户端会话,在成功验证特定客户端并在注销、令牌撤销或到期时销毁 |
offlineSessions | 分布式 | 缓存离线用户会话,在成功身份验证并销毁后创建,令牌撤销或因为过期 |
offlineClientSessions | 分布式 | 缓存客户端会话,在成功验证特定客户端并在注销、令牌撤销或到期时销毁 |
loginFailures | 分布式 | 跟踪失败的登录,fraud 检测 |
actionTokens | 分布式 | 缓存操作令牌 |
8.2.1. 缓存类型和默认值
本地缓存
红帽构建的 Keycloak 会在本地缓存持久性数据,以避免不必要的往返到数据库。
以下数据使用本地缓存保存在集群中的每个节点上:
- 域和 相关数据,如客户端、角色和组。
- 用户和 相关数据,如授予角色和组成员身份。
- 授权和 相关数据,如资源、权限和策略。
- keys
域、用户和授权的本地缓存被配置为每个默认包含 10,000 个条目。默认情况下,本地密钥缓存可以保存最多 1,000 个条目,并且默认为每一小时的过期。因此,密钥会被强制从外部客户端或身份提供程序定期下载。
为了获得最佳运行时并避免额外的往返数据库,您应该考虑查看每个缓存的配置,以确保您的数据库大小一致。您可以缓存更多条目,但服务器通常需要从数据库获取数据。您应该评估内存使用率和性能之间的利弊。
本地缓存无效
本地缓存提高了性能,但在多节点设置中添加了一个挑战。
当一个红帽构建的 Keycloak 节点更新共享数据库中的数据时,所有其他节点都需要了解它,因此它们会使其缓存中的数据无效。
work
缓存是一个复制缓存,用于发送这些无效消息。此缓存中的条目/消息非常短,您不应预期这个缓存随时间增长。
身份验证会话
当用户试图身份验证时,都会创建身份验证会话。身份验证过程完成或达到其过期时间后,它们会自动销毁。
authenticationSessions
分布式缓存用于存储身份验证会话以及在身份验证过程中与之关联的任何其他数据。
通过依赖可分布式缓存,身份验证会话可供集群中的任何节点使用,以便用户能够重定向到任何节点,而不会丢失其身份验证状态。但是,生产就绪部署应始终考虑会话关联,并优先将用户重定向到最初创建会话的节点。通过这样做,您将避免在节点间不必要的状态传输,并提高 CPU、内存和网络利用率。
用户会话
验证用户后,会创建一个用户会话。用户会话会跟踪您的活跃用户及其状态,以便他们可以无缝地向任何应用程序进行身份验证,而无需再次要求提供其凭证。对于每个应用程序,用户也会创建使用客户端会话进行身份验证,以便服务器可以跟踪用户按应用程序进行身份验证的应用程序及其状态。
当用户执行注销时,用户和客户端会话会自动销毁,客户端会执行令牌撤销,或者因为达到其过期时间。
以下缓存用于存储用户和客户端会话:
- 会话
- clientSessions
通过依赖可分布式缓存,用户和客户端会话可供集群中的任何节点使用,以便用户能够重定向到任何节点,而无需丢失其状态。但是,生产就绪部署应始终考虑会话关联,并优先将用户重定向到最初创建会话的节点。通过这样做,您将避免在节点间不必要的状态传输,并提高 CPU、内存和网络利用率。
作为 OpenID Connect 提供程序,服务器还可以对用户进行身份验证并发出离线令牌。与常规用户和客户端会话类似,当服务器成功发布离线令牌时,服务器还会创建离线用户会话和离线客户端会话。但是,由于离线令牌的性质,离线会话会以不同的方式处理,因为它们是长期的,且应在完整的集群关闭后保留。因此,它们也会保留在数据库中。
以下缓存用于存储离线会话:
- offlineSessions
- offlineClientSessions
在集群重启后,离线会话会从数据库完全加载,并使用上述两个缓存保存在共享缓存中。
密码 brute 强制检测
loginFailures
分布式缓存用于跟踪登录尝试失败的数据。这个缓存是 Brute Force Protection 功能需要在多节点 Red Hat build of Keycloak 设置中工作。
操作令牌
当用户需要异步确认操作时,可以使用操作令牌,例如在忘记密码流发送的电子邮件中。actionTokens
分布式缓存用于跟踪操作令牌的元数据。
8.2.2. 配置缓存以实现可用性
分布式缓存在集群中的节点子集上复制缓存条目,并将条目分配给固定所有者节点。
每个分布式缓存都默认有两个所有者,这意味着两个节点具有特定缓存条目的副本。非所有者节点查询特定缓存的所有者来获取数据。当两个所有者节点都离线时,所有数据都会丢失。这种情况通常会导致用户在下次请求中注销,并必须再次登录。
默认所有者数量足以在至少三个节点的群集设置中保留 1 个节点(所有者)故障。您可以自由地相应地更改所有者数量,以更好地满足您的可用性要求。要更改所有者数量,请打开 conf/cache-ispn.xml
,并将分布式缓存的 owners=<value
> 的值改为您所需的值。
8.2.3. 指定您自己的缓存配置文件
要指定您自己的缓存配置文件,请输入以下命令:
bin/kc.[sh|bat] build --cache-config-file=my-cache-file.xml
配置文件相对于 conf/
目录。
8.2.4. 远程服务器的 CLI 选项
对于红帽构建的 Keycloak 服务器配置,用于高可用性和多节点集群设置,以下 CLI 选项 cache-remote-host
、cache-remote-port
、cache-remote-username
和 cache-remote-password
简化 XML 文件中的配置。出现任何声明的 CLI 参数后,XML 文件中应该没有与远程存储相关的配置。