1、LVS簡介前端
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。node
負載均衡集羣(Load Balancing,簡稱爲LB)從工做在協議層來劃分爲TCP和應用層;TCP協議層是根據請求的目標地址和端口進行調度;應用層協議是根據請求的內容進行調度,並且此種調度爲「代理」方式,即反向代理。算法
2、LVS組成後端
LVS軟件由ipvs和ipvsadm兩個程序組成,ipvs是工做在內核中的;ipvsadm是工做在用戶空間,將爲工做在內核空間的ipvs定義集羣服務,做出調度決策算法的功能的一種工具,從功能上來看相似於netfilt.瀏覽器
2.1 LVS工做原理安全
ipvs工做於netfilter的INPUT鏈上;ipvsadm用於在ipvs上定義集羣服務:同時也得定義此集羣服務對應於有哪一個後端主機可用;根據所指定的調度方法(算法)做出調度決策;bash
當用戶的請求到達本機時,首先經由PREROUTING鏈,到達PREROUTING鏈後進行路由判斷,經路由判斷後發現是送往本機的,將用戶請求送往INPUT連接中,此時ipvs將檢查INPUT鏈上的全部通過的報文,判斷是否是請求的集羣服務,若是請求的是集羣服務,ipvs將「攔下」服務,通過調度算法挑選出一個時先定義好的主機,並將用戶請求服務轉發出去,經由網絡將用戶請求送日後端主機併爲用戶提供服務響應。服務器
2.2 LVS常見術語約定網絡
爲用戶提供挑選後端服務器的主機稱爲調度器(Director);後端提供服務的主機稱爲Real Server (簡寫爲RS)。架構
客戶端(Client)的IP稱爲CIP;被DNS域名解析後的IP稱爲VIP(Director Virtual IP);調度器面向後方的集羣的IP稱爲DIP(Director IP);Real Server服務器上的IP稱爲RIP(Real Server)。
2.3 LVS的類型
LVS的類型分爲lvs-nat、lvs-dr、lvs-tun、lvs-fullnat。
3、lvs-nat
lvs-nat很是相似於DNAT,支持多目標轉發,它是經過修改請求報文的目標地址並根據調度算法所挑選出的某RS的RIP來進行轉發。
當用戶請求報文到達Director時,源地址爲CIP目標地址爲VIP,Director通過內部路由後發現是送往本機的,就送往INPUT鏈,ipvs將檢查在INPUT鏈發現對CIP請求的是集羣服務,根據在ipvs中指明的RS1和RS2,並根據內部的調度算法,挑選出一臺RS爲本次請求服務,此時更改請求報文中的目標地址改成挑選出的RS的IP地址如「CIP:RIP1」,並經由forward鏈轉發出去,在報文到達RS1服務器是源地址是CIP目標地址是RS1的IP地址(即本機的IP地址),本機運行着有用戶請求服務,RS1進行報文響應,響應報文的源地址是RIP1,目標地址是CIP,即「RIP1:CIP」;到響應報文達到Director時,Director根據內部的NAT追蹤機制,發現用戶訪問的是CIP,所以Director將進行修改源地址爲VIP,報文格式「VIP:CIP」。
lvs-nat架構特性:
(1) RS應該使用私有地址,即RIP應該爲私有地址;各RS的網關必須指向DIP;
(2) 請求和響應報文都經由Director轉發;高負載場景中,Director易於成爲系統瓶頸;
(3) 支持端口映射;
(4) RS可使用任意類型的OS;
(5) RS的RIP必須與Director的DIP在同一網絡;
4、lvs-dr
lvs-dr模型即爲直接路由;Director在實現轉發時不修改請求的IP首部,而是經過直接封裝MAC首部完成轉發;目標MAC是Director根據調度方法挑選出某RS的MAC地址;拓撲結構有別有NAT類型;
當用戶請求到達路由器,路由器通過路由到達交換機,並把用戶請求交給Director,Director通過調度至RS服務器,RS服務器在響應是並不通過Director,而是直接經交換機-->路由器送往用戶。
在Director服務器的網卡上配置DIP,在網卡別名上配置VIP;在RS服務器上的網卡配置RIP,把VIP配置到RS服務器內部的lo網卡的別名上如lo:1。當用戶請求到達時,首先到達路由器,路由器經過路由送往另外一個接口,此接口通過ARP廣播,解析到內網中VIP的MAC地址。此時路由器會收到三個VIP的MAC地址,顯然這不是咱們但願獲得的結果,咱們得想辦法讓RS服務器不能響應路由器ARP廣播請求解析獲得VIP的MAC地址,或者響應了不讓響應請求出去;這樣就能保證只有Director的VIP會響應ARP廣播請求解析VIP的MAC地址。當路由器獲得VIP的MAC地址時,路由器會進行封裝報文幀,在源報文的基礎上加上本身的MAC地址和ARP廣播請求解析VIP的MAC地址,而後報文到達Director服務器,Director發現請求的報文是本機的地址,把報文送往INPUT鏈,ipvs發現這是一個請求的集羣服務,根據調度算法挑選出一個RS如RS1,並ARP廣播請求解析RS1的RIP地址的MAC獲得RS1的RIP地址的MAC地址,源IP地址和目標IP沒有變,只是修改源MAC和目標MAC地址變成了Director的和RS1的RIP的Mac地址。當報文送往RS1服務器,RS1服務器判斷源IP和目標IP是本身本機上,並響應服務封裝報文,源IP是VIP,目標IP是CIP,將報文發送給RS1設置的網關地址路由器接口。
此時會有一個問題,在Linux中由哪塊網卡發送出去目標IP就是哪塊網卡的IP地址,這裏能夠要求強求報文必須由lo出去,但lo出不去的,能夠經過forward鏈轉發出去的。
架構特性:
(1) 保證前端路由器將目標地址爲VIP的請求報文經過ARP地址解析後送往Director;
解決方案:
靜態綁定:在前端路由直接將VIP對應的目標MAC靜態配置爲Director的MAC地址;
arptables:在各RS上,經過arptables規則拒絕其響應對VIP的ARP廣播請求;
內核參數:在RS上修改內核參數,並結合地址的配置方式實現拒絕響應對VIP的ARP廣播請求;
(2) RS的RIP可使用私有地址;但也可使用公網地址,此時可經過互聯網上的主機直接對此RS發起管理操做(不安全);
(3) 請求報文必須經由Director調度,但響應報文必須不能經由Director;
(4) 各RIP必須與DIP在同一個物理網絡中;
(5) 不支持端口映射;
(6) RS可使用大多數的OS;
(7) RS的網關必定不能指向Director;
5、lvs-tun
lvs-tun不修改請求報文IP首部,而是經過IP隧道機制在原有的IP報文以外再封裝IP首部,經由互聯網把請求報文交給選定的RS;
架構特性:
(1) RIP, DIP, VIP都是公網地址;
(2) RS的網關不能,也不可能指向DIP;
(3) 請求報文由Director分發,但響應報文直接由RS響應給Client;
(4) 不支持端口映射;
(5) RS的OS必須得支持IP隧道;
6、lvs-fullnat
lvs-fullnat並非LVS官方的模型,這是由淘寶開發團隊開發的一種模型,並無被官方收錄至LVS中,要使用lvs-fullnat模型須要從新經內核打補丁,並從新編譯內核。
lvs-fullnat:經過請求報文的源地址爲DIP,目標爲RIP來實現轉發;對於響應報文而言,修改源地址爲VIP,目標地址爲CIP來實現轉發;
架構特性:
(1) RIP,DIP可使用私有地址;
(2) RIP和DIP能夠不在同一個網絡中,且RIP的網關未必須要指向DIP;
(3) 支持端口映射;
(4) RS的OS可使用任意類型;
(5) 請求報文經由Director,響應報文經由Director;
7、LVS調度算法
類型 | 算法 |
說明 |
靜態方法 | RR |
round-robin, 輪詢; |
WRR | weighted round-robin, 加權輪詢;Overhead=conn/weight | |
SH | Source ip Hashing,源地址哈希;把來自同一個地址請求,通通定向至此前選定的RS; | |
DH | Destination ip Hashing, 目標地址哈希;把訪問同一個目標地址的請求,通通定向至此前選定的某RS; | |
動態方法 | LC | least connection:最小鏈接,Overhead=Active*256+Inactive |
WLC | weighted least connection:加權最小鏈接,Overhead=(Active*256+Inactive)/weight;默認的調度算法 | |
SED | Shorted Expection Delay:最短時間望延遲,Overhead=(Active+1)*256/weight | |
NQ | Never Queue:永不排序 | |
LBLC | Local-Based Least Connection,基於本地的最小鏈接:動態方式的DH算法 | |
LBLCR | Replicated LBLC:帶複製的LBLCR |
8、LVS-NAT實現
經過前面的原理介紹,這裏來實現一下lvs-nat模型,將要使用三臺虛擬機,客戶端就用物理機來訪問;RS-1和RS-2的網卡要使用Vmware Workstation中的僅主機模式,Director要使用兩張網卡,一個用於當VIP一個用於當DIP,DIP網卡要使用僅主機模式與後端RS使用一個私有網絡地址;
Real Server分別開啓Web服務器用於測試,頁面就是種RealServer的名稱,使用rr調度算法進行輪詢,這樣更容易看出效果。
8.1 RealServer的配置
(1)配置IP地址及網關
ifconfig 192.168.190.81/24 up #設置IP地址,若是你已經設置好了,此步能夠省略的
route add default gw 192.168.190.100 設置默認網關
[root@RS-1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.190.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.190.100 0.0.0.0 UG 0 0 0 eth0
(2)啓動httpd服務
# service httpd start
8.2 Director的配置
(1)配置IP地址
若是你已經設置好了,此步能夠省略;
ifconfigeth0 172.16.9.100/16 up ifconfigeth1 192.168.190.100/24 up
(2)開啓路由間轉發
echo 1 > /proc/sys/net/ipv4/ip_forward [root@LVS ~]# cat/proc/sys/net/ipv4/ip_forward
1
(3)配置LVS
若是你沒有安裝ipvsadm,須要在配置好yum源以後直接yum install ipvsadm便可;
ipvsadm -C ipvsadm -A -t 172.16.9.100:80 -s rr ipvsadm -a -t 172.16.9.100:80 -r192.168.190.81:80 -m ipvsadm -a -t 172.16.9.100:80 -r192.168.190.82:80 -m
#-C:表示清空ipvsadm中的全部定義的集羣服務
#-A:定義集羣服務
#-t:承載的應用層協議爲基於TCP協議提供服務的協議;其service-address的格式爲「VIP:PORT」,如「172.16.100.6:80」;
#-s:指定調度算法,默認爲wlc
#-a:建立集羣服務上的RS
#-r:指明RS,server-address格式通常爲「IP[:PORT]」;注意,只支持端口映射的lvs類型中才應該顯式定義此處端口
#-m:指明LVS的類型爲nat
[root@LVS ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.9.100:80 rr -> 192.168.190.81:80 Masq 1 0 0 -> 192.168.190.82:80 Masq 1 0 0
(4)在瀏覽器中訪問測試
在瀏覽器中輸入VIP的地址,不斷的刷新將會出現輪詢的效果。
9、LVS-DR實現
Real Server分別開啓Web服務器用於測試,頁面就是種RealServer的名稱,使用rr調度算法進行輪詢,這樣更容易看出效果。
9.1 Real Server的配置
各Real Server的配置都是同樣的,這們就介紹一個Real Server的配置便可。
(1)抵制ARP對VIP的請求
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
(2)配置VIP地址及路由
ifconfig lo:0 172.16.9.100 netmask255.255.255.255 broadcast 172.16.9.100 up route add -host 172.16.9.100 dev lo:0
(3)啓動HTTP服務
service httpd start
(4)在瀏覽器中訪問測試
9.2 Director上的配置
(1)配置VIP
ifconfig eth0:0 172.16.9.100 netmask255.255.255.255 broadcast 172.16.9.100 up route add -host 172.16.9.100 dev eth0:0
(2)配置ipvs服務
ipvsadm-A -t 172.16.9.100:80 -s rr ipvsadm -a -t 172.16.9.100:80 -r 172.16.9.81-g ipvsadm -a -t 172.16.9.100:80 -r 172.16.9.82-g
(3)檢查ipvs配置信息
[root@node-03 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.9.100:80 rr -> 17.16.9.81:80 Route 1 0 0 -> 17.16.9.82:80 Route 1 0 0
(4)在瀏覽器中瀏覽
不斷的刷新將會出現輪詢的效果。
完