LVS的工做機制以及其調度算法等一些初步瞭解在我以前的文章裏面已有記錄。請看這裏php
LVS其工做機制相似iptabls,一部分工做在用戶空間(ipvsadmin),一部分工做在內核空間;用戶空間:用於定義一些負載均衡的對象與策略,例如對TCP協議的80端口進行持久鏈接的負載,又或者對TCP協議的3306端口的鏈接進行負載等一些符合我的需求的一些規則定義算法
內核空間:用於針對用戶空間中所定義的規則對符合要求的數據包進行轉發數據庫
在整個負載均衡的架構中,全部的角色都使用了一個額外的IP地址---VIP,當一個客戶端向VIP發起請求時,此請求必須直接鏈接至Directory,而不能是後端的realserver。不然的話此負載均衡的架構就毫無任何意義了。後端
所以,在客戶端發出至VIP的鏈接請求後,只能由Directory將其MAC地址響應給客戶端或網絡中的路由設備。而Directory將會根據用戶所定義的負載規則將該請求按照所定義的某種調度算法轉發至後端的realserver了。bash
若是客戶端在請求創建至VIP的鏈接時由後端的realserver響應了其請求,那麼客戶端會在其MAC地址表中創建起一個VIP與響應其請求的realserver的MAC的對應關係,用以之後的通訊,而此刻在客戶端看來只有一個realserver而沒法意識到其餘服務器的存在,爲了不這種狀況的發生,結合實際狀況解決方案有四:服務器
一、禁止RealServer響應對VIP的ARP請求;網絡
二、在RealServer上隱藏VIP,以使得它們沒法獲知網絡上的ARP請求;架構
三、基於「透明代理(Transparent Proxy)」或者「fwmark (firewall mark)」;負載均衡
四、禁止ARP請求發往RealServers;tcp
在Linux內核2.4.26之後引入了兩個新的調整ARP棧的標誌:
arp_announce:當向別人通告本身的MAC時所採起的限制級別
arp_ignore:在響應別人的ARP廣播請求時,所使用的不一樣的模型
arp_announce類型:
0--default,使用本地的任何地址,向外通告
1--當本機具備多個IP地址時,試圖向同一網段的通告
2--必定使用同一網段的IP進行通告
arp_ignore類型:
0--default,不管是本機的IP地址,就會用任意接口進行響應
1--只響應直接請求的網卡的地址是目標地址
初步瞭解了以上,就能夠動手LVS-DR模型的搭建了:
環境介紹:
系統:RHEL5
DIP:172.23.136.139
RS1:172.23.136.149
RS2:172.23.136.148
VIP:172.23.136.150
(一)、Directory的配置
一、使用ipvsadm進行負載均衡的實現,早期須要從新編譯內核,不過如今版本的redhat默認已經直接作進內核。
##查看內核是否已經支持ipvs
modprobe ip_vs
cat /proc/net/ip_vs
二、安裝ipvsadm
yum install ipvsadm -y
並啓動ipvsadm
service ipvsadm start
第一次啓動會報一個No such file or directory的錯誤,由於lvs和iptables都是能夠講用戶所配置的規則保存在一個文件中,當系統重啓或者服務重啓後都會重讀這個規則文件,已達到規則永久有效的目的。因爲是第一次啓動並未定義規則,因此這個規則文件是不存在的,在服務啓動時重讀這個文件時就報錯了。
三、啓動ipvs腳本:
service ipvs start
- #!/bin/bash
- #
- # LVS script for VS/DR
- #
- . /etc/rc.d/init.d/functions
- #
- VIP=172.23.136.150
- RIP1=172.23.136.149
- RIP2=172.23.136.148
- PORT=80
- #
- case "$1" in
- start)
- /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
- /sbin/route add -host $VIP dev eth0:1
- # Since this is the Director we must be able to forward packets
- echo 1 > /proc/sys/net/ipv4/ip_forward
- # Clear all iptables rules.
- /sbin/iptables -F
- # Reset iptables counters.
- /sbin/iptables -Z
- # Clear all ipvsadm rules/services.
- /sbin/ipvsadm -C
- # Add an IP virtual service for VIP 172.23.136.150 port 80
- # In this recipe, we will use the round-robin scheduling method.
- # In production, however, you should use a weighted, dynamic scheduling method.
- /sbin/ipvsadm -A -t $VIP:80 -s wlc
- # Now direct packets for this VIP to
- # the real server IP (RIP) inside the cluster
- /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
- /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2
- /bin/touch /var/lock/subsys/ipvsadm &> /dev/null
- ;;
- stop)
- # Stop forwarding packets
- echo 0 > /proc/sys/net/ipv4/ip_forward
- # Reset ipvsadm
- /sbin/ipvsadm -C
- # Bring down the VIP interface
- /sbin/ifconfig eth0:1 down
- /sbin/route del $VIP
- /bin/rm -f /var/lock/subsys/ipvsadm
- echo "ipvs is stopped..."
- ;;
- status)
- if [ ! -e /var/lock/subsys/ipvsadm ]; then
- echo "ipvsadm is stopped ..."
- else
- echo "ipvs is running ..."
- ipvsadm -L -n
- fi
- ;;
- *)
- echo "Usage: $0 {start|stop|status}"
- ;;
- esac
(二)、RealServer端配置
在各個realserver端分別運行ipvsclient腳本,腳本內容以下:
- #!/bin/bash
- #
- # Script to start LVS DR real server.
- # description: LVS DR real server
- #
- . /etc/rc.d/init.d/functions
- VIP=172.23.136.150
- host=`/bin/hostname`
- case "$1" in
- start)
- # Start LVS-DR real server on this machine.
- /sbin/ifconfig lo down
- /sbin/ifconfig lo up
- echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
- echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
- echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
- echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
- /sbin/route add -host $VIP dev lo:0
- ;;
- stop)
- # Stop LVS-DR real server loopback device(s).
- /sbin/ifconfig lo:0 down
- echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
- echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
- echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
- echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
- ;;
- status)
- # Status of LVS-DR real server.
- islothere=`/sbin/ifconfig lo:0 | grep $VIP`
- isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
- if [ ! "$islothere" -o ! "isrothere" ];then
- # Either the route or the lo:0 device
- # not found.
- echo "LVS-DR real server Stopped."
- else
- echo "LVS-DR real server Running."
- fi
- ;;
- *)
- # Invalid entry.
- echo "$0: Usage: $0 {start|status|stop}"
- exit 1
- ;;
- esac
(三)、測試
訪問172.23.136.150,能夠發現負載均衡已正常工做
如今我在後端兩臺realserver上都配置了phpmyadmin,而且兩數據庫的帳號密碼均相同。如今訪問172.23.136.150/phpmyadmin 你會發現一個頗有意思的現象就是始終沒法登錄上(在使用ipvsadm定義規則時沒有定義權重)
所以Directory還須要基於「鏈接追蹤」實現將同一個客戶端的請求始終發往其第一次被分配到的realserver,ipvs會在本身的內部維護一個hash表,表中保存着不一樣的客戶端第一次請求時所分發的後端realserver,以及保存該條目的時間,當該段時間消耗完以後,鏈接還未斷開,那麼這段時間會自動延遲你所定義的持久鏈接時間。當下一個請求達到時,就會去這個表中對比,將請求分發給條目中所對應的realserver用來保證整個請求的完整性。
lvs的持久鏈接類型分如下幾種:
1.pcc:持久客戶端鏈接,在指定規則時,使用0端口表明全部的端口,即全部到達VIP的請求所有按照調度算法負載至後端的realserver
2.ppc:持久端口鏈接,明確指定請求VIP的哪一個端口的請求分發至後端的realserver
3.Netfilter marked packets:防火牆標記的持久鏈接,主要用於多端口協議間的關聯,例如在電子商務網站上,在80端口挑選了商品後,當付款的時候就會跳轉至443端口。
4.FTP持久鏈接,用於主動鏈接和被動鏈接,不多用到。
(一)、pcc
任何類型的持久鏈接均只須要在Directory上配置,realserver則不須要進行額外配置,由於這些只涉及到Directory的請求分發方法。
ipvsadm -C
ipvsadm -A -t 172.23.136.150:0 -p 360
ipvsadm -a -t 172.23.136.150:0 -r 172.23.136.148
ipvsadm -a -t 172.23.136.150:0 -r 172.23.136.149
在以前的配置基礎上執行以上配置便可。
(二)、ppc
ipvsadm -C
ipvsadm -A -t 172.23.136.150:80 -p 360
ipvsadm -a -t 172.23.136.150:80 -r 172.23.136.148
ipvsadm -a -t 172.23.136.150:80 -r 172.23.136.149
(三)、持久防火牆標記
持久防火牆標記須要結合iptables來使用
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 172.23.136.150 -m multiport --dport 80,443 -j MARK --set-mark 1
###把來自eth0全部目的地址爲172.23.136.150的80和443端口的請求綁定在一塊兒,標籤爲1
ipvsadm -C
ipvsadm -A -f 1 -p 360
ipvsadm -a -f 1 -r 172.23.136.148
ipvsadm -a -f 1 -r 172.23.136.149
(四)、FTP持久鏈接
首先要了解FTP的工做模式:21控制端口 20數據端口
被動鏈接 是隨機從1024---65000內選出一個 做爲迴應端口號,因此咱們要限制被動鏈接迴應端口的範圍。
編輯你所用的FTP軟件,vsftpd或者pure-ftpd,設置其端口範圍結合iptables打標籤
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 192.168.2.100 --dport 21 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 192.168.2.100 --dport 10000:12000 -j MARK --set-mark 1
ipvsadm -C
ipvsadm -A -f 1 -p 360
ipvsadm -a -f 1 -r 172.23.136.148
ipvsadm -a -f 1 -r 172.23.136.149
小結:
訪問172.23.136.150/phpmyadmin,如今已經能夠正常登陸進去,由於這次的鏈接被持久分發到後端的同一臺realserver上。整個請求是完整的。
查看其鏈接分配狀態,能夠發現同一個客戶端的請求都被定向至後端的同一個realserver。
ipvsadm -lcn
IPVS connection entries
pro expire state source virtual destination
TCP 01:55 FIN_WAIT 172.23.136.93:56944 172.23.136.150:80 172.23.136.149:80
TCP 01:56 FIN_WAIT 172.23.136.93:56947 172.23.136.150:80 172.23.136.149:80
TCP 01:39 FIN_WAIT 172.23.136.93:56928 172.23.136.150:80 172.23.136.149:80
TCP 01:56 FIN_WAIT 172.23.136.93:56946 172.23.136.150:80 172.23.136.149:80
TCP 01:39 FIN_WAIT 172.23.136.93:56930 172.23.136.150:80 172.23.136.149:80
TCP 01:55 FIN_WAIT 172.23.136.93:56943 172.23.136.150:80 172.23.136.149:80
TCP 01:55 FIN_WAIT 172.23.136.93:56945 172.23.136.150:80 172.23.136.149:80
TCP 01:47 FIN_WAIT 172.23.136.93:56933 172.23.136.150:80 172.23.136.149:80
TCP 01:39 FIN_WAIT 172.23.136.93:56931 172.23.136.150:80 172.23.136.149:80
TCP 14:57 ESTABLISHED 172.23.136.93:56948 172.23.136.150:80 172.23.136.149:80
TCP 05:50 NONE 172.23.136.93:0 172.23.136.150:80 172.23.136.149:80
TCP 01:39 FIN_WAIT 172.23.136.93:56932 172.23.136.150:80 172.23.136.149:80
本文出自 「My---Dream.*」 博客,請務必保留此出處http://grass51.blog.51cto.com/4356355/1109825