bin/kc.sh start-dev --storage=chm
2022 年 7 月 27 日,作者:Hynek Mlnařík
Keycloak 中的当前存储有一些已知的限制。对于小型部署,初始化数据库并启动 Keycloak 需要很长时间。它没有对云原生部署的原生支持。升级到新的 Keycloak 版本通常意味着需要进行停机更新,升级时几乎没有机会实现零停机时间。
Keycloak 19 带来了未来 Keycloak 存储的早期预览,该存储支持零停机时间升级、每领域存储以及从一开始就支持云原生。这种被称为 *map* 存储专注于提供最佳体验,因此将其支持限制在 Postgres 和 CockroachDB 数据库以及 Infinispan 数据存储。早期预览在 Quarkus 发行版中可用。
此早期预览缺少实现最佳性能所需的几个功能,因此尚未准备好投入生产;但我们有计划提供这些功能
在 Keycloak 20 中,预计将改进对 CockroachDB 的支持;以及基于文件的存储。与另一个预期的功能一起
*tree* 存储 - 可以将几种存储机制组合起来,例如,将几种静态客户端声明存储在像 Git 这样的版本控制系统中管理的静态文件中,并与存储在数据库中的动态客户端相结合。
按请求对象缓存也已列入 Keycloak 20 的计划,并且应该会带来显着更好的性能。
在 Keycloak 21 中,预计将支持 LDAP,以及一个用于将数据从旧存储迁移到新存储的离线工具,以及进一步的优化和垃圾回收
请注意,先前版本中使用的存储(现在称为 *旧存储*)不会很快消失!由于新存储尚未准备好投入生产,因此它仍然是 Keycloak 19 中的默认存储。此外,其他数据库(MySQL、MariaDB、MS SQL Server、Oracle)也不受新存储的支持,这些数据库仅受旧存储支持。我们确实考虑根据社区调查的结果为这些数据库提供二级支持。
为了开发和测试目的,我们提供了一个名为 chm
的快速内存内存储。此存储有意不支持零停机时间升级,因为开发中不需要这样做。因此,它还提供了一种快速部署 Keycloak(无需数据库)的方法。
我们很乐意在 GitHub Discussions 中听到您的反馈。
以下部分包含如何使用新存储配置 Keycloak 19 的示例。
警告
|
以 --storage 开头的实验性命令行选项可能会在未经事先通知的情况下更改,具体取决于社区的反馈和项目需求。 |
下载后,您可以像运行以下命令一样简单地尝试在单节点部署中运行 Keycloak
bin/kc.sh start-dev --storage=chm
这将启动一个 Keycloak 实例,该实例使用简单的测试内存内存储,该存储在 Keycloak 重启时保存到本地文件系统,但不支持零停机时间升级或集群。
要求:Postgres 14 或 CockroachDB 22.1(或更高版本)
要将数据保存在数据库中,请运行以下命令
bin/kc.sh start-dev --storage=jpa --db-url=<jdbc-url> --db-username=<username> --db-password=<password>
参考 问答实时文档。
注意
|
此功能在 CockroachDB 中存在已知问题,请参阅 此跟踪器以获取列表。 |
要求:Infinispan 12.1
如果您已经启动并运行了 Infinispan,也可以使用它来存储数据。您可以通过运行以下命令来实现
bin/kc.sh start-dev --storage=hotrod --storage-hotrod-host=<host> --storage-hotrod-port=11222 --storage-hotrod-username=<username> --storage-hotrod-password=<password>
如果缓存不存在,Keycloak 将在第一次启动时在 Infinispan 中创建所需的缓存。如果您希望微调缓存或例如想要设置持久性,您可以自由创建和配置缓存。有关缓存配置的可用选项,请参阅 Infinispan 文档。
参考 问答实时文档。
最终发现,某些数据应该存储在文件中或数据库中,而其他数据(例如会话数据)应该存储在 Infinispan 中。这可以实现吗?
可以!Keycloak 存储分为以下存储区域:领域、客户端、用户、组、角色、客户端范围、授权服务、事件、身份验证会话、用户/客户端会话、登录失败、操作令牌和一次性令牌(最后两个区域将在 Keycloak 20 中合并)。
注意
|
有关此划分的更多详细信息,请参阅 架构规范。 |
每个区域都维护自己的存储来存储数据,并且每个区域都独立于其他区域。换句话说,领域可以通过数据库提供服务,而用户可以通过 Infinispan 提供服务。
要将所有会话数据存储在外部 Infinispan 中,并将领域/客户端/用户/组/角色/… 数据存储在关系数据库中,您可以发出以下命令
bin/kc.sh start-dev --storage=jpa \ --db-url=<jdbc-url> --db-username=<username> --db-password=<password> \ --storage-hotrod-host=<host> --storage-hotrod-port=<port> \ --storage-hotrod-username=<username> --storage-hotrod-password=<password> \ --storage-area-action-token=hotrod \ --storage-area-auth-session=hotrod \ --storage-area-single-use-object=hotrod \ --storage-area-user-session=hotrod
这将启动一个 Keycloak 服务器,所有区域都由关系数据库(--storage=jpa
)处理,但那些在特定 --storage-area-…
选项中列出并设置为使用外部 Infinispan 协议的区域除外。此设置类似于旧存储,其中所有会话数据都存储在 Infinispan 中,不同之处在于 Infinispan 没有嵌入在 Keycloak 中。
我们很乐意您尝试使用新的存储并分享您的 反馈!