源哈希(Source Hashing)是一種負載均衡算法,它根據請求的源 IP 地址(或其他標識符)生成哈希值,然后根據這個哈希值將請求分配到特定的后端服務實例。這種方法常用于確保來自同一客戶端的請求始終被路由到同一個后端實例,從而實現會話保持(Session Affinity)。
原理
-
生成哈希值:
- 當一個請求到達負載均衡器時,負載均衡器會提取請求的源 IP 地址(或其他標識符,如客戶端的會話 ID)。
- 使用哈希函數(如 MD5、SHA1 等)對源 IP 地址進行哈希計算,生成一個哈希值。
-
映射到后端實例:
- 負載均衡器將生成的哈希值與后端服務實例的數量進行取模運算,從而將哈希值映射到一個特定的后端實例。
- 例如,如果有 3 個后端實例,哈希值對 3 取模的結果將決定請求被路由到哪個實例。
-
會話保持:
- 由于相同的源 IP 地址(或其他標識符)總是生成相同的哈希值,因此來自同一客戶端的請求將始終被路由到同一個后端實例。
- 這種機制確保了會話的連續性,適用于需要保持會話狀態的應用場景。
數學表示
假設:
- ( H ) 是哈希函數。
- ( S ) 是源 IP 地址。
- ( N ) 是后端實例的數量。
- ( h ) 是生成的哈希值。
- ( i ) 是目標后端實例的索引。
則:
[ h = H(S) ]
[ i = h mod N ]
優點
- 會話保持:確保來自同一客戶端的請求始終被路由到同一個后端實例,適用于需要保持會話狀態的應用。
- 簡單高效:算法簡單,計算速度快,適合高并發場景。
缺點
- 不均勻分布:如果客戶端數量分布不均勻,可能導致某些后端實例負載過高。
- 擴展性問題:當后端實例數量變化時,哈希值的映射關系可能改變,導致會話中斷。
應用場景
- Web 應用:適用于需要保持用戶會話的應用,如購物車、用戶登錄狀態等。
- 游戲服務器:確保玩家的請求始終被路由到同一個游戲服務器實例。
- 實時通信:確保實時通信的請求始終被路由到同一個后端實例,以保持連接的穩定性。
示例
假設有一個負載均衡器,后端有 3 個服務實例(編號為 0、1、2),使用源哈希算法進行負載均衡。
客戶端 IP | 哈希值 ( h ) | 目標實例 ( i ) |
---|---|---|
192.168.1.1 | 1234567890 | 1234567890 % 3 = 0 |
192.168.1.2 | 9876543210 | 9876543210 % 3 = 1 |
192.168.1.3 | 4567890123 | 4567890123 % 3 = 2 |
192.168.1.1 | 1234567890 | 1234567890 % 3 = 0 |
從表中可以看出,來自 192.168.1.1
的請求始終被路由到實例 0,來自 192.168.1.2
的請求始終被路由到實例 1,依此類推。