bin/kc.sh start-dev --storage=chm
2022 年 7 月 27 日,作者:Hynek Mlnařík
Keycloak 当前的存储存在一些已知的限制。对于小型部署,初始化数据库和启动 Keycloak 耗时太长。没有对云原生部署的原生支持。升级到新的 Keycloak 版本通常意味着需要停止整个世界的更新,并且在升级时几乎没有机会实现零停机。
Keycloak 19 引入了未来 Keycloak 存储的早期预览版,该存储支持零停机升级、每个 realm 的存储以及从一开始就具备云原生性。这种所谓的 map 存储专注于提供最佳体验,因此将其支持限制为 Postgres 和 CockroachDB 数据库以及 Infinispan 数据存储。早期预览版在 Quarkus 发行版中提供。
此早期预览版缺少一些对于最佳性能至关重要的功能,因此尚未准备好用于生产环境;但我们仍然计划交付这些功能。
在 Keycloak 20 中,预计将改进对 CockroachDB 的支持;以及基于文件的存储。此外还有另一个预期中的功能
tree 存储 - 将有可能组合多种存储机制,例如,将一些静态客户端声明放在版本控制系统(如 Git)管理的静态文件中,并与存储在数据库中的动态客户端相结合。
每个请求的对象缓存也在 Keycloak 20 的计划中,并且应该会带来显著的性能提升。
在 Keycloak 21 中,预计将支持 LDAP,以及用于将数据从旧存储迁移到新存储的离线工具,以及进一步的优化和垃圾回收。
请注意,以前版本中使用的存储(现在称为 legacy store)不会很快消失!由于新存储尚未准备好用于生产环境,因此它仍然是 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 存储分为以下存储区域:Realms、客户端、用户、组、角色、客户端作用域、授权服务、事件、身份验证会话、用户/客户端会话、登录失败、操作令牌和一次性令牌(最后两个区域将在 Keycloak 20 中合并)。
注意
|
有关此划分的更多详细信息,请参阅 架构规范。 |
每个区域都维护自己的存储来存储数据,并且每个区域都与其他区域相互独立。换句话说,realm 可以由数据库提供服务,而用户可以由 Infinispan 提供服务。
要将所有会话数据存储在外部 Infinispan 中,并将 realm / 客户端 / 用户 / 组 / 角色 / … 数据存储在关系数据库中,您可以发出以下命令
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 中。
我们很高兴您能试用新存储并分享您的反馈!