結合圖形描述LVS的工作原理
LVS簡介
LVS(Linux Virtual Server,虛擬服務器),是一個虛擬的四層路由交換服務器集群系統,根據調度算法將請求報文的目標IP和目標PORT將其轉發至后端主機集群中的某臺服務器。項目是由章文嵩博士于1998年5月成立,是中國國內最早的自由軟件項目之一。
在2B、2C的業務中,面對快速增長的訪問,服務器需要具備處理這種大量并發訪問服務的能力,對于單臺服務器來講,CPU、I/O處理能力很會成為瓶頸,即使對硬件進行升級,單臺服務器的性能總是有上限的,處理能力不會一直隨著硬件配置的升級而一直線性提升。因此,必須采用集群技術來解決大量并發的應用場景。Linux虛擬服務器(Linux Virtual Servers,LVS)使用負載均衡技術將多臺服務器組成一個虛擬服務器。
LVS相關術語
VS |
Virtual Server |
虛擬服務器,Balancer負載均衡器 |
RS |
Real Server |
后端真實服務器 |
CIP |
Client IP |
客戶端請求IP |
VIP |
Director Virtual IP |
負載均衡器(前端)虛擬IP |
DIP |
Directior IP |
|
RIP |
Real Server IP |
后端真實服務器IP |
NAS |
Network Attached Storage |
網絡附加存儲(文件共享服務器) |
SAN |
Storage Area Network |
存儲區域網絡(塊級別) |
DS |
Distributed Storage |
分布式存儲 |
LB |
Load Balancing |
負載均衡(增加處理能力) |
HA |
High Availability |
高可用(始終在線,增加服務可用性) |
HP |
High Performance |
高性能 |
NAT |
Network Address Translator |
網絡地址轉換 |
DR |
Direct Routing |
直接路由 |
TUN |
IP Tunneling |
IP隧道模型 |
RR |
Round Robin |
輪詢調度 |
WRR |
Weight RR |
加權輪詢 |
NTP |
Network Time Protocol |
用時間服務器同步時間 |
LVS工作原理與結構
LVS屬于集群中的層次
1,Hardware負載均衡設備
F5、BIG IP、Citrix、Netscaler、A10
2,Software軟件負載均衡
四層
LVS
七層
nginx
haproxy
LVS的設計要點
1,session保持
2,數據共享
1>,共享存儲
NAS
SAN
DS
2>,數據同步
LVS的結構
LVS由前端的負載均衡器(Load Balancer,LB)和后端的真實服務器(Real Server,RS)群組成。RS間可通過局域網或廣域網連接。LVS的這種結構對用戶是透明的,用戶只能看見一臺作為LB的虛擬服務器(Virtual Server),而看不到提供服務的RS群。當用戶的請發往虛擬服務器,LB根據設定的包轉發策略和負載均衡調度算法將用戶請求轉發給RS。RS再將用戶請求結果返回給用戶。
LVS內核模型
1>,當客戶端的請求到達負載均衡的內核空間時,首先會到達PREROUTING鏈。
2>,當內核發現請求數據包的目的地址是本機時,將數據包送往INPUT鏈。
3>,LVS由用戶空間的ipvsadm和內核空間的IPVS組成,ipvsadm用來定義規則,IPVS利用ipvsadm定義的規則工作,IPVS工作在INPUT鏈上,當數據包到達INPUT鏈時,首先會被IPVS檢查,如果數據包里面的目的地址及端口沒有在規則里面,那么這條數據包將被放行至用戶空間。
4>,如果數據包里面的目的地址及端口在規則里面,那么這條數據報文將被修改目的地址為事先定義好的后端服務器,并送往POSTROUTING鏈。
5>,最后經由POSTROUTING鏈發往后端服務器。
注:LVS是工作在內核中的。
LVS工作在INPUT鏈上。
LVS和iptables不能同時使用。
ipvs工作在內核中。
ipvsadm工作在用戶模式中,管理集群服務的命令行工具
VIP是公網地址;RIP和DIP是私網地址,且可以不在同一IP網絡,但需要通過路由相互通信;
RS收到的請求報文的源IP是DIP,因此其響應報文將發送給DIP;
LVS的包轉發模型
1、NAT模型
多目標的DNAT,通過將請求報文的目標地址和目標端口修改為挑選出某RS的RIP和PORT來實現。
1>,客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP(客戶端IP),后面統稱CIP,目標地址為VIP(負載均衡前端地址,后面統稱為VIP)。
2>,負載均衡收到報文后,發現請求的是在規則里面存在的地址,那么它將客戶端請求報文的目標地址改為了后端服務器的RIP地址并將報文根據算法發送出去。
3>,報文送到Real Server后,由于報文的目標地址是自已,所以會響應該請求,并將響應報文返還給LVS。
4>,然后lvs將些報文的源地址修改為本機并發送給客戶端。
注:在NAT模式中,Real Server的網關必須指向LVS,否則報文無法送達客戶端。
注: 集群節點跟director必須在同一個IP網絡中;
RIP通常是私有地址,僅用于各集群節點間的通信;
director位于client和real server之間,并負責處理進出的所有通信;
real server必須將網關指向DIP;
支持端口映射(轉發);
real server可以使用任意OS;
請求和響應報文都要經過director轉發,在較大規模應用場景中,director易成為系統瓶頸;
2、DR模型
通過修改請求報文的MAC地址進行轉發,IP首部不會發生變化(源IP為CIP,目標IP始終為VIP)。
1>,客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址為VIP。
2>,負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將客戶端請求報文的源MAC地址改為自已的DIP的MAC地址,并將此包發送給RS。
3>,RS發現請求報文中的目的MAC是自已,就會將次報文接收下來,處理完請求報文后,將響應報文通過lo接口送給eth0網卡直接發送給客戶端。
注意:需要設置lo接口的VIP不能響應本地網絡內的arp請求。
問題:怎樣確保前端路由器將目標IP為VIP的請求報文一定會發送給Director?
解決:
1),靜態綁定;
2),禁止RS響應VIP的ARP請求;
a),arptables上定義;
b),修改各RS的內核參數,并把VIP配置在特定的接口上實現禁止其響應;
kernel parameter:
arp_ignore:定義接收到ARP請求時的響應級別;
0: 只要本地配置的有相應地址,就給予響應;
1: 僅在請求的目標地址配置請求到達的接口上的時候,才給予響應;
arp_announce:定義將自已地址向外通告時的級別;
0:將機機任何接口上的任何地址向外通告;
1:試圖僅向目標網絡通告與其網絡匹配的地址;
2:僅向與本地接口上地址匹配的網絡進行通告;
Arp協議:ip地址在局域網內無法進行通信,最終局域網內兩臺主機通信還是通過MAC地址,所以就是涉及ip到MAC地址轉換的問題。
注意:集群節點RS跟director必須在同一個物理網絡中;
RS的RIP可以使用私有地址或公網地址,實現便捷的遠程管理和監控;RIP使用私有地址可以通過在之前加一個路由器的方式和外網通信,直接響應客戶機。
Director僅負責處理入站請求,響應報文則由real server直接發往客戶端;即請求報文必須由Director調試,但響應報文必須不能經由Director。
real server不能將網關指向DIP;(直接使用前端網關)
不支持端口映射;
3、TUN模型
不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在原有的IP首部之外再次封裝一個IP首部(源IP為DIP,目標IP為RIP)。
1>,客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址為VIP。
2>,負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將在客戶端請求報文的首部再封裝一層IP報文,將源地址改為DIP,目標地址改為RIP,并將些包文發送給RS。
3>,RS收到請求報文后,會首先拆開第一層封裝,然后發現里面還有一層IP首部的目標地址是自已lo接口上的VIP,所以會處理次請求報文,并將響應報文通過lo接口送給eth0網卡直接發送給客戶端。
注意:需要設置lo接口的VIP不能在公網上。
請求時,對報文再進行一次封裝;返回時,直接返回。
集群節點可以跨越互聯網Internet;
RIP必須是公網地址;
director僅負責處理入站請求,響應報文由real server直接發往客戶端;
響應報文一定不能通過director即real server網關不能指向director;
只有支持隧道功能的OS才能用于real server;
不支持端口映射;
LVS的調度算法
LVS的調度算法分為靜態與動態兩類。
靜態算法
靜態算法(4種):只根據算法進行調度 而不考慮后端服務器的實際連接情況和負載情況
①.RR:輪詢調度(Round Robin)
調度器通過”輪詢”調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載?輪詢機制,依次分配請求,方式簡單但是負載均衡的效果一般。
②.WRR:加權輪詢(Weight RR)
調度器通過“加權輪詢”調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,并動態地調整其權值。加權輪詢,權重越大承擔的負載就越大。
③.DH:目標地址哈希(Destination ip Hash ) 能實現連接追蹤,但不考慮負載均衡效果。
將同一個請求發給同一個Server;Hash的是目標地址。
例:客戶A訪問了內容A,是server1處理的,這時客戶B也訪問了內容A,這時也會被指定到Server1處理。
④.SH:源地址 hash(Source ip Hash)
源地址哈希,將來自同一個ip請求通過記錄在ip hash表中綁定在同一個服務器,實現session保持?
缺點:調度粒度大,對負載均衡效果差。
例:這個源地址訪問是服務器A響應的,以后只要是這個源地址發的請求,都會是服務器A響應。
動態算法
動態算法(6種):前端的調度器會根據后端真實服務器的實際連接情況來分配請求
①.LC:最少鏈接(Least Connections)
調度器通過”最少連接”調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用”最小連接”調度算法可以較好地均衡負載。
小結:最小連接;OverHead=activity*256+inactive;結果最小的將會被挑中;
②.WLC:加權最少連接(默認采用的就是這種)(Weighted Least Connections)
在集群系統中的服務器性能差異較大的情況下,調度器采用“加權最少鏈接”調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載?調度器可以自動問詢真實服務器的負載情況,并動態地調整其權值。
小結:加權最少連接;(activity*256+inactive)/weight;誰的小挑誰;
③.SED:最短延遲調度(Shortest Expected Delay )
在WLC基礎上改進,Overhead = (ACTIVE+1)*256/加權,不再考慮非活動狀態,把當前處于活動狀態的數目+1來實現,數目最小的,接受下次請求,+1的目的是為了考慮加權的時候,非活動連接過多缺陷:當權限過大的時候,會倒置空閑服務器一直處于無連接狀態。
小結:最短期望延遲;(active+1)*256/weight;
④.NQ永不排隊/最少隊列調度(Never Queue Scheduling NQ)
無需隊列。如果有臺 realserver的連接數=0就直接分配過去,不需要再進行sed運算,保證不會有一個主機很空間。在SED基礎上無論+幾,第二次一定給下一個,保證不會有一個主機不會很空閑著,不考慮非活動連接,才用NQ,SED要考慮活動狀態連接,對于DNS的UDP不需要考慮非活動連接,而httpd的處于保持狀態的服務就需要考慮非活動連接給服務器的壓力。
小結:永不排隊。
⑤.LBLC:基于局部性的最少鏈接(locality-Based Least Connections)
基于局部性的最少鏈接”調度算法是針對目標IP地址的負載均衡,目前主要用于Cache集群系統?該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器?
小結:基于本地的最少連接。
⑥. LBLCR:帶復制的基于局部性最少連接(Locality-Based Least Connections with Replication)
帶復制的基于局部性最少鏈接”調度算法也是針對目標IP地址的負載均衡,目前主要用于Cache集群系統?它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射?該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按”最小連接”原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按“最小連接”原則從這個集群中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器?同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。
小結:基于本地的帶復制的最少連接。
ipvs管理工具介紹
ipvsadm:工作在用戶空間,定義轉發規則的程序;
ipvs:工作在內核空間,根據規則完成調度請求的程序;
ipvsadm用法
管理服務器集群
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
例:# ipvsadm -A -t 172.16.100.1:80 -s rr
ipvsadm -D -t|u|f service-address
-A: 添加
-E:修改
-D:刪除
-t:TCP協議的端口
-u:UDP協議的端口
server-address: IP:[PORT]
-f:FWM,防火墻標記,標記用數字來表示,將多個端口綁定在一起定義成一個集群服務使用
server-address: Mark Number
-s: 制定調度方法,默認為wlc
管理集群服務的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
-a:添加RS
-e:修改RS
-d:刪除RS
-t|u|f service-address:引用此前定義過的集群服務
-r server-address :某RS的地址,在NAT模型中,可使用IP:PORT實現端口映射;
[-g|i|m]:指定lvs類型
-g:DR
-i:TUN
-m:NAT
-w weight:定義服務器權重;
例:#ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m
#ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m
保存RS及CS
-S save:
ipvsadm -S > /etc/sysconfig/ipvsadmin.v1
ipvsadm-save > /etc/sysconfig/ipvsadmin.v1
service ipvsadm save
載入此前的規則
-R: restore
ipvsadm -R < /etc/sysconfig/ipvsadmin.v1
ipvsadm-restore < /etc/sysconfig/ipvsadmin.v1
service ipvsadm start
清空規則(刪除所有集群服務)
ipvsadm -C
顯示規則
ipvsadm -L |l [options]
options:
–c:顯示當前所有的connection(ipvs連接狀況)
–stats:統計數據。列出CS及RS的連接統計數據
–rate:速率。列出CS及RS的連接、報文及字節速率
-n –numeric: 數字格式顯示
–exact: 精確值
–timeout:顯示tcp、tcpfin和udp的會話超時時長
注:各節點之間的時間偏差不應該超過1秒鐘。
其它
NTP
NTP:Network Time Protocol 用時間服務器同步時間
原創文章,作者:365,如若轉載,請注明出處:http://www.www58058.com/23247
寫的很好,排版還可以在漂亮一點,加油!圖是自己畫的嗎?