LVS詳解
LVS(Linux Virtual Server),意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。
LVS 是一個工作在四層的負載均衡器,實現和 iptables/netfilter 類似,工作在內核空間的 TCP/IP 協議棧上,LVS 工作在 INPUT Hook Funtion 上,並在 INPUT 設置附加規則,一旦客戶端請求的是集羣服務,LVS 會強行修改請求報文,將報文發往 POSTROUTING,轉發至後端的主機。
LVS的組成:
ipvsadm:管理集羣服務的命令行工具,工作於用戶空間
ipvs:爲lvs提供服務的內核模塊,工作於內核空間INPUT鏈上,所以lvs與iptables在INPUT鏈不能同時使用。
在linux內核2.4.23之前的內核中模塊默認是不存在的,需要自己手動打補丁,然後把此模塊編譯進內核纔可以正常使用。
目標
使用集羣技術和Linux操作系統實現一個高性能、高可用的服務器。
很好的可伸縮性
很好的可靠性
很好的可管理性
集羣分類:
負載均衡集羣LB: Load balancing clusters
通過一個或者多個前端負載均衡器,將工作負載分發到後端的一組服務器上,從而達到整個系統的高性能和高可用性。
高可用性集羣HA: High-availability (HA) clusters
一般指當集羣中某個節點失效時,其上的任務會自動轉移到其他正常的節點上。
高性能計算集羣HP: High-performance (HPC) clusters
將計算任務分配到集羣的不同計算節點而提高計算能力,因而主要應用在科學計算領域。
集羣常用術語:
Director:複製調度集羣的主機
VIP:Virtual IP,向外提供服務的IP
RIP:real IP,內部真實提供服務的主機IP
DIP:向內部的IP通信的IP,在Director主機上
CIP:客戶端IP
LVS工作模型:
LVS-NAT:修改請求報文的目標IP
地址轉換類型,主要是做目標地址轉換,類似於iptables的DNAT
LVS 修改請求報文的目標地址爲 RIP,轉發至後端的 RealServer,並修改後端響應報文的源地址爲 VIP,響應至客戶端。
特性:
集羣節點跟 Director 必須在同一個 IP 網絡中,並且其網關需要指向DIP的地址
RIP地址通常爲私有地址,僅用於各個集節點之間通信
Director位於client和Real Server之間,處理進出所有報文,大型應用易成爲瓶頸。
Real Server必須將網關指向DIP
支持端口映射
.
LVS-DR:操縱封裝新的MAC地址;默認類型
直接路由,爲請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;
每個Real Server上都有兩個IP:VIP和RIP,VIP是隱藏的,不會接收請求,用來做請求響應的源IP
Director上只需要一個網卡利用別名配置兩個IP:VIP和DIP
特性:
保證前端路由器將目標地址爲 VIP 的報文通過 ARP 解析後送往 Director。
靜態綁定:在前端路由將 VIP 對應的目標 MAC 地址靜態配置爲Director VIP 接口的 MAC 地址。
arptables:在各 Realserver 上,通過 arptables 規則拒絕其響應對 VIP 的 ARP 廣播請求
修改內核參數:在 Realserver 上修改內核參數,限制arp通告及應答級別
各RIP 必須與 DIP 在同一個物理網絡中
RS 的 RIP 可以使用私有地址,也可以使用公網地址,Realserver 不能將網關指向 DIP
Director 僅負責處理入站請求,響應報文由 Realserver 直接發往客戶端
不支持端口映射
.
LVS-TUN:在原請求IP報文之外新加一個IP首部;
轉發方式:在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;
Real Server接收到請求以後,先拆除第一層封裝後拆除第二層封裝,然後把響應數據直接傳輸給Client
特性:
集羣節點可以跨越Internet
Director的VIP和RIP必須爲公網IP
Director僅處理入站請求,響應報文則由Real Server直接發往客戶端
Real Server的網關不能指向Director
Real Server 需支持隧道協議
不支持端口映射
.
LVS-FULLNAT:同時修改請求報文的源和目標IP;默認不支持
特點:
RIP,DIP 可以使用私有地址
RIP 和 DIP 可以不再同一網絡中,且 RIP 的網關不需要指向 DIP
支持端口映射
請求和響應報文都經由 Director
LVS調度算法
靜態調度算法:只根據算法進行調度 不考慮後端服務器的實際連接情況和負載情況
rr:round robin,輪詢,簡單在各主機間輪流調度
wrr:weighted round robin,加權輪詢,根據各主機的權重進行輪詢
sh:source hash,源地址哈希,對客戶端地址進行哈希計算,保存在 Director 的哈希表中,一段時間內,同一個客戶端 IP 地址的請求會被調度至相同的 Realserver。實現 session affinity(會話綁定),一定程度上損害了負載均衡的效果。
dh:destination hash,和 sh 類似,dh 將請求的目標地址進行哈希,將相同目標 IP 的請求發送至同一主機。當 Realserver 爲透明代理緩存服務器時,提高緩存的命中率。
動態調度算法:根據各RS當前負載狀態及調度算法進行調度
lc:least connted,最少連接,根據 overhead = active*256 + inactive 計算負載狀態,每次選擇 overhead 最小的服務器
wlc:weighted lc,默認,加權最少連接,根據 overhead = (active*256+inactive)/weight 來計算負載,每次選擇 overhead 最小的服務器,
sed:shortest expected delay,最短期望延遲,不對 inactive 狀態的連接進行計算,根據 overhead = (active+1)*256/weight 計算負載,選擇 overhead 最小的服務器進行調度
nq:never queue,當有空閒服務器時,直接調度至空閒服務器,所有服務器都繁忙時,使用 SED 算法進行調度
LBLC:locality based least connection,基於本地的最少連接,相當於 dh + wlc,正常請求下使用 dh 算法進行調度,如果服務器超載,則使用 wlc 算法調度至其他服務器
LBLCR:locality based least connection with replication,基於本地的帶複製功能的LBLC,判斷後端連接數,當A的連接很多,而B的很空閒,會將A的部分連接分配到B上,避免大範圍不公平。主要用於Cache 集羣系統
ipvsadm/ipvs
集羣服務管理:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A|E VIP
添加修改服務地址
-D -t|u|f VIP
刪除集羣
-t|u|f
類型: tcp | udp | 防火牆標記
-s scheduler
指定集羣調度算法,默認wlc
RS管理:
ipvsadm -a|e -t|u|f VIP -r RIP [-g|i|m] [-w weight]
添加修改RS
-g|i|m
lvs模型: DR | TUN | NAT 默認DR
-w weight
指定權重
清空定義: ipvsadm -C
查看: ipvsadm -ln
保存和重載: ipvsadm -S = ipvsadm-save
ipvsadm -R = ipvsadm-restore
示例:
ipvsadm -A -t 10.1.235.55:80 -s wrr
ipvsadm -a -t 10.1.235.55:80 -r 10.1.235.6 -g -w 2
ipvsadm -a -t 10.1.235.55:80 -r 10.1.235.7 -g -w 3