轉載:https://blog.csdn.net/moonpure/article/details/52839132
LVS之一:三種工作模式的優缺點比較(NAT/TUN/DR)
一、Virtual server via NAT(VS-NAT) 優點:叢集中的實體伺服器可以使用任何支援TCP/IP作業系統,實體伺服器可以配置設定Internet的保留私有位址,隻有負載均衡器需要一個合法的IP位址。
缺點:擴充性有限。當伺服器節點(普通PC伺服器)資料增長到20個或更多時,負載均衡器将成為整個系統的瓶頸,因為所有的請求包和應答包都需要經過負載均衡器再生。假使TCP包的平均長度是536位元組的話,平均包再生延遲時間大約為60us(在Pentium處理器上計算的,采用更快的處理器将使得這個延遲時間變短),負載均衡器的最大容許能力為8.93M/s,假定每台實體伺服器的平台容許能力為400K/s來計算,負責均衡器能為22台實體伺服器計算。
解決辦法:即使是是負載均衡器成為整個系統的瓶頸,如果是這樣也有兩種方法來解決它。一種是混合處理,另一種是采用Virtual Server via IP tunneling或Virtual Server via direct routing。如果采用混合處理的方法,将需要許多同屬單一的RR DNS域。你采用Virtual Server via IP tunneling或Virtual Server via direct routing以獲得更好的可擴充性。也可以嵌套使用負載均衡器,在最前端的是VS-Tunneling或VS-Drouting的負載均衡器,然後後面采用VS-NAT的負載均衡器。
二、Virtual server via IP tunneling(VS-TUN)我們發現,許多Internet服務(例如WEB伺服器)的請求包很短小,而應答包通常很大。
負載均衡器隻負責将請求包分發給實體伺服器,而實體伺服器将應答包直接發給使用者。是以,負載均衡器能處理很巨大的請求量,這種方式,一台負載均衡能為超過100台的實體伺服器服務,負載均衡器不再是系統的瓶頸。使用VS-TUN方式,如果你的負載均衡器擁有100M的全雙工網卡的話,就能使得整個Virtual Server能達到1G的吞吐量。
不足:但是,這種方式需要所有的伺服器支援"IP Tunneling"(IP Encapsulation)協定,我僅在Linux系統上實作了這個,如果你能讓其它作業系統支援,還在探索之中。
三、Virtual Server via Direct Routing(VS-DR)和VS-TUN一樣,負載均衡器也隻是分發請求,應答包通過單獨的路由方法傳回給用戶端。與VS-TUN相比,VS-DR這種實作方式不需要隧道結構,是以可以使用大多數作業系統做為實體伺服器,其中包括:Linux 2.0.36、2.2.9、2.2.10、2.2.12;Solaris 2.5.1、2.6、2.7;FreeBSD 3.1、3.2、3.3;NT4.0無需打更新檔;IRIX 6.5;HPUX11等。
不足:要求負載均衡器的網卡必須與實體網卡在一個實體段上

