互聯網架構中的負載均衡
來自專欄 Java之鏈
計算機的資源在分配和使用有兩大思維:效率和公平。比如負載均衡技術就體現了公平思維。
負載均衡(Load Balance)是集群和分散式系統中必須考慮的關鍵因素,它通常是指把數據或請求均勻分攤到操作單元上,它的靈魂就是「均勻」。
負載均衡主要分為硬體負載均衡和軟體負載均衡兩大類。我在某央企工作時,使用的F5就是硬體負載均衡(記得均衡策略是輪詢),本文主要談軟體負載均衡。
說到負載均衡,我第一反應是Nginx,其實互聯網架構中到處體現著負載均衡的設計。
上圖是常見的互聯網架構,它的最大特點就是分層,每層可以水平擴展。在上層訪問下層的時候,就會用到用負載均衡技術。
1. 客戶端層 -> 反向代理層
上網的第一步驟,就是解析域名,得到IP,這通過DNS實現。DNS-server對於一個域名,可能配置多個IP,此時的負載均衡是通過DNS輪詢實現的,會輪詢返回IP,保證每個IP訪問是均勻的。這些IP就是Nginx的外網IP。
2.反向代理層 -> 站點層
這一步驟的負載均衡是通過Nginx實現的。通過修改nginx.conf可以配置多種負載均衡策略。
常見的Nginx負載均衡策略有以下三種:
- 輪詢(Round Robin,RR)
- 隨機(Random)
- 權重輪詢(Weighted Round Robin,WRR)
- 最少連接(Least Connections):那個web-server連接少,就路由到哪個web-server
- 源地址哈希(Source hashing):只要IP是均勻的,那麼請求理論上也是均衡的。
3.站點層 -> 服務層
這一步驟的負載均衡,是通過服務連接池實現的。上游連接池會與下游建立多個連接,每次請求會隨機選取一個連接。
4.服務層->數據層:
請求是否均衡取決於數據分布是否均衡。
在數據量很大的時候,數據層(db和cache)會做水平切分。所以數據層的負載均衡,分為數據的均衡和請求的均衡。
數據的均衡是指,水平切分後的每個服務,數據量是差不多的
請求的均衡是指,水平切分後的每個服務,請求量是差不多的。
數據的均衡提現在水平切分的策略上,最常見的有兩種:
A)按照range水平切分
這種切分的優點:
- 實現簡單
- 數據均衡
- 易於擴展
缺點:請求的負載不夠均衡。可能在某個range中服務請求壓力比較大。
B)根據id做哈希
這種切分的優點:
- 實現簡單
- 數據均衡
- 請求均衡
缺點:不易擴展,增加或減少機器,需要rehash,伴隨數據遷移。可以利用一致性哈希來優化這種方案。
5.總結:
客戶端層->反向代理層:DNS輪詢
反向代理層->站點層:Nginx
站點層->服務層:服務連接池
服務層->數據層:請求是否均衡依據數據分布是否均衡,數據層的數據切分方式,常見的有按照範圍水平切分和hash水平切分。
Thanks a million:一分鐘了解負載均衡的一切
推薦閱讀: