在上一篇中介紹了負載均衡及集羣的原理,本篇主要介紹下下實現負載均衡的軟件之LVS的原理及應用。linux
1、LVS的介紹web
一、 LVS的定義算法
通常來講,LVS採用三層結構:負載調度器、服務器池、共享存儲。工做在TCP/IP協議的四層,其轉發是依賴於四層協議的特徵進行轉發的,因爲其轉發要依賴於協議的特徵進行轉發,所以須要在內核的TCP/IP協議棧進行過濾篩選,可想而知,這就須要在內核的模塊來完成,而這樣的過濾轉發規則又是由管理員進行定義的,因此,LVS就是兩段式的架構設計,在內核空間中工做的是"ipvs",而在用戶空間中工做的,用來定義集羣服務規則的是"ipvsadm"。這就很容易想到iptables而LVS正好工做在iptables的input鏈上。vim
二、 LVS的組成後端
ipvsadm:用於管理集羣服務的命令行工具,工做於Linux系統中的用戶空間。緩存
ipvs:爲lvs提供服務的內核模塊,工做於內核空間 (相對因而框架,經過ipvsadm添加規則,來實現ipvs功能)。服務器
注:在linux內核2.4.23以前的內核中模塊默認是不存在的,須要本身手動打補丁,而後把此模塊編譯進內核纔可使用此功能。網絡
三、 LVS中每一個主機IP地址的定義session
VIP:Director用來向客戶端提供服務的IP地址,也是DNS解析的IP架構
RIP:集羣節點(後臺真正提供服務的服務器)所使用的IP地址
DIP:Director用來和RIP進行交互的IP地址
CIP:公網IP,客戶端使用的IP
四、 LVS的三種轉發模式
LVS-NAT:網絡地址轉換 NetworkAddress Translation
LVS-DR:直接路由 Direct Routing
LVS-TUN:IP隧道 IP Tunneling
五、 LVS的三種轉發模式特色
NAT
a、 集羣節點跟director必須在同一個網段上面
b、 RIP一般是私有地址,僅用於個集羣
c、 支持口映射
d、 realsever可使用任意OS(操做系統)
e、 較大規模應用場景中director已成爲系統瓶頸
![1.png wKioL1VhpImj1h9bAAG4JwE9yOM843.jpg](http://static.javashuo.com/static/loading.gif)
DR:
a、集羣節點跟director必須在同一個物理網絡中
b、RIP可使用公網地址.實現便捷的遠程控制服務器
c、director只負責處理入站請求,相應報文則有realserver直接發往客戶端
d、realserver不能將網關指向DIP
e、director不支持端口映射
f、大多數操做系統都能應用在realserver上
g、DR比NAT能處理更多的realserver
![2.png wKiom1Vho7uCI6ubAAJB7shGt5E167.jpg](http://static.javashuo.com/static/loading.gif)
TUN:
a、各集羣節點能夠跨越不一樣的網絡
b、RIP必須是公網地址
c、director只負責處理入站請求,相應報文則有realserver直接發往客戶端
d、realserver網管不能指向director
e、只有支持隧道共跟那個的os才能用戶realserver
不支持端口映射
注:在實際應用中用的很少這裏就再也不具體演示!
![3.png wKioL1VhpZzjklxZAAI36dzw39Q579.jpg](http://static.javashuo.com/static/loading.gif)
一、 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 。
二、 定義集羣服務規則的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
2、LVS-NAT模式演示
簡單實驗拓撲以下:
![5.png wKiom1VhpH6SpWSOAAHJ_M2bq7I129.jpg](http://static.javashuo.com/static/loading.gif)
Web Server 1測試頁
![6.png wKioL1VhpeyBMnOUAABfvrEid30516.jpg](http://static.javashuo.com/static/loading.gif)
Web Server 2測試頁
![7.png wKiom1VhpGDQMQHWAABfgfbVpZI040.jpg](http://static.javashuo.com/static/loading.gif)
lvs主機上的操做:
[root@lvs ~]
# yum -y install kernel-devel popt-static gcc libnl* libpopt*
[root@lvs ~]
# ln -s/usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux
[root@lvs ~]
# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
[root@lvs ~]
# tar -zxf ipvsadm-1.24.tar.gz
[root@lvs ~]
# cd ipvsadm-1.24
[root@lvs ipvsadm-1.24]
# make &&make install
開啓ip轉發
[root@lvs ~]
# vim /etc/sysctl.conf
把net.ipv4.ip_forward = 0改成net.ipv4.ip_forward= 1
[root@lvs ~]
# sysctl –p
配置lvs-nat模型
[root@lvs ~]
# ipvsadm -A -t192.168.2.200:80 -s rr
[root@lvs ~]
# ipvsadm -a -t192.168.2.200:80 -r 192.168.1.10 -m -w 3
[root@lvs ~]
# ipvsadm -a -t192.168.2.200:80 -r 192.168.1.20 -m -w 1
[root@lvs ~]
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.200:80 rr
-> 192.168.1.20:80 Masq 1 0 0
-> 192.168.1.10:80 Masq 3 0 0
[root@lvs ~]
#
保存lvs規則
[root@lvs ~]
# /etc/init.d/ipvsadm save
Saving IPVS table to
/etc/sysconfig/ipvsadm
: [肯定]
[root@lvs ~]
# cat /etc/sysconfig/ipvsadm
-A -t 192.168.2.200:80 -s rr
-a -t 192.168.2.200:80 -r 192.168.1.20:80-m -w 1
-a -t 192.168.2.200:80 -r 192.168.1.10:80-m -w 3
[root@lvs ~]
#
經過VIP訪問
![1.png wKioL1VhpliTRtf0AABj2FP2-TU936.jpg](http://static.javashuo.com/static/loading.gif)
刷新(因爲設置的權重同樣,因此刷一下會變一下。)
![2.png wKiom1VhpM2znUc9AABpsnVw8Bw445.jpg](http://static.javashuo.com/static/loading.gif)
3、LVS-DR 模式演示
3、LVS-DR 模式演示
![a.png wKioL1VhpovTvGKNAAIz6ewUXgo647.jpg](http://static.javashuo.com/static/loading.gif)
一、 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
lo0:0 192.168.1.188 VIP
2、關閉arp響應
web1上:
[root@web1 ~]
# sysctl -w net.ipv4.conf.eth0.arp_announce=2
net.ipv4.conf.eth0.arp_announce = 2
[root@web1 ~]
# sysctl -w net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_announce = 2
[root@web1 ~]
# echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@web1 ~]
# echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
web2上:
[root@web2 ~]
# sysctl -w net.ipv4.conf.eth0.arp_announce=2
net.ipv4.conf.eth0.arp_announce = 2
[root@web2 ~]
# sysctl -w net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.arp_announce = 2
[root@web2 ~]
# echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@web2 ~]
# echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
說明:
arp_ignore: 定義接收到ARP請求時的響應級別;
0:只要本地配置的有相應地址,就給予響應;
1:僅在請求的目標地址配置請求到達的接口上的時候,纔給予響應;
arp_ignore = 1
arp_announce:定義將本身地址向外通告時的通告級別;
0:將本地任何接口上的任何地址向外通告;
1:試圖僅向目標網絡通告與其網絡匹配的地址;
2:僅向與本地接口上地址匹配的網絡進行通告;
arp_announce = 2
3、配置VIP
directory上:
[root@lvs ~]
# ifconfig eth0:0 192.168.1.188netmask 255.255.255.0
web1上:
[root@web1 ~]
# ifconfig lo:0 192.168.1.188 broadcast 192.168.1.188 netmask 255.255.255.255 up
在web2上:
[root@web2 ~]
# ifconfig lo:0 192.168.1.188 broadcast 192.168.1.188 netmask 255.255.255.255 up
4、增長路由
directory上:
[root@lvs ~]
# route add -host 192.168.1.188 dev eth0:0
web1上:
[root@web1 ~]
# route add -host 192.168.1.188 dev lo:0
web2上:
[root@web2 ~]
#
route add -host 192.168.1.188 dev lo:0
5、配置lvs-dr
[root@lvs ~]
# ipvsadm -A -t192.168.1.188:80 -s wlc
[root@lvs ~]
# ipvsadm -a -t192.168.1.188:80 -r 192.168.1.10 -g -w 2
[root@lvs ~]
# ipvsadm -a -t192.168.1.188:80 -r 192.168.1.20 -g -w 1
[root@lvs ~]
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.188:80 wlc
-> 192.168.1.20:80 Route 1 0 0
-> 192.168.1.10:80 Route 2 0 0
[root@lvs ~]
#
6、測試
刷新訪問VIP 192.168.1.188
![b.png wKioL1VhpryC9cdoAABfeKqe9JM139.jpg](http://static.javashuo.com/static/loading.gif)
![c.png wKiom1VhpTGjiPVtAABhO0h4kM4171.jpg](http://static.javashuo.com/static/loading.gif)
本文出自 「一步步踏入Linux世界」 博客,請務必保留此出處http://linuxnote.blog.51cto.com/9876511/1654750