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 的支援,並且也會提供基於檔案的儲存。以及另一項預期的功能
「樹狀」儲存 - 這將可以結合多種儲存機制,例如將幾個靜態用戶端宣告放在版本控制系統(如 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 中。
我們很樂意您嘗試新的儲存機制並分享您的回饋!