友情提醒:實驗環境爲:Centos 6.6 x86_64 + vmware workstation 10
內容概括:
1)LVS的點滴彙總
2)實現LVS-nat模型
3)實現LVS-DR模型
一 LVS的點滴彙總
LVS是Linux Virtual Server的簡稱,基於IP和端口的負載均衡軟件。該開源項目的發起者和主要開發者爲章文嵩博士。
1.1)LVS的組件:
有2部分組成:
ipvs:工作在內核空間netfilter/iptables框架的input鏈上。
ipvsadm:工作在用戶空間的一個命令工具,主要用於複製均衡規則的定製和管理
ipvsadm定義好集羣服務和負載均衡規則後,ipvs在input鏈上截取相應端口和目標地址的服務包,改寫目標地址,通過forward,postrouting鏈發往後端的真正提供服務的主機。
iptables規則和ipvsadm定義的規則不能共存。
1.2)LVS支持的協議:
目前支持:tcp/udp/sctp/ah/esp/ah_esp
1.3)術語約定:
主機類:
Director:調度器,做爲網絡構架的唯一入口。
Real Server:簡稱RS,隱藏於後端提供服務的真正主機。
IP類:
用戶(cip)<--->(vip)LVS-Director(dip)<---->(rip)real server
1.4)LVS的工作模型由四種:
lvs-nat: 後端real server真正隱藏,接受和返回給客戶端的數據包均需經由 lvs-Director轉發,
後端realserver 與 lvs要求在同一個物理局域網內。
lvs-dr: Lvs-Director接受客戶端的請求數據包,給返回給客戶端的應答包由後端realserver直接返回,後端realserver與lvs要求在同一個物理局域網內。
lvs-tun: Lvs-Director接受客戶端的請求數據包,給返回給客戶端的應答包由後端realserver直接返回,後端realserver與lvs不在同一個物理局域網內,可以誇地域實現。
lvs-fullnat: 這個目前不是LVS標準模型,由阿里巴巴集團開發人員研製出的一種新型結構,是lvs-nat模型的改進型,Lvs-Director與realserver可以跨路由器協同工作。
1.5)LVS的調度方法:
靜態方法:調度時僅根據算法本身實現調度,而不管後端realserver的負載情況,追求的是起點公平。
RR:round-robin,輪詢。
根據配置lvs-director指定的realserver的次序,挨個來應答請求。
存在的問題是:不論realserver性能的高低而得到同等的待遇,沒有發揮出高性能realsever的能力。
WRR:weighted round-robin,加權輪詢:給lvs一個權重值,值越大承受越多。
計算方法:overhead=conn/weight
在配置director上配置realserver時,指定了每個realserver的權重值,比如第一realserver 權重 1 ,第二個realserver的權重爲4,那麼前5個連接請求第二個realserver佔據4個後第一個realserver才佔據1個,二者之間始終保存1:4的關係。
存在問題:可能會出現這種場景:第二個realserver上的4個鏈接都沒有斷開,而第一個realserve上的唯一的一個連接處理完畢已經空閒,而第二個realserver還在處理4個連接。新來了5個連接,第二個realserver分的4個,第一個realserver分的1個。此時第二個realserve上有8個連接要處理,而第一個realserve上只需處理1個鏈接。
RR與WRR,算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,是一種無狀態調度,不管服務器的當前連接數和響應速度。
DH:destination ip hashing,目標地址散列調度,特殊場景中使用,例如有多出口時。
該算法是針對目標IP地址的負載均衡,通過散列(Hash)函數將目標IP地址與後臺Realserver組成key:value對應關係的散列表,根據請求包文的目標IP地址,作爲鍵(Hash
Key)從靜態分配的散列表找出對應的緩存或出口服務器。
SH:source hashing,源地址哈希,來源相同的主機始終發向同一個realserver實現會話綁定。
它採用的散列函數與目標地址散列調度算法
的相同。除了將請求的目標IP地址換成請求的源IP地址外,它的算法流程與目標地址散列調度算法的基本相似。在實際應用中,源地址散列調度和目標地址散列
調度可以結合使用在防火牆集羣中,它們可以保證整個系統的唯一出入口。
動態方法:根據算法及後端RS當前的負載狀況實現調度 。根據overhead值挑選最小的realserver進行應答響應。
LC:least connection
計算方法:overhead=Active*256+Inactive
這種調度算法分配連接時根據overhead和在realserver上的順序來分配連接的。連接來臨時overhead小的分的連接,若overhead相同,按照在director上的realserve順序來分配。
WLC:weighted least connection
計算方法:overhead=(Active*256+Inactive)/weight
wlc是lc的改進,在分配連接時增加了weight值,使得權重大的realserver分的連接數增加。可以給性能高的realserver配置合理的權重值,使其發揮更大的能力。當權重設計不合理,會出現權重高的機器忙死,權重低的機器閒死。wlc是默認的調度方式。
SED:Shorted Expection Delay,最短期望延遲
計算方法:overhead=(Active+1)*256/weight
SED雖是wlc的改進,但是並沒有克服權重設置不合理帶來的缺陷:當權重設計不合理,會出現權重高的機器忙死,權重低的機器閒死。
NQ:Never Queue ,永不排隊
NQ是SED的改進,初始時讓每個realserver根據權重分的一個連接,而後按照SED的overhead的計算公式,決定下面的連接分配情況。
LBLC:基於本地的最少連接 Local-Based Least Connection
動態方式的DH算法
將去往相同地址的連接定向到同一個出口上,若在出口上設定有緩存服務器,這能提高cache命中率。當出口server負擔過重時也會定向至另外的server上,雖然這降低了命中,破壞lvs的初衷。
LBLCR:帶複製的LBLC
出口服務器上配置有緩存功能,將去往某些域名的連接出口定向至1號server上,這樣提高cache命中,當1號負擔過重時,將部分連接調至2號server上,同時將cache中的內容也複製一份給2號server。
1.6)ipvsadm命令的使用格式:
安裝命令:#yum -y install ipvsadm
用法:
管理集羣服務:創建,修改,刪除
#ipvsadm -A|-E -t|-u|-f service-address [-s scheduler]
#ipvsadm -D -t|-u|-f service-address
-A:創建
-E:修改
-D:刪除
-t:tcp,後面的service-address的格式:vip:port,如:192.168.0.1:80
-u:udp,後面的service-address的格式:vip:port,如:192.168.0.1:80
-f:承載協議爲tcp或udp,但該類報文會經由iptables/netfilter打標記,即防火牆標記,其service-address的格式“FWM",例如 "10"
-s scheduler:指定算法。默認爲wlc
管理集羣服務的RS:添加,修改,移除
#ipvsadm -a|-e -t|-u|-f service-address -r server-address [-g|-i|-m] [-w weight]
#ipvsadm -d -t|-u|-f service-address -r server-address
#ipvsadm -C
-r server-address:指明Real Server,格式:ip[:port],如:192.168.1.1:80
-g:指明lvs類型爲 lvs-dr,默認類型。
-i:指明lvs類型爲 lvs-tun
-m:指明lvs類型爲lvs-nat
-w weight:指定權重。
-d:刪除已定義的realserver
-C:清空已定義的ipvsadm的規則
規則存取:
保存規則:
#service ipvsadm save
-->規則保存至/etc/sysconfig/ipvsadm
#ipvsadm -S > /etc/sysconfig/ipvsadm
#ipvsadm-save > /etc/sysconfig/ipvsadm
讀取規則:
#service ipvsadm restart
#ipvsadm -R < /etc/sysconfig/ipvsadm
#ipvsadm-restore</etc/sysconfig/ipvsadm
規則和統計數據查看:
#ipvsadm -L -n [option]
#ipvsadm -Z
-L 顯示規則
-n 數字表示
-Z 情況數據統計值
option:
-c 顯示當前的活動鏈接分配
--stats 顯示統計數據
--rates 列出速率
--exact 顯示精確值
二 Lvs-Nat模型的實現:
2.1)Lvs-nat模型下數據包ip頭地址的轉換
請求包頭:client(cip,vip)--->lvs(dip)-->(cip,rip)-->realserver
響應包頭: client(vip,cip)<---lvs(dip)<--(rip,cip)<--realserver
2.2) Lvs-nat架構特性:
(1):rip爲私有地址,vip爲公網地址
(2):read sever網關指向dip,rip與dip在同一網段中。
(3):請求和相應報文都經由Director轉發,lvs在高負載場景下成爲系統同瓶頸。
(4):lvs必須爲linux,real server可以是任意OS
2.3)實驗環境:
主機 | 角色 | IP地址 |
Test01 | LVS Director | vip:192.168.100.1 [vmnet8] dip:172.16.0.1 [vmnet3] |
Test02 | LVS realserver,提供簡單的web服務 | rip:172.16.0.2 [vmnet3] |
Test03 | LVS realserver,提供簡單的web服務 | rip:172.16.0.3 [vmnet3] |
win7 | 客戶機,發起web請求 | cip:192.168.100.100 [vmnet8] |
實驗拓撲圖:
2.4)實驗步驟:
2.4.1) 網卡橋接,I地址設定和相應的web服務
設定Test02:
[root@Test02 ~]# service iptables stop [root@Test02 ~]#setenforce 0 [root@Test02 ~]#yum -y install httpd [root@Test02 ~]#ip addr add 172.16.0.2/24 dev eth2 [root@Test02 ~]#touch /var/www/html/index.html [root@Test02 ~]#echo "<h1>privateli-Test02,web station,172.16.0.2 is my address</h1>">/var/www/html/index.html [root@Test02 ~]#service httpd start #實際中相同端口的集羣服務內容應該一致,但在這個實驗中爲了測試效果,故設定web內容不一致。
設定Test03:
[root@Test03 ~]# service iptables stop [root@Test03 ~]#setenforce 0 [root@Test03 ~]#yum -y install httpd [root@Test03 ~]#ip addr add 172.16.0.3/24 dev eth2 [root@Test03 ~]#touch /var/www/html/index.html [root@Test03 ~]#echo "<h1>privateli-Test03,web station,172.16.0.3 is my address</h1>">/var/www/html/index.html [root@Test03 ~]#service httpd start #實際中相同端口的集羣服務內容應該一致,但在這個實驗中爲了測試效果,故設定web內容不一致。
設定Test01:
[root@Test03 ~]# service iptables stop [root@Test03 ~]#setenforce 0 [root@Test03 ~]#ip addr add 172.16.0.1/24 dev eth2 [root@Test03 ~]#ip addr add 192.168.100.1/24 dev eth1 [root@Test03 ~]#
2.4.2)路由設定:
用爲是LVS-NAT模型,需要realserver的 rip網卡的網關設定爲Directory的dip
[root@Test03 ~]# ip route add default via 172.16.0.1 [root@Test02 html]# ip route add default via 172.16.0.1
2.4.3)Lvs-director Test01上啓動ipv4數據包轉發:
[root@Test01 ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
2.4.4)lvs-director上設定服務:
#安裝ipvadm工具
[root@Test01 ~]# yum -y install ipvsadm
#設定集羣服務:
[root@Test01 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@Test01 ~]# ipvsadm -A -t 192.168.100.1:80 -s rr [root@Test01 ~]# ipvsadm -a -t 192.168.100.1:80 -r 172.16.0.2:80 -m [root@Test01 ~]# ipvsadm -a -t 192.168.100.1:80 -r 172.16.0.3:80 -m [root@Test01 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.100.1:80 rr -> 172.16.0.2:80 Masq 1 0 0 -> 172.16.0.3:80 Masq 1 0 0 [root@Test01 ~]#
2.4.5)win7 上測試效果
再次刷新:
三 LVS-DR模型的實現:
3.1)LVS-DR模型下數據包IP頭部和幀的轉換:
請求包文IP頭部:
client->(cip,vip)->Director->[MAC-DIP,MAC-RIP](cip,vip)--->(rip)realserver-->(lo:0 vip)realserver
響應報文的IP頭部:
client<--(vip,cip)<---(rip)realserver<--(vip,cip)---(lo:0vip)realserver
3.2)構建特性:
(1):保證前端路由器將目標地址爲vip的請求報文通過ARP地址解析送往Director
解決方案:
靜態綁定:前段路由直接將VIP對應的mac地址靜態配置爲director的mac地址
artables:在各RS上,通過arptables規則拒絕其響應對vip的arp廣播地址請求
內核參數:在RS上修改內核參數,並結合地址的配置方式實現拒絕響應對vip的arp廣播請求
(2):RS的rip可以使用私有地址,也可使用公網地址
(3):請求報文必須經由director調度,但響應報文必須不能經由director
(4):各RIP必須與DIP在同一個物理網絡中
(5):不支持端口映射
(6):RS可以使用大多數的OS
(7):RS的網關一定不能指向Director
3.3)部署要點:
(1)各RS直接回應client的請求,因此,各RS均得配置VIP,不然客戶端收到的數據包源地址不是vip,則會丟棄收到的數據包。
(2)Director不會修改/拆除請求報文的IP首部,而是
通過封裝新的幀首部(源MAC爲director的dir
端口的MAC,目標mac爲rs的rip端口的mac)
Director的vip地址配置在dir網卡的別名上。
(3)RS上vip配置在lo網卡的別名上若lo:0,並配置有arp應答抑制;只有Director上的vip參與本地路由通 信,也就是參閱arp應答。
(4)linux上配置的IP地址屬於內核的而不是網卡, linux上響應報文從哪個接口出去就封裝該接口的IP源IP
因此,需設定RS上相應報文的從lo別名網卡(也就是配置有vip的網卡)發出,通過rip網卡流經網關返回給client。
3.4)實驗環境
3.5)實驗步驟
未完待續。。。。。