01 背景
面對大量用戶訪問、高並發請求,單機網站可以從軟硬件兩個方面尋求解決方法:
1、硬件方面:可以使用高性能的服務器、大型數據庫,存儲設備,高性能Web服務器;
2、軟件方面:采用高效率的編程語言(比如Go,Erlang,Scala)等。
但是,當單機容量達到極限時,我們需要考慮業務拆分和分布式部署,來解決大型網站訪問量大,並發量高,海量數據的問題。即需要從架構方面尋求解決方案。
02 概述
負載均衡(Load Balance),意思是將負載(如前端的訪問請求)進行平衡、(通過負載均衡算法)分攤到多個操作單元(服務器,中間件)上進行執行。是解決高性能,單點故障(高可用),擴展性(水平伸縮)的終極解決方案。可以理解為,負載均衡是高可用和高並發共同使用的一種技術。
負載均衡的作用:
1、增加吞吐量,解決並發壓力(高性能);
2、提供故障轉移(高可用);
3、通過添加或減少服務器數量,提供網站伸縮性(擴展性);
4、安全防護(負載均衡設備上做一些過濾,黑白名單等處理)。
03 原理
系統的擴展可分為縱向(垂直)擴展和橫向(水平)擴展。
縱向擴展,是從單機的角度通過增加硬件處理能力,比如CPU處理能力,內存容量,磁盤等方面,實現服務器處理能力的提升,不能滿足大型分布式系統(網站),大流量,高並發,海量數據的問題。因此需要采用橫向擴展的方式,通過添加機器來滿足大型網站服務的處理能力。比如:一台機器不能滿足,則增加兩台或者多台機器,共同承擔訪問壓力。
典型負載均衡架構如下:
軟件負載解決的兩個核心問題是:選誰、轉發。
04 分類
4.1 按照軟硬件
硬件負載均衡
通過F5、A10、Citrix Netscaler等硬件實現負載均衡。
軟件負載均衡
通過LVS、Nginx、HAProxy等軟件實現負載均衡。
4.2 按照實現技術
根據實現技術不同,可分為DNS負載均衡,HTTP負載均衡,IP負載均衡,鏈路層負載均衡等。
DNS負載均衡
最早的負載均衡技術,利用域名解析實現負載均衡,在DNS服務器,配置多個A記錄,這些A記錄對應的服務器構成集群。大型網站總是部分使用DNS解析,作為第一級負載均衡。
優點:
1、使用簡單:負載均衡工作交給DNS服務器處理,不需要專門的服務器維護;
2、提高性能:可以支持基於地址的域名解析,解析成距離用戶最近的服務器地址,可以加快訪問速度。
缺點:
1、可用性差:新增/修改DNS后,解析時間較長;
2、擴展性低:DNS負載均衡的控制權在域名商,擴展性有限。
實踐建議:將DNS作為第一級負載均衡。
IP負載均衡
IP負載均衡,在網絡層通過修改請求目標地址進行負載均衡。
優點:
在內核進程完成數據分發,比在應用層分發性能更好。
缺點:
所有請求響應都需要經過負載均衡服務器,集群最大吞吐量受限於負載均衡服務器網卡帶寬。
鏈路層負載均衡
在通信協議的數據鏈路層修改mac地址,進行負載均衡。
數據分發時,不修改ip地址,指修改目標mac地址,配置真實物理服務器集群所有機器虛擬ip和負載均衡服務器ip地址一致,達到不修改數據包的源地址和目標地址,進行數據分發的目的。
優點:性能好。
缺點:配置復雜。
實踐建議:直接路由(DR)模式最常用。
混合型負載均衡
由於多個服務器群內硬件設備、規模、提供服務等差異,可以考慮給每個服務器群采用最合適的負載均衡方式,然后又在這多個服務器群間再一次負載均衡或群集起來以一個整體向外界提供服務,從而達到最佳的性能,將這種方式稱之為混合型負載均衡。
4.3 按照OSI層次
二層負載均衡
負載均衡服務器對外依然提供一個 VIP(浮動IP),集群中不同的機器采用相同IP地址,但機器的MAC地址不一樣。當負載均衡服務器接受到請求之后,通過改寫報文的目標MAC地址的方式將請求轉發到目標機器實現負載均衡。
三層負載均衡
負載均衡服務器對外依然提供一個VIP,但集群中不同的機器采用不同的IP地址。當負載均衡服務器接受到請求之后,根據不同的負載均衡算法,通過IP將請求轉發至不同的真實服務器。
四層負載均衡
四層負載均衡服務器在接受到客戶端請求后,通過修改數據包的地址信息(IP+端口號)將流量轉發到應用服務器。
七層負載均衡
七層負載均衡工作在OSI模型的應用層,應用層協議較多,常用HTTP、DNS 等。七層負載就可以基於這些協議來負載。比如同一個Web服務器的負載均衡,除了根據IP加端口進行負載外,還可根據七層的URL、瀏覽器類別、語言來決定是否要進行負載均衡。
05 負載均衡算法
負載均衡服務器在決定將請求轉發到具體哪台真實服務器時,是通過負載均衡算法來實現的。負載均衡算法可以分為兩類:靜態負載均衡算法和動態負載均衡算法。
靜態負載均衡算法包括:輪詢、比率、優先權。
動態負載均衡算法包括:最少連接數、最快響應速度、觀察方法、預測法、動態性能分配、動態服務器補充、服務質量、服務類型、規則模式。
5.1 輪詢
輪詢(Round Robin):順序循環將請求一次順序循環地連接每個服務器。以輪詢的方式依次請求調度不同的服務器;實現時,一般為服務器帶上權重。
優點:服務器請求數目相同;實現簡單、高效;易水平擴展。
缺點:服務器壓力不一樣,不適合服務器配置不同的情況;請求到目的結點的不確定,造成其無法適用於有寫操作的場景。
應用場景:數據庫或應用服務層中只有讀的場景。
5.2 比率(Ratio)
給每個服務器分配一個加權值為比例,根椐這個比例,把用戶的請求分配到每個服務器。
5.3 優先權(Priority)
給所有服務器分組,給每個組定義優先權。當最高優先級中所有服務器出現故障,將請求送給次優先級的服務器組。這種方式,實際為用戶提供一種熱備份的方式。
5.4 最少連接
將請求分配到連接數最少的服務器(目前處理請求最少的服務器)。
優點:根據服務器當前的請求處理情況,動態分配;
缺點:算法實現相對復雜,需要監控服務器請求連接數;
5.5 最快模式(Fastest)
傳遞連接給那些響應最快的服務器。
5.6 觀察模式(Observed)
連接數目和響應時間這兩項的最佳平衡為依據為新的請求選擇服務器。
5.7 預測模式(Predictive)
利用收集到的服務器當前的性能指標,進行預測分析,選擇一台服務器在下一個時間片內,其性能將達到最佳的服務器相應用戶的請求。
5.8 動態性能分配(Dynamic Ratio-APM)
根據收集到的應用程序和應用服務器的各項性能參數,動態調整流量分配。
5.9 動態服務器補充(Dynamic Server Act)
當主服務器群中因故障導致數量減少時,動態地將備份服務器補充至主服務器群。
5.10 服務質量(QoS)
按不同的優先級對數據流進行分配。
5.11 服務類型(ToS)
按不同的服務類型(在 Type of Field 中標識)負載均衡對數據流進行分配。
5.12 規則模式
針對不同的數據流設置導向規則,用戶可自行設置。
06 負載均衡方案
6.1 硬件方案
采用硬件的方式實現負載均衡,一般是單獨的負載均衡服務器,價格昂貴,常用的有:F5、A10、Citrix Netscaler。
優點:
1、硬件負載均衡穩定性更強,雙機或集群的效果更佳,可以應對高並發、高吞吐的網絡環境中。
2、在策略配置方面,可以實現深度的健康檢查方法,而不是簡單的ping或tcp的方式,而是可以針對業務層進行健康檢查,整體的策略調度更靈活、配置更方便,在七層負載方面更具優勢。
缺點:
1、價格昂貴;
2、擴展能力差,無法進行擴展和定制;
3、調試和維護比較麻煩,需要專業人員。
選擇:
核心系統必須使用硬件負載均衡設備;
測試系統和一般系統可以使用軟件負載均衡設備。
6.2 軟件方案
硬件負載均衡價格昂貴,在實際應用中遠不如軟件負載均衡普遍。常用的軟件負載均衡軟件有Nginx、LVS、HaProxy、ats、perlbal、pound等。
Nginx/LVS/HAProxy是目前使用最廣泛的三種負載均衡軟件。
對比:
LVS:是基於四層的轉發(只能做端口轉發,不能做基於URL、目錄的轉發)
HAproxy:是基於四層和七層的轉發,是專業的代理服務器
Nginx:是WEB服務器,緩存服務器,又是反向代理服務器,可以做七層的轉發
選擇:
1、HAproxy和Nginx可做七層轉發,URL和目錄轉發都可以;
2、中小型企業推薦使用HAproxy(配置簡單);
3、在很大並發量的時候選擇LVS。
07 網絡分層負載均衡架構
互聯網領域對於負載均衡的架構是隨着網站規模提升不斷演進的,大致分為如下幾個階段:
第一階段:利用Nginx或HAProxy進行單點的負載均衡,該階段服務器剛從單機向集群轉變,需要在七層做轉發。
第二階段:隨着網絡規模擴大,Nginx單點瓶頸突出,這時使用LVS或者商用Array就是首要選擇,Nginx此時就作為LVS或者Array的節點來使用,具體LVS或Array的是選擇是根據公司規模和預算來選擇。
第三階段:這時網絡服務已經成為主流產品,此時隨着公司知名度也進一步擴展,相關人才的能力以及數量也隨之提升,這時無論從開發適合自身產品的定制,以及降低成本來講開源的LVS,已經成為首選,這時LVS會成為主流。
常見互聯網分布式架構可分為用戶層、反向代理層、Web站點層、業務服務層、數據存儲層。互聯網分層架構:
每層之間交互都有相應的負載均衡方案:
客戶端層->反向代理層:DNS輪詢。
反向代理層->Web站點層:Ngnix(均衡策略:請求輪詢/最少連接路由/IP哈希)。
Web站點層->業務服務層:連接池。
業務服務層->數據存儲層:數據分片,讀寫分離。