lvs是linux內核級的負載均衡解決方案,作為netfilter的補充套件,其工作在INPUT hook上。
相比nginx等負載均衡解決方案的差異如下:
lvs工作于內核空間,不受用戶空間套接字和端口數量的限制,而且所有調度工作在內核空間完成,效率更高;
nginx為七層負載均衡器,雖然通過stream模塊也可以做到四層負載均衡,但是受到套接字數量限制,而且性能不如lvs;
此文章只討論lvs的四種調度類型和調度算法。
一、lvs集群的類型:
在介紹lvs類型工作原理之前先引入如下概念:
-
CIP:客戶端ip地址
-
RIP:后端服務器ip地址
-
VIP:lvs負載均衡器面向客戶端的ip地址
-
DIP:lvs負載均衡器面向后臺服務器的ip地址
-
VS:lvs負載均衡器
-
RS:后端提供服務的服務器
lvs集群分為如下4種類型:
-
lvs-nat
-
lvs-dr
-
lvs-tun
-
lvs-fullnat
分別詳細介紹4種類型的工作原理:
-
lvs-nat工作原理介紹:
通過名字大概也可以看出來,此類型和iptables的dnat類型很相似。不過iptables的dnat只能把訪問某地址的請求轉發到某一臺特定的服務器。而lvs-nat卻可以通過調度算法把用戶請求轉發至后臺的服務器集群中的某一臺,所以lvs-nat可以理解為面向多目標的dnat。
其工作原理如下:
client請求vs的vip –> 數據到達INPUT鏈 –> 源ip保持不變,匹配lvs規則,目標ip通過調度算法變為后臺某一臺RS的RIP –> 后臺RS發起響應報文(源地址為RIP,目的地址為DIP) –> VS把數據包發送給客戶端(源地址VIP,目標地址CIP)
-
lvs-dr工作原理介紹:
lvs-nat存在一個問題:所有的請求和響應報文都需要經過負載均衡器做轉發,這樣會導致負載均衡器壓力過大,而且效率不高。所以如果能夠讓后臺服務器直接響應客戶端效率會提高不少。因此誕生了lvs-dr的方式。lvs-dr會在請求報文再封裝一個MAC地址首部用于同一網段通信,而且所有的RS都需要配置VIP的地址。
所有RS都配置vip則會存在ip地址沖突,所有需要如下方法解決:
-
在前端網關做靜態地址綁定,不夠靈活,不可取;
-
通過arptable做配置,過于繁瑣;
-
通過修改linux內核參數來禁止相同ip的網卡做arp的通告和回應;
lvs-dr的負載均衡器和后臺服務器位于同一網段,其工作過程如下:
客戶端發送請求報文到負載均衡器(源ip:CIP,目標ip:vip)–> 負載均衡器在請求報文封裝MAC首部,源MAC為dip,目標MAC為某一臺RS,源ip和目標ip和端口都保持不變 –> RS通過本機vip地址給客戶端發送響應報文。
-
-
lvs-tun工作原理:
當RS分布于不同地點的多個機房的時候lvs負載均衡器則無法完成工作的調度,所有需要lvs-tun來進行工作。
注意:
lvs-tun的所有RS也都需要配置VIP用于發送響應報文。
lvs-tun是在請求報文又封裝了一層ip報文用于隧道傳輸,工作方法如下:
客戶端發送請求到lvs負載均衡器(源ip:CIP,目標ip:VIP)–> 通過調度算法選定一臺公網上的RS,然后在請求報文外再封裝一層ip首部,源ip為DIP,目標IP為RIP –> RS接收到報文,拆包得到原始請求報文(源ip:CIP,目標ip:VIP),然后用本機的VIP發送響應報文到CIP完成通信。
-
lvs-fullnat工作原理:
lvs-fullnat不是lvs內置的一種調度機制,需要編譯安裝。lvs-fullnat會修改報文的源ip和目標ip,也可以用于公網通信。
工作原理如下:
客戶端發送請求到lvs(源ip:CIP,目標ip:VIP)–> lvs根據調度機制發送報文到挑選的RS(源ip:DIP,目標IP:RIP)–> RS發送響應報文(源IP:RIP,目標IP:DIP)–> lvs轉發響應報文到客戶端(源IP:VIP,目標ip:CIP)–> 通信完成。
二、lvs調度算法
lvs調度算法按照是否計算后臺服務器的負載分為動態方法和靜態方法:
靜態方法:
-
RR:輪詢
-
WRR:加權輪詢,根據服務器的權重去做輪詢
-
SH:用于session保持,將來自同一ip的請求都發往該ip第一次請求的RS,用于保持會話;
-
DH:發送到同一目的地址的請求都發送到指定的RS服務器,常用于正向代理的緩存場景。如:一個企業有兩條外網線路,每個外網線路的網關都有緩存,如果采用輪詢機制通過兩個網關進行網絡訪問,則網關緩存命中率太低,所有把發往某一指定目標ip的所有請求都發送到指定的網關則提高網關緩存命中率。
動態方法:
-
LC:最少連接,把請求發送給連接最少的服務器,公式:Overhead=activeconns*256+inactiveconns
-
WLC:加權最少連接,按照服務器權重和服務器的連接數分配連接。但是,如果兩臺服務器連接都為0,則按照輪詢,權重高的服務器無法發揮最佳效率,公式:Overhead=(activeconns*256+inactiveconns)/weight
-
SED:最短延遲,當連接都為0的時候,優先由權重高服務器的來處理。但是如果權重相差較大,則權重低的服務器則會閑置。公式:Overhead=(activeconns+1)*256/weight
-
NQ:never queue,永不排隊,如果負載一直,則到來的請求按照權重從大到小每個都分配一個負載。之后再按照SED算法進行工作。
-
LBLC:動態DH算法,新到來的未綁定的請求按照服務器負載來進行調度綁定。
-
LBLR:帶復制功能的LBLC算法,即緩存復
原創文章,作者:王子豪,如若轉載,請注明出處:http://www.www58058.com/78527