Keycloak 中的新儲存機制

2022 年 7 月 27 日,作者:Hynek Mlnařík

Keycloak 目前的儲存機制有一些已知限制。對於小型部署,初始化資料庫和啟動 Keycloak 需要太長時間。它沒有對雲原生部署的原生支援。升級到新的 Keycloak 版本通常意味著需要停止所有服務進行更新,升級時幾乎沒有機會實現零停機。

Keycloak 19 引入了未來 Keycloak 儲存機制的早期預覽,該機制支援零停機升級、每個領域的儲存,以及從一開始就具備雲原生特性。這種所謂的「map」儲存機制專注於提供最佳體驗,因此僅限於支援 Postgres 和 CockroachDB 資料庫,以及 Infinispan 資料儲存。早期預覽版本可在 Quarkus 發行版中使用。

這個早期預覽版本缺少一些最佳效能所需的特性,因此尚未達到生產就緒狀態;我們仍然有計劃交付這些特性

請注意,舊版本中使用的儲存機制(現在稱為「舊式儲存」)不會很快消失!由於新的儲存機制尚未達到生產就緒狀態,它仍然是 Keycloak 19 中的預設儲存機制。此外,其他資料庫(MySQL、MariaDB、MS SQL Server、Oracle)不受新儲存機制支援,這些資料庫僅受舊式儲存機制支援。我們正在考慮對這些資料庫提供第二級支援,這將根據社群調查的結果而定。

為了開發和測試目的,我們提供了一個名為 chm 的快速記憶體內儲存。此儲存機制刻意不具備零停機升級能力,因為開發時不需要此功能。因此,它也提供了快速的 Keycloak 無資料庫部署方式。

我們很樂意在 GitHub Discussions 中聽到您的回饋意見。

試用看看

以下章節包含如何使用新儲存機制配置 Keycloak 19 的範例。

警告
--storage 開頭的實驗性命令列選項可能會在沒有事先警告的情況下變更,這將根據社群的回饋和專案需求而定。

了解 Keycloak 在沒有資料庫的情況下能做什麼

下載後,您可以嘗試在單節點部署中執行 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 中

需求: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 中。

結論

我們很樂意您嘗試新的儲存機制並分享您的回饋