一、LVS集群的體系結構
1.1 LVS簡介
1.2 LVS體系結構

1.3 LVS相關術語
1.4 LVS工作模式
VS/NAT: 即(Virtual Server via Network Address Translation)
也就是網絡地址翻譯技術實現虛擬服務器,當用戶請求到達調度器時,調度器將請求報文的目標地址(即虛擬IP地址)改寫成選定的Real Server地址,同時報文的目標端口也改成選定的Real Server的相應端口,最后將報文請求發送到選定的Real Server。在服務器端得到數據后,Real Server返回數據給用戶時,需要再次經過負載調度器將報文的源地址和源端口改成虛擬IP地址和相應端口,然后把數據發送給用戶,完成整個負載調度過程。

1.5 LVS調度算法

二、LVS-DR模式
2.1 LVS-DR基本工作原理
2.2 LVS-DR模式特點
2.3 ARP抑制

三、LVS-NAT模式
3.1 LVS-NAT工作原理
1.當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報 文的源IP為CIP,目標IP為VIP;
2.PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈;
3.IPVS比對數據包請求的服務是否為集群服務,若是,修改數據包的目標IP地址為后端服務器IP,然后將數據包發至POSTROUTING鏈。 此時報文的源IP為CIP,目標IP為RIP;
4.POSTROUTING鏈通過選路,將數據包發送給Real Server;
5.Real Server比對發現目標為自己的IP,開始構建響應報文發回給Director Server。 此時報文的源IP為RIP,目標IP為CIP;
6.Director Server在響應客戶端前,此時會將源IP地址修改為自己的VIP地址,然后響應給客戶端。 此時報文的源IP為VIP,目標IP為CIP。
工作邏輯圖:
3.2 LVS-NAT模式特點
1)集群節點,必須在一個網絡中;
2)真實服務器必須將網關指向負載調度器;
3)RIP 通常都是私有 IP,僅用于各個集群節點通信;
4)負載調度器必須位于客戶端和真實服務器之間,充當網關;
5)支持端口映射;
6)負載調度器操作系統必須是 Linux ,真實服務器可以使用任意系統。
四、LVS-TUN模式
4.1 LVS-TUN工作原理
1.當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP;
2.PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈;
3.IPVS比對數據包請求的服務是否為集群服務,若是,在請求報文的首部再次封裝一層IP報文,封裝源IP為為DIP,目標IP為RIP。然后發至POSTROUTING鏈。 此時源IP為DIP,目標IP為RIP;
4.POSTROUTING鏈根據最新封裝的IP報文,將數據包發至RS(因為在外層封裝多了一層IP首部,所以可以理解為此時通過隧道傳輸)。 此時源IP為DIP,目標IP為RIP;
5.RS接收到報文后發現是自己的IP地址,就將報文接收下來,拆除掉最外層的IP后,會發現里面還有一層IP首部,而且目標是自己的lo接口VIP,那么此時RS開始處理此請求,處理完成之后,通過lo接口送給eth0網卡,然后向外傳遞。 此時的源IP地址為VIP,目標IP為CIP;
6.響應報文最終送達至客戶端。
工作邏輯圖:
4.2 LVS-TUN模式特點
1)集群節點不必位于同一個物理網絡但必須都擁有公網 IP(或都可以被路由);
2)真實服務器不能將網關指向負載調度器;
3)RIP 必須是公網地址;
4)負載調度器只負責入站請求;
5)不支持端口映射功能;
6)發送方和接收方必須支持隧道功能。
五、LVS-DR模式配置腳本
在lvs director上的腳本:
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DRLOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10
RIP1=192.168.95.11
RIP2=192.168.95.12
DipName=ens33. /etc/rc.d/init.d/functions
start() {PID=`ipvsadm -Ln | grep ${VIP} | wc -l`if [ $PID -gt 0 ];thenecho "The LVS-DR Server is already running !"else#Set the Virtual IP Address/sbin/ifconfig ${DipName}:10 $VIP broadcast $VIP netmask 255.255.255.255 up/sbin/route add -host $VIP dev ${DipName}:10#Clear IPVS Table/sbin/ipvsadm -C#Set Lvs/sbin/ipvsadm -At $VIP:80 -s rr/sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -g/sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -g/bin/touch $LOCK#Run Lvsecho "starting LVS-DR Server is ok !"fi
}stop() {#clear Lvs and vip/sbin/ipvsadm -C/sbin/route del -host $VIP dev ${DipName}:10/sbin/ifconfig ${DipName}:10 down >/dev/nullrm -rf $LOCKecho "stopping LVS-DR server is ok !"
}status() {if [ -e $LOCK ];thenecho "The LVS-DR Server is already running !"elseecho "The LVS-DR Server is not running !"fi
}case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $1 {start|stop|restart|status}"exit 1
esac
exit 0
RS上的腳本:
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIPLOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10. /etc/rc.d/init.d/functions
start() {PID=`ifconfig | grep lo:10 | wc -l`if [ $PID -ne 0 ];thenecho "The LVS-DR-RIP Server is already running !"else/sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up/sbin/route add -host $VIP dev lo:10echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/eth0/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce/bin/touch $LOCKecho "starting LVS-DR-RIP server is ok !"fi
}stop() {/sbin/route del -host $VIP dev lo:10/sbin/ifconfig lo:10 down >/dev/nullecho "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/eth0/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announcerm -rf $LOCKecho "stopping LVS-DR-RIP server is ok !"
}status() {if [ -e $LOCK ];thenecho "The LVS-DR-RIP Server is already running !"elseecho "The LVS-DR-RIP Server is not running !"fi
}case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $1 {start|stop|restart|status}"exit 1
esac
exit 0
六、LVS持久連接
(1)持久客戶端連接
ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
# 添加一個 tcp 負載集群,集群地址為 172.16.0.8 ,算法為 wlc,持久化時間為 120s
(2)持久端口連接
ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
# 添加一個 tcp 負載集群,集群地址為 172.16.0.8:80 ,算法為 wlc,持久化時間為 120s
(3)持久防火墻標記連接
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10
# 添加一個防火墻規則,當目標地址為 172.16.0.8 并且 目標端口為 80 時給數據包打一個標記,設置mark 值為 10iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
# 添加一個防火墻規則,當目標地址為 172.16.0.8 并且 目標端口為 443 時給數據包打一個標記,
設置mark 值為 10service iptables save
# 保存防火墻規則持久化生效ipvsadm -A -f 10 -s wlc -p 120
# 添加一個負載調度器,當 mark 值為 10 時進行負載均衡使用wlc 算法,持久化生效時間為 120s
七、LVS高可用性實現
- keepalived
- heartbeat/corosync
- ldirectord
- 網絡層檢測, icmp
- 傳輸層檢測,端口探測
- 應用層檢測,請求某關鍵資源
[root@centos7 ~]#vim /etc/ha.d/ldirectord.cf
checktimeout=3
checkinterval=1
autoreload=yes
logfile="/var/log/ldirectord.log"
quiescent=no #當RS down時 yes將修改權重為0,此配置有bug ,no為從調度列表中刪除RS
virtual=192.168.150.100:80real=192.168.150.14 gate 1 #gate 表示DR模式,1 表示weightreal=192.168.150.15 gate 2fallback=127.0.0.1:80 gateservice=httpscheduler=wrr#persistent=600#netmask=255.255.255.255protocol=tcpchecktype=negotiatecheckport=80
[root@centos7 ~]# /etc/ha.d/ldirectord.cf
checktimeout=3
checkinterval=1
autoreload=yes
logfile=“/var/log/ldirectord.log“ #日志文件
quiescent=no #當RS down時 yes將修改權重為0,此配置有bug ,no為從調度列表中刪除RS
virtual=66 #指定VS的FWM 或 IP:PORTreal=172.16.0.7:80 gate 2 #DR模型,權重為 2real=172.16.0.8:80 gate 1fallback=127.0.0.1:80 gate #sorry serverservice=httpscheduler=wrr#protocol=tcp #如果FWM模式,此行必須注釋掉checktype=negotiatecheckport=80request="index.html"receive=“Test Ldirectord"