lvs之排程演算法和叢集型別
LVS
LVS:Linux Virtual Server,是以“軟體”、通過“四層”排程、實現“負載均衡”。
軟體方式實現叢集: lvs軟體是Linux核心中的一個框架,以模組方式載入。
四層排程: lvs工作於通訊子網(核心中),即可檢測“請求報文”中各層“首部”獲取“目標實體地址”、“目標邏輯地址”、“目標傳輸層協議型別及埠”。但對於“應用層”無能為力。
負載均衡: lvs實現的是負載均衡叢集,即將收到的“請求報文”使用“排程演算法”計算,再發送至後端的RS伺服器。
排程演算法
一共10中,又根據是否考慮後端RS的“負載情況”,分為“靜態方法”和“動態方法”。
- 靜態演算法:僅根據演算法本身和請求報文特徵進行排程,起點公平
- 動態演算法:需要額外考慮後端各RS的當前的負載狀態,結果公平
靜態方法
rr :round-robin,輪替,輪詢。
排程器將RS列個表(陣列),依次將收到的請求報文傳送至RS。
舉個栗子吧:一個老師(lvs),12顆糖(請求報文),3個孩子(RS),每個孩子一個碗(陣列元素)。老師怎發糖呢?RS1的碗發一顆,RS2的碗發一顆,RS3的碗發一顆。還有糖,繼續按照上面的順序發。
wrr :weighted rr,加權輪詢。
方法同rr,並根據RS的效能賦予不同的權重。依據權重,RS在列表(陣列)中出現不同的次數。
還是舉個栗子:還是老師發糖,還是發到碗。但是有個孩子有3個碗,所以他就到了3顆糖。
SH :Source Hashing,源地址雜湊。
將源地址進行雜湊運算後取模,以確定傳送至哪個RS。實現了session sticky,將來自於同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話繫結。
DH :Destination Hashing,目標地址雜湊。
將目標地址進行雜湊運算後取模,以確定傳送至哪個RS。將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理快取場景中的負載均衡。
動態方法
LC :least connections,最少連結
根據連線數計算負載。
Overhead=activeconns*256+inactiveconns
活動連結非活動連線的負載肯定不同。預設活動連結的負載是非活動連線的256倍。
WLC :Weighted LC,加權的最少連結
同LC,並根據RS伺服器效能賦予權重。
Overhead=(activeconns*256+inactiveconns)/weight
問題:雖然加權,但還是會出現負載一樣的情況,導致排程時將請求傳送至權重小的RS。例如:剛開啟服務,連線數均為0,計算結果為0。
SED :Shortest Expection Delay,最短期望延遲
為了克服WLC的缺點。不考慮非活動連結數,活動連結數+1。避免了連線數為0時,負載一樣。
Overhead=(activeconns+1)*256/weight
新的bug:當各RS權重差距非常大時,請求報文會一直被排程至權重大的RS,因為計算得到的負載小。例如:2臺RS權重比1:9,
RS1的負載:(0+1)*256/1 = 1/256 RS2的負載:(8+1)*256/9 = 1/256
當RS2被分得8個請求後,2個RS的負載才一樣,此前RS1一直處於空閒。
NQ :Never Queue,永不排隊
先每個RS分一個請求,再SED。改進的sed。
LBLC :Locality-Based LC,基於區域性性的最少連線
動態的DH演算法,DH+LC
此演算法是根據請求報文的目標ip地址的負載均衡排程,將相同的目標ip地址的請求排程到同一個伺服器。若該rs可用,將傳送請求;若該伺服器不可用,則用最少連線的原則選出一臺可用伺服器來進行匹配。
LBLCR :LBLC with Replication,帶複製功能的LBLC
此種演算法是針對目標ip地址的負載均衡,該演算法根據請求的目標地址ip找出該地址對應的服務組,按最少連線的原則從服務組中選出一臺伺服器。
若伺服器沒有超載,則傳送請求到該伺服器;若該伺服器超載或者不可用,則按照最小連線的原則從這個叢集中選出一臺伺服器。
將該伺服器新增到服務組中,在將請求傳送到該伺服器,同時當該伺服器組中有一段時間沒有被修改,將最忙的伺服器從組中剔除,以降低複製的程度。
排程演算法生產環境選型
未完待續... ...
lvs叢集型別中的術語:
LVS叢集術語 | 說明 |
---|---|
vs | Virtual Server、Director、Dispatcher、Balancer |
rs | Real Server、upstream server、backend server |
CIP | Client IP |
VIP | Virtual serve IP |
RIP | Real server IP |
DIP | Director IP |
CIP ←-> VIP == DIP ←-> RIP
graph LR C(Client - CIP) D(VIP - Dispatcher - DIP) RS(RIP - Real Server) C --- D D --- RSLVS叢集的型別
工作拓撲、轉發機制
LVS叢集的型別
LVS叢集的型別 | 說明 |
---|---|
lvs-nat | 多目標DNAT。通過修改請求的目標IP和(或)Port為經由排程演算法挑選出的某後端RS的RIP和PORT。 |
lvs-dr | 封裝新的MAC地址。通過在原IP報文外封裝幀首部(源MAC、目標MAC),目標MAC是由排程演算法挑選出的某後端RS的MAC地址。 |
lvs-tun | IP隧道。通過在源IP報文(CIP VIP)外再封裝一個新IP首部(DIP RIP)完成排程。 |
lvs-fullnat | 修改請求報文的源和目標IP。通過修改請求的源IP(CIP --> DIP)目標IP(VIP --> RIP)完成排程。 |
lvs-nat
多目標IP的DNAT,通過將請求報文中的目標地址和目標埠修改為某挑出的RS的RIP和PORT實現轉發;
特性
RIP和DIP必須在同一個IP網路,且應該使用私網地址;RS的閘道器要指向DIP;
請求報文和響應報文都必須經由Director轉發;Director易於成為系統瓶頸;
支援埠對映,可修改請求報文的目標PORT;
vs必須是Linux系統,rs可以是任意系統;
lvs-dr
Direct Routing,直接路由;
通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的介面的MAC,目標MAC是某挑選出的RS的RIP所在介面的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;
Director和各RS都得配置使用VIP;
特性
確保前端路由器將目標IP為VIP的請求報文發往Director:
(a) 在前端閘道器做靜態繫結;
(b) 在RS上使用arptables;
(c) 在RS上修改核心引數以限制arp通告及應答級別;
arp_announce arp_ignore
RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網路;RIP的閘道器不能指向DIP,以確保響應報文不會經由Director;
RS跟Director要在同一個物理網路;
請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client;
不支援埠對映;
lvs-tun
轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP);
特性
DIP, VIP, RIP都應該是公網地址;
RS的閘道器不能,也不可能指向DIP;
請求報文要經由Director,但響應不能經由Director;
不支援埠對映;
RS的OS得支援隧道功能;
問題:因在IP報文外面再封裝IP頭,會造成幀大於MTU,導致分片。
lvs-fullnat
通過同時修改請求報文的源IP地址和目標IP地址進行轉發;
CIP <--> DIP
VIP <--> RIP
特性
VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網路;因此,RIP的閘道器一般不會指向DIP;
RS收到的請求報文源地址是DIP,因此,只能響應給DIP;但Director還要將其發往Client;
請求和響應報文都經由Director;
支援埠對映;
注意:此型別預設不支援;
graph LR C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1 - VIP) RS2(RIP - Real Server 2 - VIP) R((Router)) C -- 請求報文 源CIP目的VIP --> R R -- 請求報文 --> D D -- 排程轉發 源DIP目的RIP --> RS1 D -- 排程轉發 源DIP目的RIP --> RS2 graph RL C(Client - CIP) D(VIP - Dispatcher - DIP) RS1(RIP - Real Server 1 - VIP) RS2(RIP - Real Server 2 - VIP) R((Router)) RS1 -- 響應報文 源RIP目的DIP --> D RS2 -- 響應報文 源RIP目的DIP --> D D -- 響應轉發 源VIP目的CIP --> R R -- 響應轉發 --> C總結:
- lvs-nat, lvs-fullnat:請求和響應報文都經由Director;
- lvs-nat:RIP的閘道器要指向DIP;
- lvs-fullnat:RIP和DIP未必在同一IP網路,但要能通訊;
- lvs-dr, lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client;
- lvs-dr:通過封裝新的MAC首部實現,通過MAC網路轉發;
- lvs-tun:通過在原IP報文之外封裝新的IP首部實現轉發,支援遠距離通訊;