LVS之二:負載均衡排程算法
前面的文章介紹了
LVS的三種模式:NAT、TUN、DR,那這三種模式下,如果進行負載均衡排程計算呢?這就涉及到新的知識點:
負載均衡排程算法目前LVS主要有三種請求轉發方式和10種排程算法。根據請求轉發方式的不同,所構架叢集的網絡拓撲、安裝方式、性能表現也各不相同。用LVS主要可以架構三種形式的叢集,分别是LVS/NAT、LVS/TUN和LVS/DR,可以根據需要選擇其中一種。在標明轉發方式的情況下,采用哪種排程算法将決定整個負載均衡的性能表現,不同的算法适用于不同的應用場合,有時可能需要針對特殊場合,自行設計排程算法。LVS的算法是逐漸豐富起來的,最初LVS隻提供4種排程算法,後來發展到以下10種。
一、靜态排程算法: 1.1 輪叫排程(Round Robin,RR)排程器通過“輪叫"排程算法将外部請求按順序輪流配置設定到叢集中的真實伺服器上,它均等地對待每一台伺服器,而不管伺服器上實際的連接配接數和系統負載。
1.2 權重輪叫(Weighted Round Robin,WRR)排程器通過“權重輪叫"排程算法根據真實伺服器的不同處理能力來排程通路請求。這樣可以保證處理能力強的伺服器能處理更多的通路流量。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。
1.3 目标位址散列(Destination Hashing,DH)“目标位址散列"排程算法根據請求的目标IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。
主要用于緩存伺服器的場景。 1.4 源位址散列(Source Hashing,SH)“源位址散列"排程算法根據請求的源IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。在沒有使用session共享的又需要儲存session的環境下(如電子商務網站),建議使用此算法。
二、動态排程算法: 2.1 最少連結(Least Connections,LC)排程器通過“最少連接配接"排程算法動态地将網絡請求排程到已建立的連結數最少的伺服器上。如果叢集系統的真實伺服器具有相近的系統性能,采用“最小連接配接"排程算法可以較好地均衡負載。其具體算法為:
active*256+inactive
然後挑選伺服器中上述值最小者配置設定新連接配接。
2.2 權重最少連結(Weighted Least Connections,WLC)在叢集系統中的伺服器性能差異較大的情況下,排程器采用“權重最少連結"排程算法優化負載均衡性能,具有較高權值的伺服器将承受較大比例的活動連接配接負載。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。WLC為LVS的預設排程算法。其具體算法為:
(active*256+inactive)/weight
然後挑選伺服器根據上述方法計算數字最小者配置設定新連接配接。
2.3 基于局部性的最少連結(Locality-Based Least Connections,LBLC)“基于局部性的最少連結"排程算法是針對目标IP位址的負載均衡,目前主要用于Cache叢集系統。該算法根據請求的目标IP位址找出該目标IP位址最近使用的伺服器,若該伺服器是可用的且沒有超載,将請求發送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處于一半的工作負載,則用“最少連結"的原則選出一個可用的伺服器,将請求發送到該伺服器。
類似于DH算法,不同的是,其結合了DH算法和LC算法的優勢。
2.4 帶複制的基于局部性最少連結(Locality-Based Least Connections with Replication,LBLCR)“帶複制的基于局部性最少連結"排程算法也是針對目标IP位址的負載均衡,目前主要用于Cache叢集系統。它與LBLC算法的不同之處是它要維護從一個目标IP位址到一組伺服器的映射,而LBLC算法維護從一個目标IP位址到一台伺服器的映射。該算法根據請求的目标IP位址找出該目标IP位址對應的伺服器組,按“最小連接配接"原則從伺服器組中選出一台伺服器,若伺服器沒有超載,将請求發送到該伺服器;若伺服器超載,則按“最小連接配接"原則從這個叢集中選出一台伺服器,将該伺服器加入到伺服器組中,将請求發送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,将最忙的伺服器從伺服器組中删除,以降低複制的程度。
2.5 最短的期望的延遲(Shortest Expected Delay Scheduling,SED)“最短的期望的延遲”是基于WLC算法的,隻是其計算方法不同。具體算法如下:
(active+1)*256/weight
2.6 最少隊列(Never Queue Scheduling,NQ)無需隊列。如果有台 realserver的連接配接數=0就直接配置設定過去,不需要在進行SED運算。如果沒有伺服器連接配接數為空閑,則使用SED算法。
了解這些算法原理能夠在特定的應用場合選擇最适合的排程算法,進而盡可能地保持Real Server的最佳利用性。
LVS之三:ipvsadm常用管理指令介紹
LVS全稱為Linux Virtual Server,工作在ISO模型中的第四層,由于其工作在第四層,是以與iptables類似,必須工作在核心空間上。是以lvs與iptables一樣,是直接工作在核心中的,叫ipvs,主流的linux發行版預設都已經內建了ipvs,是以使用者隻需安裝一個管理工具ipvsadm即可。
檢視核心是否已經內建ipvs:[root@lvs ~]# grep -i "ip_vs" /boot/config-2.6.32-358.18.1.el6.x86_64
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m
一、安裝ipvsadm:[root@lvs ~]# yum -y install ipvsadm
二、ipvsadm基本介紹: 2.1 叢集服務管理類指令: 2.1.1 添加叢集:# ipvs -A -t|u|f service-address [-s scheduler]
選項說明:-t: TCP協定的叢集
-u: UDP協定的叢集
service-address: IP:PORT
-f: FWM: 防火牆标記
service-address: Mark Number
示例:[root@lvs ~]# ipvsadm -A -t 172.16.1.253:80 -s wlc
2.1.2 修改叢集:# ipvs -E -t|u|f service-address [-s scheduler]
[root@lvs ~]# ipvsadm -E -t 172.16.1.253:80
-s wrr 2.1.3 删除叢集:# ipvsadm -D -t|u|f service-address
[root@lvs ~]# ipvsadm -D -t 172.16.1.253:80
2.2 管理叢集中的RealServer: 2.2.1 添加RS:# ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:事先定義好的某叢集服務
-r server-address: 某RS的位址,在NAT模型中,可使用IP:PORT實作端口映射;
[-g|i|m]: LVS類型
-g: DR
-i: TUN
-m: NAT
[-w weight]: 定義伺服器權重
[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.101 –g -w 5
[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.102 –g -w 10
2.2.2 修改RS:# ipvsadm -e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
[root@lvs ~]# ipvsadm
-e-t 172.16.1.253:80 -r 172.16.1.101 –g -w
3 2.2.3 删除RS:# ipvsadm -d -t|u|f service-address -r server-address
[root@lvs ~]# ipvsadm -d -t 172.16.1.253:80 -r 172.16.1.101
2.3 檢視類:# ipvsadm -L|l [options]
常用選項[options]如下:-n: 數字格式顯示主機位址和端口
--stats:統計資料
--rate: 速率
--timeout: 顯示tcp、tcpfin和udp的會話逾時時長
-c: 顯示目前的ipvs連接配接狀況
2.4 其他管理類: 2.4.1 删除所有叢集服務:# ipvsadm -C
該指令與iptables的-F功能類似,執行後會清除所有規則。
2.4.2 儲存規則 儲存規則至預設配置檔案:# service ipvsadm save
儲存規則至指定檔案:# ipvsadm -S > /path/to/somefile
[root@lvs ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
2.4.3 載入儲存在檔案中的規則# ipvsadm -R < /path/form/somefile
三、lvs的其他注意事項:關于時間同步:各節點間的時間偏差不大于1s,建議使用統一的ntp伺服器進行更新時間;
DR模型中的VIP的MAC廣播問題:
在DR模型中,由于每個節點均要配置VIP,是以存在VIP的MAC廣播問題,在現在的linux核心中,都提供了相應kernel 參數對MAC廣播進行管理,具體如下:
arp_ignore: 定義接收到ARP請求時的響應級别;0:隻要本地配置的有相應位址,就給予響應;
1:僅在請求的目标位址配置在到達的接口上的時候,才給予響應;DR模型使用 arp_announce:定義将自己位址向外通告時的通告級别;0:将本地任何接口上的任何位址向外通告;
1:試圖僅向目标網絡通告與其網絡比對的位址;
2:僅向與本地接口上位址比對的網絡進行通告;DR模型使用LVS之四:DR模型實作
試驗拓撲:使用iptables實作NAT配置較為簡單,主要如下:
1.2.1 開啟轉發功能:[root@router ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
如果需永久修改,則需要修改sysctl.conf檔案。并使用sysctl -p 使其立即生效。
1.2.2 配置iptables: 清除所有規則:[root@router ~]# iptables –F
配置NAT功能:[root@router ~]# iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to 192.168.8.254
[root@router ~]# iptables -t nat -A PREROUTING -d 192.168.8.254 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.253:80
##為了友善使用ssh用戶端連接配接,我還将lvs叢集中各伺服器的22端口映射到了不同端口,具體如下:
[root@router ~]# iptables -t nat -A PREROUTING -d 192.168.8.254 -p tcp --dport
2022-j DNAT --to-destination
172.16.1.252:22 2122 172.16.1.101:22 2222 172.16.1.102:22 配置轉發功能:[root@router ~]# iptables -A FORWARD -p ip -j ACCEPT
儲存規則:[root@router ~]# service iptables save
此時,Director和RealServer都已可以正常通路外網。
1.3 配置本地windows,添加路由使其能通路lvs叢集:由于試驗中實體主機(windows)和試驗用路由器(linux)的預設網關指向的是真實的路由器,是以實體主機(windows)是無法通路lvs叢集網絡的,為了能讓實體機(windows)通路到叢集網絡友善後面測試,是以需要添加路由,指令如下:
C:\windows\system32>route add 172.16.1.0/24 192.168.8.254
操作完成!
二、配置Director 2.1 啟用轉發:[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
如果想永久生效,則需要修改/etc/sysctl.conf檔案。
2.2 配置VIP和路由: 配置路由:[root@lvs ~]# route add -host 172.16.1.253 dev eth0:0
配置VIP:[root@lvs ~]# ifconfig eth0:1 172.16.1.253 netmask 255.255.255.255 up
2.3 清除原有iptables和ipvs規則:[root@lvs ~]# iptables -F
[root@lvs ~]# iptables -Z
[root@lvs ~]# ipvsadm -C
2.4 配置叢集服務: 2.5 添加RS至叢集服務:[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.101 -g
[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.102 -g
2.6 将上述過程編寫為一個服務腳本,直接在Director上實作開機啟動:#!/bin/bash
#
# LVS script for VS/DR
# chkconfig: - 90 10
. /etc/rc.d/init.d/functions
VIP=172.16.1.253
DIP=172.16.1.252
RIP1=172.16.1.101
RIP2=172.16.1.102
PORT=80
RSWEIGHT1=5
RSWEIGHT2=5
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 192.168.0.219 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 $RSWEIGHT1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2
/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;
stop)
# Stop forwarding packets
echo 0 > /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
# Bring down the VIP interface
/sbin/ifconfig eth0:0 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
将上述内容儲存在/etc/init.d/lvs-director檔案中,然後添加到服務:[root@lvs ~]# chmod +x /etc/init.d/lvs-director
[root@lvs ~]# chkconfig --add lvs-director
[root@lvs ~]# chkconfig lvs-director on
[root@lvs ~]# /etc/init.d/lvs-director start
[root@lvs ~]# /etc/init.d/lvs-director status
ipvs is running ...
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.253:80 wlc
-> 172.16.1.101:80 Route 5 0 0
-> 172.16.1.102:80 Route 5 0 0
三、配置RS: 3.1 配置ARP廣播:[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
3.2 配置VIP和路由:[root@rs1 ~]# ifconfig lo:0 172.16.1.253 netmask 255.255.255.255 up
[root@rs1 ~]# route add -host 172.16.1.253 dev lo:0
3.3 編寫為腳本:# Script to start LVS DR real server.
# description: LVS DR real server
. /etc/rc.d/init.d/functions
host=`/bin/hostname`
# 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 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 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."
echo "LVS-DR real server Running."
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
儲存至/etc/init.d/lvs-rs,并賦予執行權限,然後添加為開機啟動:[root@rs1~]# chmod +x /etc/init.d/lvs-rs
[root@rs1 ~]# chkconfig --add lvs-rs
[root@rs1 ~]# chkconfig lvs-rs on
[root@rs1 ~]# /etc/init.d/lvs-rs start
3.4 在RS2上采用相同的配置即可至此就全部完成了lvs的DR模型配置。
4 測試LVS叢集 4.1 配置web伺服器: 4.1.1 為rs1節點添加web首頁:[root@rs1 ~]# service httpd start
正在啟動 httpd:httpd: apr_sockaddr_info_get() failed for rs1
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[确定]
[root@rs1 ~]# echo "This is RS1..." >/var/www/html/index.html
4.1.2 為rs2節點添加web首頁:[root@rs2 ~]# echo "This is RS2..." >/var/www/html/index.html
4.2 通路測試:通路時觀察ipvs狀态:
Every 1.0s: ipvsadm -L -n Tue Oct 8 19:58:42 2013
-> 172.16.1.101:80 Route 5 2 8
-> 172.16.1.102:80 Route 5 1 8
LVS之五:使用腳本實作RealServer的健康檢查
上文部署的DR模型中,當一台RS當機時,ipvs是不會自動踢出該RS伺服器的,我這裡使用一個腳本實作對RS的監控檢查。
一、需求分析:腳本要能判斷RS運作情況;
當RS的web服務不能通路時,将其從lvs叢集中踢出;而當RS重新上線時,再将其加入lvs叢集;
定時檢查(死循環或cron計劃任務);
對RS的下線和上線做日志記錄。
二、web健康檢查指令:使用curl能簡單的實作對web應用可用性進行監控:
curl指令選項:
--cacert CA憑證 (SSL)
--capath CA目錄 (made using c_rehash) to verify peer against (SSL)
--compressed 要求傳回是壓縮的形勢 (using deflate or gzip)
--connect-timeout 設定最大請求時間
-H/--header 自定義頭資訊傳遞給伺服器
-i/--include 輸出時包括protocol頭資訊
-I/--head 隻顯示文檔資訊
--interface 使用指定網絡接口/位址
-s/--silent靜音模式。不輸出任何東西
-u/--user 設定伺服器的使用者和密碼
-p/--proxytunnel 使用HTTP代理
三、具體實作:VIP=192.168.8.254
CPORT=80
##使用數組RS定義所有RS伺服器
RS=("172.16.1.101" "172.16.1.102")
#定義RS狀态,後面引用
declare -a RSSTATUS
#定義權重
RW=("5" "5")
RPORT=80
#叢集類型為DR
TYPE=g
CHKLOOP=3
#監控日志
LOG=/var/log/ipvsmonitor.log
#addrs函數在RS重新上線時将其添加到叢集
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
#delrs函數在RS下線時将其從叢集中删除
delrs() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
#checkrs檢查RS狀态,如果上次均為離線狀态,則判定其為離線
checkrs() {
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1
http://$1&> /dev/null; then
return 0
let I++
done
return 1
#初始化RS狀态函數
initstatus() {
local I
local COUNT=0;
for I in ${RS[*]}; do
if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
RSSTATUS[$COUNT]=1
RSSTATUS[$COUNT]=0
let COUNT++
#執行初始化RS狀态檢查函數
initstatus
#死循環
while :; do
let COUNT=0
if checkrs $I; then
if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
sleep 5
LVS之六:使用keepalived實作LVS的DR模式熱備
一、說明:在《
》文章講述了LVS的三種轉發模式對比,我們先就用LVS的DR模式來實作Web應用的負載均衡。為了防止LVS伺服器自身的單點故障導緻整個Web應用無法提供服務,是以還得利用Keepalived實作lvs的高可用性,keepalived主要使用VRRP協定來儲存鍊路的高可用性。而VRRP(Virtual Router Redundancy Protocol)協定本身是用于實作路由器備援的協定。
LVS-DR模式的原理如下(借用别人的圖):
VIP 192.168.18.60
LVS-MASTER 192.168.18.51
LVS-BACKUP 192.168.18.52
NFS Server 192.168.18.20
MySQL 192.168.18.18
WEB1 192.168.18.61
WEB2 192.168.18.62
三、安裝LVS+Keepalived: 1、使用yum線上安裝:[root@lvs1 ~]# yum install ipvsadm keepalived –y
2、檢查安裝結果:[root@lvs1 ~]# rpm -qa |grep ipvsadm
ipvsadm-1.25-10.el6.x86_64
[root@lvs1 ~]# rpm -qa |grep keepalived
keepalived-1.2.7-3.el6.x86_64
3、服務配置:[root@lvs1 ~]# chkconfig keepalived on ##設定為開機啟動
[root@lvs1 ~]# service keepalived start ##立即啟動keepalived服務
四、配置LVS伺服器: 1、 備份配置檔案: [root@lvs1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.bak 2、 修改配置檔案,具體如下:原始的配置檔案包含了三種模式的配置,而這裡我們隻需要用到DR模式,是以最終保留配置如下:
[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf
global_defs { ##全局配置部分
# notification_email { ##下面幾行均為全局通知配置,可以實作出現問題後報警,但功能有限,是以注釋掉,并采用Nagios監視lvs運作情況
# }
# notification_email_from [email protected]
# smtp_server smtp.exmail.qq.com
# smtp_connect_timeout 30
router_id LVS_MASTER ##設定lvs的id,在一個網絡内應該是唯一的
vrrp_instance VI_1 { ##設定vrrp組,唯一且同一LVS伺服器組要相同
state
MASTER##備份LVS伺服器設定為
BACKUPinterface eth0 # #設定對外服務的接口
virtual_router_id 51 ##設定虛拟路由辨別
priority 100 #設定優先級,數值越大,優先級越高,backup設定為99,這樣就能實作當master當機後自動将backup變為master,而當原master恢複正常時,則現在的master再次變為backup。
advert_int 1 ##設定同步時間間隔
authentication { ##設定驗證類型和密碼,master和buckup一定要設定一樣
auth_type PASS
auth_pass 1111
virtual_ipaddress { ##設定VIP,可以多個,每個占一行
192.168.18.60
virtual_server 192.168.18.60 80 {
delay_loop 6 ##健康檢查時間間隔,機關s
lb_algo wrr ##
設定為
權重輪叫lb_kind DR ##負載均衡轉發規則
nat_mask 255.255.255.0 ##網絡掩碼,DR模式要保障真是伺服器和lvs在同一網段
persistence_timeout 50 ##會話保持時間,機關s
protocol TCP ##協定
real_server 192.168.18.61 80 { ##真實伺服器配置,80表示端口
weight 3 ##權重
TCP_CHECK { ##伺服器檢測方式設定
connect_timeout 5 ##連接配接逾時時間
nb_get_retry 3
delay_before_retry 3
connect_port 80
real_server 192.168.18.62 80 {
weight 3
TCP_CHECK {
connect_timeout 10
作為高可用的備份lvs伺服器配置隻需在上述配置中的master修改backup即可,其他保持相同。 3、 分别在兩台lvs伺服器上重新開機服務:[root@lvs1 ~]# service keepalived start
注:由于keepalived配置檔案有文法錯誤也能啟動,是以看到啟動了lvs服務,不代表配置檔案沒有錯誤,如果遇到lvs不能正常轉發,及時跟蹤日志進行處理。
日志跟蹤方法:
1、開兩個ssh視窗連接配接到lvs伺服器,第一個視窗運作如下指令:
[root@lvs1 ~]# tail -F /var/log/message
2、第二個視窗重新啟動keepalived服務,同時觀察視窗1中日志的變化,然後根據日志提示解決即可。
五、WEB伺服器IP綁定配置:在兩台WEB伺服器安裝并配置(非本文重點,不做web安裝配置講解),建立測試網頁,先使用實際IP進行通路測試,能正常通路後,進行如下操作:
在前面的文章中介紹DR模式時提到:
負載均衡器也隻是分發請求,應答包通過單獨的路由方法傳回給用戶端。但實際上用戶端通路時,IP都是指向的負載均衡器的ip(也就是LVS的VIP),如何能讓真是伺服器處理IP頭為VIP的請求,這就需要做下面的操作,将VIP綁定到真實伺服器的lo網口(回環),為了防止IP廣播産生IP沖突,還需關閉IP廣播,具體如下:
1、編輯開機啟動腳本:[root@web1 ~]# vim /etc/init.d/realserver
#chkconfig: 2345 79 20
#description:realserver
SNS_VIP=192.168.18.60
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
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
echo "RealServer Stoped"
echo "Usage: $0 {start|stop}"
exit 0
腳本說明:0:隻要本地配置的有相應位址,就給予響應;預設;
1:僅在請求的目标位址配置在到達的接口上的時候,才給予響應;
0:将本地任何接口上的任何位址向外通告;預設;
2:僅向與本地接口上位址比對的網絡進行通告;
2、 設定腳本開機啟動并立即啟動:[root@web1 ~]# chkconfig realserver on
[root@web1 ~]# service realserver start
RealServer Start OK
3、 檢測IP配置:[root@web1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:56:B3:54:5A
inet addr:192.168.18.61 Bcast:192.168.18.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:feb3:545a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:98940 errors:4 dropped:4 overruns:0 frame:0
TX packets:82037 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:23077218 (22.0 MiB) TX bytes:16043349 (15.3 MiB)
Interrupt:18 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:300 errors:0 dropped:0 overruns:0 frame:0
TX packets:300 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:528420 (516.0 KiB) TX bytes:528420 (516.0 KiB)
lo:0 Link encap:Local Loopback
inet addr:
192.168.18.60Mask:255.255.255.255
4、 測試LVS:在lvs master伺服器上運作如下指令:
[root@lvs1 ~]# watch -n 1 ipvsadm -ln
在多台用戶端通過浏覽器通路VIP或域名(域名需解析到VIP),看能否擷取到正确的頁面,且同時觀察上述視窗的變化。
從上圖(為了友善觀察,使用了壓力測試)可以看出,通路被正常的分擔到了兩台後端web伺服器 。
六、後繼問題探讨:1、使用者新上傳的附件存放問題;目前我們采用的是NFS方式解決,但存在單點故障,需要配合其他方式解決。NFS的基本用法請參考《
NFS的配置和使用》
2、後端資料庫高可用性;
3、會話共享和保持問題(Session共享);算法調整為SH可解決,但有RealServer當機時,其上的session也會丢失。後期将調整為實作共享session。
LVS之七:使用持久連接配接解決session問題
前面在讨論LVS算法中,SH算法可以實作将同一用戶端的請求總是發送給第一次指定的RS,除非該RS出現故障不能再提供服務。其實在LVS叢集中,持久連接配接功能也能在一定時間内,将來自同一個用戶端請求派發至此前標明的RS,而且是無關算法的。
持久連接配接的三種類型:在基于SSL的加密https協定中,特别需要用到持久連接配接,因為用戶端需要與伺服器進行交換證書并協商加密算法等。
如果一個叢集中提供了兩種服務,持久連接配接會将同一用戶端的所有請求都同步到同一RS。持久連接配接分三種:
PPC(持久端口連接配接):将來自于同一個用戶端對同一個叢集服務的請求,始終定向至此前標明的RS;
PCC(持久用戶端連接配接):将來自于同一個用戶端對所有端口的請求,始終定向至此前標明的RS;PCC是把所有端口統統定義為叢集服務,一律向RS轉發;
PNMPP:持久防火牆标記連接配接。使用iptables的标記功能,可以實作給多個服務(端口)打上相同的标記,然後在ipvsadm使用-f選項,并使用上述防火牆标記即可将多個服務放到一個LVS叢集中。實作過程如下:
# iptables -t mangle -A PREROUTING -d 192.168.8.253 -p tcp --dport 80 -i $INCARD -j MARK --set-mark
10# iptables -t mangle -A PREROUTING -d 192.168.8.253 -p tcp --dport 443 -i $INCARD -j MARK --set-mark
# ipvsadm -A -f
-s wlc –p 600
持久連接配接模闆檢視:LVS的持久連接配接又叢集的持久連接配接模闆(一個記憶體緩沖區)提供;該持久連接配接模闆儲存着每一個用戶端及配置設定給它的RS的映射關系。使用如下指令可以檢視該模闆:
[root@lvs ~]#
ipvsadm -L -cIPVS connection entries
pro expire state source virtual destination
TCP 01:56 FIN_WAIT 192.168.8.12:51822 172.16.1.253:http 172.16.1.102:http
TCP 01:57 FIN_WAIT 192.168.8.12:51825 172.16.1.253:http 172.16.1.101:http
TCP 01:56 FIN_WAIT 192.168.8.12:51821 172.16.1.253:http 172.16.1.101:http
TCP 01:42 FIN_WAIT 192.168.8.12:51814 172.16.1.253:http 172.16.1.102:http
TCP 01:57 FIN_WAIT 192.168.8.12:51826 172.16.1.253:http 172.16.1.102:http
TCP 01:57 FIN_WAIT 192.168.8.12:51824 172.16.1.253:http 172.16.1.102:http
TCP 01:56 FIN_WAIT 192.168.8.12:51820 172.16.1.253:http 172.16.1.102:http
TCP 14:58 ESTABLISHED 192.168.8.12:51828 172.16.1.253:http 172.16.1.102:http
TCP 01:55 FIN_WAIT 192.168.8.12:51815 172.16.1.253:http 172.16.1.101:http
TCP 01:56 FIN_WAIT 192.168.8.12:51823 172.16.1.253:http 172.16.1.101:http
TCP 01:57 FIN_WAIT 192.168.8.12:51827 172.16.1.253:http 172.16.1.101:http
配置并啟用lvs叢集的持久連接配接: 基本文法:ipvsadm -A|E ... -p timeout
timeout: 持久連接配接時長,預設300秒;機關是秒;
在使用《
》中的lvs叢集,每次重新整理用戶端時,都會在RS1和RS2上切換。如下圖:
[root@lvs ~]# ipvsadm -L -n
-> 172.16.1.101:80 Route 5 0 1
-> 172.16.1.102:80 Route 5 0 2
[root@lvs ~]# ipvsadm -E -t 172.16.1.253:80 -p 600
TCP 172.16.1.253:80 wlc persistent 600
-> 172.16.1.102:80 Route 5 0 1
此時再次重新整理用戶端,會發現已經不會再改變RS。
[root@lvs ~]# ipvsadm -L --persistent-conn
Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
-> RemoteAddress:Port
TCP 172.16.1.253:http wlc persistent 600
-> 172.16.1.101:http 5 0 0 0
->
172.16.1.102:http 5 1 0 14