擴展

開始使用 Keycloak 擴展與調整

啟動 Keycloak 後,請考慮使用這些擴展與調整指南來調整您的執行個體以符合所需的負載

  • 最小化資源利用率

  • 達成目標響應時間

  • 最小化資料庫連線池競爭

  • 解決記憶體不足錯誤,或過度的垃圾回收開銷

  • 透過水平擴展提供更高的可用性

垂直擴展

當您監控 Keycloak 的工作負載時,請檢查 CPU 或記憶體是否被過度或不足地利用。請參考CPU 和記憶體資源大小的概念,以更好地調整 Java 虛擬機器 (JVM) 可用的資源。

在增加 JVM 可用的記憶體量之前,特別是在遇到記憶體不足錯誤時,最好使用堆積轉儲來確定是什麼導致了記憶體使用量的增加。過長的響應時間也可能表示 HTTP 工作佇列過大,調整負載卸載會比單純提供更多記憶體更好。請參閱以下章節。

常見的調整選項

Keycloak 會根據您提供的核心數量自動調整所使用的執行緒數量。手動變更執行緒數量可以提高整體吞吐量。如需更多詳細資訊,請參閱設定執行緒池的概念。然而,變更執行緒數量必須與其他 JVM 資源(例如資料庫連線)一起進行;否則,您可能會將瓶頸轉移到其他地方。如需更多詳細資訊,請參閱資料庫連線池的概念

若要限制佇列工作的記憶體利用率並提供負載卸載,請參閱設定執行緒池的概念

如果您在取得資料庫連線時遇到逾時,您應該考慮增加可用的連線數量。如需更多詳細資訊,請參閱資料庫連線池的概念

垂直自動擴展

某些平台(例如 Kubernetes)提供垂直自動擴展的機制。如果需要重新啟動伺服器執行個體,則不建議對 Keycloak 進行垂直自動擴展,目前 Java 在 Kubernetes 上就是這種情況。您可以考慮改為提供更高的 CPU 和/或記憶體限制,以允許您的 JVM 在這些限制內根據需要進行調整。

水平擴展

單一 Keycloak 執行個體容易出現可用性問題。如果執行個體關閉,您會遇到完全的中斷,直到另一個執行個體啟動。透過在不同的機器上執行兩個或多個叢集成員,您可以大大提高 Keycloak 的可用性。

單一 JVM 對它可以處理的並行請求數量有限制。額外的伺服器執行個體可以提供大致線性的吞吐量擴展,直到相關的資源(例如資料庫或分散式快取)限制了該擴展。

一般來說,請考慮允許 Keycloak Operator 處理水平擴展問題。使用 Operator 時,請將 Keycloak 自訂資源 spec.instances 設定為所需的值以進行水平擴展。如需更多詳細資訊,請參閱使用 Keycloak Operator 部署 Keycloak 以實現高可用性

如果您未使用 Operator,請查看以下內容

  • 如果您的執行個體位於不同的機器上,則可以實現更高的可用性。在 Kubernetes 上,使用 Pod 反親和性來強制執行此操作。

  • 使用分散式快取;對於多站點叢集,請使用外部快取讓叢集成員共享相同的狀態。有關相關組態的詳細資訊,請參閱設定分散式快取。內嵌的 Infinispan 快取具有水平擴展考量,包括

    • 您的執行個體需要一種相互發現的方式。如需更多資訊,請參閱設定分散式快取中的發現。

    • 此快取對於跨越多個可用區域(也稱為跨區叢集)的叢集並非最佳。對於內嵌的 Infinispan 快取,請盡量將所有執行個體放在一個可用區域中。目的是避免不必要的來回通訊,這會在響應時間中放大。在 Kubernetes 上,使用 Pod 親和性來強制執行此 Pod 群組。

    • 此快取無法優雅地處理多個成員同時加入或離開。特別是,成員同時離開可能會導致資料遺失。在 Kubernetes 上,您可以使用具有預設序列處理的 StatefulSet 來確保 Pod 依序啟動和停止。

若要避免在整個站點不可用時失去服務可用性,請參閱高可用性指南,以取得有關多站點部署的更多資訊。請參閱多站點部署

水平自動擴展

水平自動擴展允許根據需求新增或移除 Keycloak 執行個體。請記住,啟動時間不會是立即的,並且應該使用最佳化的映像檔來盡量減少啟動時間。

當使用內嵌的 Infinispan 快取叢集時,動態新增或移除叢集成員需要 Infinispan 對 Infinispan 快取執行重新平衡,如果這些快取中存在許多項目,這可能會非常耗費資源。為了盡量減少此時間,我們預設將會話相關快取中的項目數限制為 10000。請注意,只有在您的組態中未明確停用 persistent-user-sessions 功能時,才能進行此最佳化。

在 Kubernetes 上,Keycloak 自訂資源是可擴展的,這表示它可以作為內建自動擴展器的目標。

本頁面內容