本主題描述一個高可用的多站點設置及其預期行為。它概述了高可用性架構的需求,並描述了其優點和權衡。
使用此設定可提供能夠容忍站點故障的 Keycloak 部署,從而減少停機的可能性。
兩個在不同站點運行的獨立 Keycloak 部署通過低延遲網路連接。使用者、Realm、客戶端、會話和其他實體儲存在一個資料庫中,該資料庫在兩個站點之間同步複製。資料也以本機快取的形式快取在 Keycloak Infinispan 快取中。當一個 Keycloak 實例中的資料被更改時,該資料會更新到資料庫中,並使用 work
快取將失效訊息發送到另一個站點。
在以下段落和圖表中,對部署 Infinispan 的引用適用於外部 Infinispan。
雖然此設定旨在實現高可用性,但以下情況仍然可能導致服務或資料遺失:
Keycloak 站點故障可能會導致在故障發生到負載平衡器檢測到故障之間的期間內請求失敗,因為請求可能仍然路由到故障站點。
一旦站點之間的通訊發生故障,就需要手動步驟來重新同步降級的設置。
如果其他組件發生故障,降級的設置可能會導致服務或資料遺失。必須進行監控以檢測降級的設置。
故障 | 恢復 | RPO1 | RTO2 |
---|---|---|---|
資料庫節點 |
如果寫入器實例失敗,資料庫可以將同一站點或其他站點中的讀取器實例提升為新的寫入器。 |
無資料遺失 |
數秒至數分鐘(取決於資料庫) |
Keycloak 節點 |
每個站點中運行多個 Keycloak 實例。如果一個實例失敗,某些傳入的請求可能會收到錯誤訊息或延遲幾秒鐘。 |
無資料遺失 |
少於 30 秒 |
Infinispan 節點 |
每個站點中運行多個 Infinispan 實例。如果一個實例失敗,其他節點需要幾秒鐘才能注意到該變化。實體儲存在至少兩個 Infinispan 節點中,因此單一節點故障不會導致資料遺失。 |
無資料遺失 |
少於 30 秒 |
Infinispan 叢集故障 |
如果其中一個站點中的 Infinispan 叢集失敗,Keycloak 將無法與該站點上的外部 Infinispan 通訊,並且 Keycloak 服務將不可用。負載平衡器將檢測到 在 Infinispan 叢集恢復且資料重新同步之前,設置處於降級狀態。 |
無資料遺失3 |
數秒至數分鐘(取決於負載平衡器設置) |
Infinispan 連線 |
如果兩個站點之間的連線遺失,則無法將資料發送到另一個站點。傳入的請求可能會收到錯誤訊息或延遲幾秒鐘。Infinispan 將把另一個站點標記為離線,並停止發送資料。必須將其中一個站點在負載平衡器中離線,直到連線恢復並且兩個站點之間的資料重新同步。在藍圖中,我們展示了如何自動化此過程。 |
無資料遺失3 |
數秒至數分鐘(取決於負載平衡器設置) |
資料庫連線 |
如果兩個站點之間的連線遺失,同步複製將失敗。某些請求可能會收到錯誤訊息或延遲幾秒鐘。根據資料庫的不同,可能需要手動操作。 |
無資料遺失3 |
數秒至數分鐘(取決於資料庫) |
站點故障 |
如果沒有可用的 Keycloak 節點,負載平衡器將檢測到停機並將流量重新導向到另一個站點。某些請求可能會收到錯誤訊息,直到負載平衡器檢測到故障。 |
無資料遺失3 |
少於兩分鐘 |
1 復原點目標,假設設置的所有部分在發生此情況時都處於正常狀態。
2 復原時間目標。
3 需要手動操作來復原降級的設置。
「無資料遺失」的聲明取決於設置是否未因先前的故障而降級,包括完成任何待辦的手動操作以重新同步站點之間的狀態。
成功的故障轉移需要設置未因先前的故障而降級。必須完成所有手動操作,例如在先前故障後進行重新同步,以防止資料遺失。使用監控來確保及時檢測和處理降級。
當同步 Infinispan 請求失敗時,站點可能會變得不同步。這種情況目前難以監控,需要完全手動重新同步 Infinispan 才能恢復。監控兩個站點中的快取條目數量和 Keycloak 日誌檔案可以顯示何時需要重新同步。
在站點之間重新同步 Infinispan 狀態的手動操作將發出完整的狀態傳輸,這會對系統造成壓力。
此設置僅在兩個站點的情況下進行測試和支援。每個額外的站點都會增加整體延遲,因為必須將資料同步寫入每個站點。此外,網路故障的可能性以及停機時間也會增加。因此,我們不支援超過兩個站點,因為我們認為這將導致部署的穩定性和效能較差。
同步複製的資料庫可確保在一個站點中寫入的資料在站點故障後始終在另一個站點中可用,並且不會遺失任何資料。它還可確保下一個請求不會返回過時的資料,而與它在哪個站點上被服務無關。
同步複製的 Infinispan 可確保一個站點中快取的資料在站點故障後始終在另一個站點上可用,並且不會遺失任何資料。它還可確保下一個請求不會返回過時的資料,而與它在哪個站點上被服務無關。
同步複製會延遲對呼叫者的回應,直到在另一個站點收到資料。對於同步資料庫複製和同步 Infinispan 複製,當更新資料時,每個請求都可能在站點之間進行多次互動,這會放大延遲,因此必須具有低延遲。
非同步設置會優雅地處理站點之間的網路故障,而同步設置會延遲請求並向呼叫者拋出錯誤,而非同步設置會將寫入延遲到另一個站點的 Infinispan 或資料庫。但是,由於兩個站點永遠不會完全最新,因此此設置可能會在故障期間導致資料遺失。這將包括:
當使用非同步資料庫時,由於資料庫變更在故障時未複製到另一個站點,導致遺失的變更,讓使用者能夠使用舊密碼登入。
當使用非同步 Infinispan 複製時,由於失效快取在故障時未傳播到另一個站點,導致失效的快取,讓使用者能夠使用舊密碼登入。
因此,在高可用性和一致性之間存在權衡。本主題的重點是優先考慮 Keycloak 的一致性而不是可用性。
繼續閱讀建構區塊多站點部署指南,以查找不同建構區塊的藍圖。