LVS,即Linux Virtual Server的簡寫,是目前很是流行的一款實現負載均衡集羣的軟件。該項目在1998年5月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。LVS官網http://www.linuxvirtualserver.org/。html
一、LVS體系架構
LVS負載均衡集羣由三部分組成:最前端的負載均衡層,即Load Balancer;中間的服務器羣組層,即Server Array;最後端的數據共享存儲層,即Shared Storage。在用戶看來,全部的內部應用都是透明的,用戶只是在使用一個虛擬服務器提供的高性能服務。前端
- Load Balancer:位於整個集羣的最前端,由一臺或多臺負載調度器(Director Server)組成,LVS模塊就安裝在Director Server上,Director Server的做用相似於一個路由器,它含有完成LVS功能所須要的路由表,經過這些路由表把用戶的請求分發給Server Array的應用服務器(Real Server)。同時,在Director Server上還要安裝監控模塊Ldirectord,用於監控後端Real Server的健康情況,在Real Server不可用時將其從LVS的路由表中剔除,恢復時從新加入;Director Server是整個LVS的核心,操做系統只支持Linux或FreeBSD,Linux從2.6內核起不用從新編譯就能夠支持LVS功能
- Server Array:由一組實際運行的應用服務器(Real Server)組成,每一個Real Server之間經過高速的LAN或分佈在各地的WAN相連,在實際應用中Director Server也能夠同時兼任Real Server的角色;對於Real Server,能夠是任意平臺的操做系統,如Linux、Windows、AIX等
- Shared Storage:爲全部的Real Server提供共享存儲空間和內容一致性的存儲區域。在物理上,通常由磁盤陣列設備組成;爲了提供內容的一致性,通常能夠經過NFS進行數據共享,但NFS在繁忙的業務系統中性能並非很好,此時能夠採用集羣文件系統,如RedHat的GFS、Oracle的OCFS2等
整個架構具體以下圖所示:linux
二、LVS IP負載均衡機制的實現
負載均衡技術有多種實現方案,如基於DNS域名輪流解析的方法、基於客戶端調度訪問的方法、基於應用層系統負載的調度方法、基於IP地址的調度方法。在這些調度方法中,基於IP地址的方法是執行效率最高的。web
LVS的IP負載均衡技術是經過IPVS模塊來實現的,IPVS是LVS的核心模塊。算法
在LVS中,訪問請求首先通過VIP到達負載均衡調度器,而後由負載均衡調度器從Real Server列表中選取一個Real Server響應用戶的請求。Real Server如何將請求的數據返回給用戶,是IPVS實現的重點,IPVS實現負載均衡的機制有如下幾種:shell
2.一、DR模式
DR即Virtual Server via Direct Routing,使用直接路由技術實現虛擬服務器。VS/DR經過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶端。這種調度方式的性能是最好的。DR模式架構以下圖所示:後端
- DR模式是經過在負載均衡調度器LB上修改數據包的目的MAC地址實現轉發。所以數據包來源地址保持不變,目的地址仍然是VIP
- 請求的報文通過LB,然後端RS響應處理後的報文無需通過LB,所以併發訪問量大時效率很高(與NAT模式相比)
- 由於DR模式經過MAC地址改寫機制實現轉發,所以全部RS和LB只能在一個局域網中
- RS上須要綁定VIP地址到lo接口上,而且須要配置ARP抑制
- RS的默認網關不須要配置成LB,而是直接配置爲上層路由網關,只要能讓RS直接與客戶端通信便可
- 因爲DR模式的LB僅做MAC地址改寫,因此LB就不能改寫目標端口,那麼RS就能使用和VIP相同的端口提供服務
2.二、NAT/FULL NAT模式
NAT,即Virtual Server via Network Address Translation,使用網絡地址翻譯技術實現虛擬服務器。當用戶的請求到達LB時,LB將請求報文的目的地址改爲選定的RS地址,同時將報文的目標端口也改爲選定的RS的相應端口;RS將返回的數據提交給LB,LB再將報文源地址和源端口修改爲VIP和相應的端口後將數據返回給用戶,完成整個負載調度過程。NAT/FULL NAT模式架構以下圖所示:服務器
- NAT模式不須要LB和RS在同一個網段
- NAT模式將請求的報文和響應的報文都通過LB進行轉發和地址改寫,所以訪問量大時,LB有較大的瓶頸,通常一臺LB最多隻能帶10-20臺RS
- 只須要在LB上配置一個公網IP便可
- 每臺RS的網關地址必須是LB的IP
- 支持IP地址和端口的轉換,即前端LB和後端RS提供服務的端口能夠不一致
- LB節點上必須開啓數據轉發功能,不然返回的數據沒法到達客戶端。在Linux下使用如下方法打開數據轉發功能
# 在/etc/sysctl.conf中添加如下內容
net.ipv4.ip_forward = 1 # 值爲0表示不開啓轉發功能,1表示開啓轉發功能
# 修改完成後執行如下命令使配置生效
sysctl -p
FULL NAT與NAT的區別
FULL NAT與NAT的區別主要在對報文的處理方面:網絡
- FULL NAT在客戶端請求VIP時,不只替換了報文中的目的IP,還替換了源IP;VIP返回給客戶端時也替換了源IP
- FULL NAT由於要替換源IP因此性能比NAT降低10%
2.三、TUN模式
TUN,即Virtual Server via IP Tunneling,經過IP隧道技術實現虛擬服務器。LB採用IP隧道技術將用戶的請求轉發到某個RS,RS直接將數據返回給用戶,不須要再通過LB。在TUN模式中,LB與RS不須要在同一個網段;同時LB只處理用戶請求報文,使得集羣吞吐量大大提升。TUN模式架構以下圖所示:架構
- TUN模式中LB和RS之間的傳輸不須要修改報文,而是經過單獨創建的IP隧道傳輸
- TUN模式必須在全部的RS上綁定VIP
- TUN模式使用IP隧道,在增長了運維方面的難度
三、LVS的負載調度算法
LVS的負載調度算法能夠分爲靜態和動態兩種。靜態算法是僅根據算法進行調度,而不考慮後端RS的實際鏈接和負載狀況;動態算法能夠根據後端RS的實際鏈接和負載來進行請求調度。
靜態算法有四種,分別是RR、WRR、DH和SH。
- RR輪詢算法:LB將請求按照順序輪流分配到後端RS,它均等對待後端每一臺RS,適用於後端RS節點處理性能差很少的場景
- WRR加權輪詢算法:LB根據RS的權重分配任務
- DH目的地址哈希調度算法:以目的IP地址爲關鍵字查找一個靜態哈希表來獲取須要的RS
- SH源地址哈希調度算法:以源IP地址爲關鍵字查找一個靜態哈希表來獲取須要的RS
動態算法有六種,分別是LC、WLC、SED、NQ、LBLC和LBLCR
- LC最少鏈接算法:LB將請求動態的調度到已創建鏈接最少的後端RS上。在後端RS性能相近的狀況下適用該算法能夠較好的平衡負載
- WLC加權最少鏈接算法:在LC的基礎上根據權重來將請求動態的調度到後端的RS上,用於在後端RS性能相差較大的環境中
- SED最短延遲調度算法:基於WLC算法。若是ABC三臺RS的權重分別爲一、二、3,則使用SED時會進行如下計算,A - (1+1)/1;B - (2+1)/2;C - (3+1)/3,LB會將請求交給運算結果最小的RS
- NQ永不排隊/最少隊列算法:無需排隊,若是有RS的鏈接數爲0則直接將請求調度給該RS而不進行SED計算
- LBLC基於地址的最小鏈接數調度算法:未來自同一個目的IP地址的請求分配給同一臺RS,若是該RS的負載已滿,則將請求分配給鏈接數最小的RS,並將該RS作爲下一次分配的首選RS
- LBLCR帶複製的基於地址的最小鏈接數調度算法:與LBLC不一樣的是,該算法維護的是從同一個目的IP地址到一組RS的映射,請求的RS會從該組RS中選擇得出
經常使用服務 |
調度算法 |
Web、mali、MySQL |
RR、WLC、WRR |
web cache、DB cache |
LBLC、LBLCR |
防火牆集羣 |
SH、DH |