在上一篇中介紹了負載均衡及叢集的原理,本篇主要介紹下下實作負載均衡的軟體之LVS的原理及應用。
一、LVS的介紹
1、 LVS的定義
一般來說,LVS采用三層結構:負載排程器、伺服器池、共享存儲。工作在TCP/IP協定的四層,其轉發是依賴于四層協定的特征進行轉發的,由于其轉發要依賴于協定的特征進行轉發,是以需要在核心的TCP/IP協定棧進行過濾篩選,可想而知,這就需要在核心的子產品來完成,而這樣的過濾轉發規則又是由管理者進行定義的,是以,LVS就是兩段式的架構設計,在核心空間中工作的是"ipvs",而在使用者空間中工作的,用來定義叢集服務規則的是"ipvsadm"。這就很容易想到iptables而LVS正好工作在iptables的input鍊上。
2、 LVS的組成
ipvsadm:用于管理叢集服務的指令行工具,工作于Linux系統中的使用者空間。
ipvs:為lvs提供服務的核心子產品,工作于核心空間 (相對于是架構,通過ipvsadm添加規則,來實作ipvs功能)。
注:在linux核心2.4.23之前的核心中子產品預設是不存在的,需要自己手動打更新檔,然後把此子產品編譯進核心才可以使用此功能。
3、 LVS中每個主機IP位址的定義
VIP:Director用來向用戶端提供服務的IP位址,也是DNS解析的IP
RIP:叢集節點(背景真正提供服務的伺服器)所使用的IP位址
DIP:Director用來和RIP進行互動的IP位址
CIP:公網IP,用戶端使用的IP
4、 LVS的三種轉發模式
LVS-NAT:網絡位址轉換 NetworkAddress Translation
LVS-DR:直接路由 Direct Routing
LVS-TUN:IP隧道 IP Tunneling
5、 LVS的三種轉發模式特點
NAT
a、 叢集節點跟director必須在同一個網段上面
b、 RIP通常是私有位址,僅用于個叢集
c、 支援口映射
d、 realsever可以使用任意OS(作業系統)
e、 較大規模應用場景中director已成為系統瓶頸
<a href="http://s3.51cto.com/wyfs02/M00/6D/7E/wKioL1VljlHx4-_EAAHz5UrkKy4793.jpg" target="_blank"></a>
DR:
a、叢集節點跟director必須在同一個實體網絡中
b、RIP可以使用公網位址.實作便捷的遠端控制伺服器
c、director隻負責處理入站請求,相應封包則有realserver直接發往用戶端
d、realserver不能将網關指向DIP
e、director不支援端口映射
f、大多數作業系統都能應用在realserver上
g、DR比NAT能處理更多的realserver
<a href="http://s3.51cto.com/wyfs02/M02/6D/7F/wKioL1VlkBvigNtLAAI2zqAH7C4417.jpg" target="_blank"></a>
TUN:
a、各叢集節點可以跨越不同的網絡
b、RIP必須是公網位址
d、realserver網管不能指向director
e、隻有支援隧道共跟那個的os才能使用者realserver
不支援端口映射
注:在實際應用中用的不多這裡就不再具體示範!
<a href="http://s3.51cto.com/wyfs02/M01/6D/83/wKiom1Vljr2SMG_QAAI2zqAH7C4164.jpg" target="_blank"></a>
1、 LVS的排程算法
靜态排程算法(4種):
(1)rr : round robin :輪叫,輪詢
說明:輪詢排程算法的原理是每一次把來自使用者的請求輪流配置設定給内部中的伺服器,從1開始,直到N(内部伺服器個數),然後重新開始循環。算法的優點是其簡潔性,它無需記錄目前所有連接配接的狀态,是以它是一種無狀态排程。缺點:是不考慮每台伺服器的處理能力。
(2)wrr: weight round robin :權重輪詢(以權重之間的比例實作在各主機之間進行排程)
說明:由于每台伺服器的配置、安裝的業務應用等不同,其處理能力會不一樣。是以,我們根據伺服器的不同處理能力,給每個伺服器配置設定不同的權值,使其能夠接受相應權值數的服務請求。
(3)sh : source hashing : 源位址hash 實作會話綁定sessionaffinity
說明:簡單的說就是有将同一用戶端的請求發給同一個real server,源位址散列排程算法正好與目标位址散列排程算法相反,它根據請求的源IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的并且沒有超負荷,将請求發送到該伺服器,否則傳回空。它采用的散列函數與目标位址散列排程算法的相同。它的算法流程與目标位址散列排程算法的基本相似,除了将請求的目标IP位址換成請求的源IP位址。
(4)dh : destination hashing : 目标位址hash
說明:将同樣的請求發送給同一個server,一般使用者于緩存伺服器說,簡單的說,LB叢集後面又加了一層,在LB與real server之間加了一層緩存伺服器,當一個用戶端請求一個頁面時,LB發給cache1,當第二個用戶端請求同樣的頁面時,LB還是發給cache1,這就是我們所說的,将同樣的請求發給同一個server,來提高緩存的命中率。目标位址散列排程算法也是針對目标IP位址的負載均衡,它是一種靜态映射算法,通過一個散列(Hash)函數将一個目标IP位址映射到一台伺服器。目标位址散列排程算法先根據請求的目标IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。
動态排程算法(6種):
(1)lc :leash-connection 最少連接配接
說明:最少連接配接排程算法是把新的連接配接請求配置設定到目前連接配接數最小的伺服器,最小連接配接排程是一種動态排程短算法,它通過伺服器目前所活躍的連接配接數來估計伺服器的負載均衡,排程器需要記錄各個伺服器已建立連接配接的數目,當一個請求被排程到某台伺服器,其連接配接數加1,當連接配接中止或逾時,其連接配接數減一,在系統實作時,我們也引入當伺服器的權值為0時,表示該伺服器不可用而不被排程。此算法忽略了伺服器的性能問題,有的伺服器性能好,有的伺服器性能差,通過權重重來區分性能,是以有了下面算法wlc。
簡單算法:active*256+inactive (誰的小,挑誰)
(2)wlc :權重最少連接配接
權重最小連接配接排程算法是最小連接配接排程的超集,各個伺服器用相應的權值表示其處理性能。伺服器的預設權值為1,系統管理者可以動态地設定伺服器的權限,權重最小連接配接排程在排程新連接配接時盡可能使伺服器的已建立連接配接數和其權值成比例。由于伺服器的性能不同,我們給性能相對好的伺服器,加大權重,即會接收到更多的請求。
簡單算法:(active*256+inactive)/weight(誰的小,挑誰)
(3)sed :最少期望延遲
說明:不考慮非活動連接配接,誰的權重大,我們優先選擇權重大的伺服器來接收請求,但會出現問題,就是權重比較大的伺服器會很忙,但權重相對較小的伺服器很閑,甚至會接收不到請求,是以便有了下面的算法nq。
基于wlc算法,簡單算法:(active+1)*256/weight (誰的小選誰)
(4).nq :never queue 永不排隊
說明:在上面我們說明了,由于某台伺服器的權重較小,比較空閑,甚至接收不到請求,而權重大的伺服器會很忙,所此算法是sed改進,就是說不管你的權重多大都會被配置設定到請求。簡單說,無需隊列,如果有台real server的連接配接數為0就直接配置設定過去,不需要在進行sed運算。
(5).LBLC :基于局部性的最少連接配接
說明:基于局部性的最少連接配接算法是針對請求封包的目标IP位址的負載均衡排程,主要用于Cache叢集系統,因為Cache叢集中客戶請求封包的目标IP位址是變化的,這裡假設任何後端伺服器都可以處理任何請求,算法的設計目标在伺服器的負載基本平衡的情況下,将相同的目标IP位址的請求排程到同一個台伺服器,來提高伺服器的通路局部性和主存Cache命中率,進而調整整個叢集系統的處理能力。
(6).LBLCR :基于局部性的帶複制功能的最少連接配接
說明:基于局部性的帶複制功能的最少連接配接排程算法也是針對目标IP位址的負載均衡,該算法根據請求的目标IP位址找出該目标IP位址對應的伺服器組,按“最小連接配接”原則從伺服器組中選出一台伺服器,若伺服器沒有超載,将請求發送到該伺服器;若伺服器超載,則按“最小連接配接”原則從這個叢集中選出一台伺服器,将該伺服器加入到伺服器組中,将請求發送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,将最忙的伺服器從伺服器組中删除,以降低複制的程度。
注:LVS預設排程算法是 wlc 。
2、 定義叢集服務規則的ipvsadm指令
(1)管理叢集服務
ipvsadm –A|E|D -t |u|f server-adddress [-s scheduler]
-t :tcp協定的叢集 service-address後面必須寫成ip:port
-u :udp協定的叢集 service-address後面必須寫成ip:port
-f :fwm 防火牆的标記 service-address後面必須寫成marknumber
-s :指定調試算法
-A添加 –E 修改 –D删除
(2)管理叢集服務中的realserver
ipvsadm –a|e|d -t|u|f server-adddress -r server-address [-g|i|m] [-w weight]
-t|u|f service-address 實作定義好的某叢集服務
-rserver-address 某rs的位址在nat模型中可使用ip:port實作端口映射
[-g|i|m] lvs類型:
-g :DR -i : TUN -m : NAT [-w weight] 指定權重
-a添加 -e修改 –d删除
(3).檢視
ipvsadm -L | ipvsadm -l ....
-n 顯示主機位址和端口為數字格式
--stats 顯示進出站資料
--rate 顯示速率
--timeout 顯示每一個tcp tcpfin udp 的逾時時間值
--deamon 顯示程序資訊
--sort 顯示排序規則預設是升序的
-c 顯示多少個客戶連接配接進來
(4).删除所有叢集服務:
清空ipvs規則
ipvsadm –C
(5).儲存定義的規則:
service ipvsadm save
ipvsadm -S > /path/to/somefile
(6).載入此前的規則
ipvsadm -R
ipvsadm -R < /path/to/somefile
二、LVS-NAT模式示範
簡單實驗拓撲如下:
<a href="http://s3.51cto.com/wyfs02/M01/6D/58/wKiom1VhpH6SpWSOAAHJ_M2bq7I129.jpg" target="_blank"></a>
Web Server 1測試頁
<a href="http://s3.51cto.com/wyfs02/M00/6D/54/wKioL1VhpeyBMnOUAABfvrEid30516.jpg" target="_blank"></a>
Web Server 2測試頁
<a href="http://s3.51cto.com/wyfs02/M00/6D/58/wKiom1VhpGDQMQHWAABfgfbVpZI040.jpg" target="_blank"></a>
lvs主機上的操作:
1
2
3
4
5
6
<code>[root@lvs ~]</code><code># yum -y install kernel-devel popt-static gcc libnl* libpopt* (請根據實際情況安裝)</code>
<code>[root@lvs ~]</code><code># ln -s/usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux</code>
<code>[root@lvs ~]</code><code># wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz</code>
<code>[root@lvs ~]</code><code># tar -zxf ipvsadm-1.24.tar.gz</code>
<code>[root@lvs ~]</code><code># cd ipvsadm-1.24</code>
<code>[root@lvs ipvsadm-1.24]</code><code># make &&make install</code>
開啟ip轉發
<code>[root@lvs ~]</code><code># vim /etc/sysctl.conf</code>
<code>把net.ipv4.ip_forward = 0改為net.ipv4.ip_forward= 1</code>
<code>[root@lvs ~]</code><code># sysctl –p</code>
配置lvs-nat模型
7
8
9
10
11
<code>[root@lvs ~]</code><code># ipvsadm -A -t192.168.2.200:80 -s rr</code>
<code>[root@lvs ~]</code><code># ipvsadm -a -t192.168.2.200:80 -r 192.168.1.10 -m -w 3</code>
<code>[root@lvs ~]</code><code># ipvsadm -a -t192.168.2.200:80 -r 192.168.1.20 -m -w 1</code>
<code>[root@lvs ~]</code><code># ipvsadm -Ln</code>
<code>IP Virtual Server version 1.2.1 (size=4096)</code>
<code>Prot LocalAddress:Port Scheduler Flags</code>
<code> </code><code>-> RemoteAddress:Port Forward Weight ActiveConn InActConn</code>
<code>TCP 192.168.2.200:80 rr</code>
<code> </code><code>-> 192.168.1.20:80 Masq 1 0 0 </code>
<code> </code><code>-> 192.168.1.10:80 Masq 3 0 0 </code>
<code>[root@lvs ~]</code><code>#</code>
儲存lvs規則
<code>[root@lvs ~]</code><code># /etc/init.d/ipvsadm save</code>
<code>Saving IPVS table to</code><code>/etc/sysconfig/ipvsadm</code><code>: [确定]</code>
<code>[root@lvs ~]</code><code># cat /etc/sysconfig/ipvsadm</code>
<code>-A -t 192.168.2.200:80 -s rr</code>
<code>-a -t 192.168.2.200:80 -r 192.168.1.20:80-m -w 1</code>
<code>-a -t 192.168.2.200:80 -r 192.168.1.10:80-m -w 3</code>
通過VIP通路
<a href="http://s3.51cto.com/wyfs02/M02/6D/54/wKioL1VhpliTRtf0AABj2FP2-TU936.jpg" target="_blank"></a>
重新整理(由于設定的權重一樣,是以刷一下會變一下。)
<a href="http://s3.51cto.com/wyfs02/M02/6D/58/wKiom1VhpM2znUc9AABpsnVw8Bw445.jpg" target="_blank"></a>
三、LVS-DR 模式示範
<a href="http://s3.51cto.com/wyfs02/M00/6D/7F/wKioL1VlkGXiezlLAAI2zqAH7C4302.jpg" target="_blank"></a>
1、 IP規則
Director:
eth0 192.168.1.100 DIP
eth0:0 192.168.1.188 VIP
RS1:
eth0: 192.168.1.10 RIP
lo0:0 192.168.1.188 VIP
RS2:
eth0: 192.168.1.20 RIP
2、關閉arp響應
web1上:
<code>[root@web1 ~]</code><code># sysctl -w net.ipv4.conf.eth0.arp_announce=2</code>
<code>net.ipv4.conf.eth0.arp_announce = 2</code>
<code>[root@web1 ~]</code><code># sysctl -w net.ipv4.conf.all.arp_announce=2</code>
<code>net.ipv4.conf.all.arp_announce = 2</code>
<code>[root@web1 ~]</code><code># echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore</code>
<code>[root@web1 ~]</code><code># echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore</code>
web2上:
<code>[root@web2 ~]</code><code># sysctl -w net.ipv4.conf.eth0.arp_announce=2</code>
<code>[root@web2 ~]</code><code># sysctl -w net.ipv4.conf.all.arp_announce=2</code>
<code>[root@web2 ~]</code><code># echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore</code>
<code>[root@web2 ~]</code><code># echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore</code>
說明:
arp_ignore: 定義接收到ARP請求時的響應級别;
0:隻要本地配置的有相應位址,就給予響應;
1:僅在請求的目标位址配置請求到達的接口上的時候,才給予響應;
arp_ignore = 1
arp_announce:定義将自己位址向外通告時的通告級别;
0:将本地任何接口上的任何位址向外通告;
1:試圖僅向目标網絡通告與其網絡比對的位址;
2:僅向與本地接口上位址比對的網絡進行通告;
arp_announce = 2
3、配置VIP
directory上:
<code>[root@lvs ~]</code><code># ifconfig eth0:0 192.168.1.188 netmask 255.255.255.0</code>
<code>[root@web1 ~]</code><code># ifconfig lo:0 192.168.1.188 broadcast 192.168.1.188 netmask 255.255.255.255 up</code>
在web2上:
<code>[root@web2 ~]</code><code># ifconfig lo:0 192.168.1.188 broadcast 192.168.1.188 netmask 255.255.255.255 up</code>
4、增加路由
<code>[root@lvs ~]</code><code># route add -host 192.168.1.188 dev eth0:0</code>
<code>[root@web1 ~]</code><code># route add -host 192.168.1.188 dev lo:0</code>
<code>[root@web2 ~]</code><code># </code>
<code>route add -host 192.168.1.188 dev lo:0</code>
5、配置lvs-dr
<code>[root@lvs ~]</code><code># ipvsadm -A -t192.168.1.188:80 -s wlc</code>
<code>[root@lvs ~]</code><code># ipvsadm -a -t192.168.1.188:80 -r 192.168.1.10 -g -w 2</code>
<code>[root@lvs ~]</code><code># ipvsadm -a -t192.168.1.188:80 -r 192.168.1.20 -g -w 1</code>
<code>TCP 192.168.1.188:80 wlc</code>
<code> </code><code>-> 192.168.1.20:80 Route 1 0 0 </code>
<code> </code><code>-> 192.168.1.10:80 Route 2 0 0 </code>
6、測試
重新整理通路VIP 192.168.1.188
<a href="http://s3.51cto.com/wyfs02/M02/6D/54/wKioL1VhpryC9cdoAABfeKqe9JM139.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/6D/58/wKiom1VhpTGjiPVtAABhO0h4kM4171.jpg" target="_blank"></a>
NAT模式中,real server的網關必須要指定為DIP;DR模式中一般不指定網關(網關指定為DIP也是ok的)
本文轉自Jacken_yang 51CTO部落格,原文連結:http://blog.51cto.com/linuxnote/1654750,如需轉載請自行聯系原作者