問題描述
Azure Redis是高可用架構,由主節點,從節點 兩個節點共同組成。
應用客戶端連線的Redis伺服器的域名,經過DNS解析為上圖中Load Balancer的IP,然後連線轉發到主節點。發生故障轉移(Failover)是LB後的兩個Primary和Replica 節點進行了切換,這個期間沒有DNS變動。
對於以上情況,有如下疑問:
1:Load Balancer 沒有保持和客戶端的連線,需要客戶端重建連線到新主節點。那為什麼Redis連線數指標上一直顯示有大量的連結呢?
2:這些大量的連線,是如何產生的呢? 按照應用中的配置計算,達不到上萬連線的數量級。如何解釋這種情況呢?
3:對於Redis的Server Load指標,每秒建立連線數的併發值,是否有建議呢?
問題解答
1:Load Balancer 沒有保持和客戶端的連線,需要客戶端重建連線到新主節點。那為什麼Redis連線數指標上一直顯示有大量的連結呢?
【答】:任何時候發生故障轉移(主節點離線)或副本節點離線時,其中一個節點會暫時下線。在下線之前,該節點會關閉所有終止於它的客戶端連線。預計客戶端庫會自動重新連線以恢復關閉的連線,Load Balancer 會將該替換連線路由到另一個仍線上的節點。
如果客戶端應用程式在切換到第二個快取時沒有正確關閉與原始快取的連線。如果這些連線確實被放棄且不再接收任何流量或保持活動的 ping,那麼伺服器將在 10 分鐘空閒超時後關閉它們。這些沒有正常關閉的連線會導致Redis連線數指標上顯示大量連線數。
2:這些大量的連線,是如何產生的呢? 按照應用中的配置計算,達不到上萬連線的數量級。如何解釋這種情況呢?
【答】:快取內的節點(主節點和副本)發出連線指標,報告的總連線數是每個節點上終止的客戶端連線的總和(轉發的連線不會被重複計算)。如果這些指標顯示的數量高於預期,那麼客戶端應用程式內部存在連線洩漏,或者 Redis 客戶端庫內部存在連線洩漏。
3:對於Redis的Server Load指標,每秒建立連線數的併發值,是否有建議呢?
【答】:為了避免將快取推到 100% 伺服器負載,建議將連線建立速率保持在每秒 30 個以下。
當然也可以以更高的速率建立連線(尤其是在更高定價層的Redis上),但這可能會導致Redis Server Load瞬間達到 100% ,並且導致對其它正常的Redis請求的響應變慢,甚至出現Timeout異常。在這種情況下,大部分Redis客戶端能正常處理,但是Redisson 無法處理,很可能引發連線風暴。
參考資料
Azure Redis 高可用性和災難恢復 : https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-high-availability#standard-replication-for-high-availability