本篇內容主要用三個腳原本實現LVS的配置。腳本1:lvs.sh 是配置在負載均衡端,腳本2:realserver.sh 是配置後端Real Server服務器上的。腳本3:check_lvs.sh 是用在負載均衡端上來測試後端服務器的健康狀態的腳本,若有一個Real Server 宕機就會自動清除,若是恢復了就再加上,後端全部服務器都宕機了,會把負載均衡端提供的錯誤頁面加到集羣中來。web
規劃:vim
負載均衡:後端
DIP:192.168.1.11
數組
VIP:192.168.1.10bash
後臺Real Server有兩個分別爲:服務器
rs1:192.168.1.9 負載均衡
rs2:192.168.1.8curl
在192.168.1.11上安裝ipvsadm和httpd服務,當在後端服務器都宕機時提供錯誤頁面。ide
yum install ipvsadm -y函數
在rs1,rs2上分別安裝httpd服務,並啓動服務,提供網頁。
yum install httpd -y
在192.168.1.11服務器上編寫腳本lvs.sh
cd /opt/scripts
vim lvs.sh
#!/bin/bash # # LVS script for VS/DR # chkconfig: - 90 10 # . /etc/rc.d/init.d/functions # VIP=192.168.1.10 DIP=192.168.1.11 RIP1=192.168.1.9 RIP2=192.168.1.8 PORT=80 RSWEIGHT1=2 RSWEIGHT2=5 case "$1" in start) /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up #啓用eth0:0來配置VIP /sbin/route add -host $VIP dev eth0:0 #添加VIP路由信息 echo 1 > /proc/sys/net/ipv4/ip_forward #打開ip轉發功能 /sbin/iptables -F /sbin/iptables -Z #清空iptables規則 /sbin/ipvsadm -C /sbin/ipvsadm -A -t $VIP:80 -s wlc /sbin/ipvsadm -a -t $VIP:$PORT -r $RIP1:$PORT -g -w $RSWEIGHT1 /sbin/ipvsadm -a -t $VIP:$PORT -r $RIP2:$PORT -g -w $RSWEIGHT2 #添加ipvs規則 /bin/touch /var/lock/subsys/ipvsadm &> /dev/null #建立鎖文件 ;; stop) echo 0 > /proc/sys/net/ipv4/ip_forward /sbin/ipvsadm -C /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 "Usge: $0 {start|stop|status}" ;; esac
此腳本能夠加到系統服務列表中,並能夠設置開機自動啓動。
在後端服務器rs1和rs2中編寫腳本realserver.sh以下:
#!/bin/bash # # Script to start LVS DR real server. # chkconfig: - 90 10 # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=192.168.1.10 host=`/bin/hostname` case "$1" in start) /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) /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) 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 ;; *) echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac
完成後能夠啓動腳本了。
LVS自身沒有對後端服務器的健康狀態檢測功能,下面在192.168.1.11服務器上來使用腳原本每5s種檢測下後臺服務器健康狀態,並實現自動清除宕機的服務器,恢復後能夠自動添加。
vim check_lvs.sh
#!/bin/bash # # VIP=192.168.19.211 CPORT=80 FAIL_BACK=127.0.0.1 RS=("192.168.19.245" "192.168.19.219") #定義一個數組並賦值 declare -a RSSTATUS #定義一個空數組 RW=("2" "1") RPORT=80 TYPE=g #定義爲DR模型 CHKLOOP=3 LOG=/var/log/ipvsmonitor.log #定義一個添加規則的函數 addrs() { if ipvsadm -L -n | grep "$1:$RPORT" &> /dev/null;then return 0 else ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2 [ $? -eq 0 ] && return 0 || return 1 fi } #定義刪除規則的函數 delrs() { if ipvsadm -L -n | grep "$1:$RPORT" &> /dev/null;then ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT [ $? -eq 0 ] && return 0 || return 1 else return 0 fi } #定義是否要添加錯誤頁面的規則的函數 ifaddls() { if [ ${RSSTATUS[0]} -eq 0 ];then if [ ${RSSTATUS[1]} -eq 0 ];then if ipvsadm -L -n | grep "127.0.0.1:80" &> /dev/null;then echo "`date '+%F %T'` All RS is Down and Local web is up" >> $LOG else ipvsadm -a -t $VIP:$CPORT -r 127.0.0.1:80 -$TYPE [ $? -eq 0 ]; echo "`date '+%F %T'` All RS is Down! Local 127.0.0.1:80 is up!!!" >> $LOG fi else if ipvsadm -L -n | grep "127.0.0.1:80" &> /dev/null;then ipvsadm -d -t $VIP:$CPORT -r 127.0.0.1:80 fi fi else if ipvsadm -L -n | grep "127.0.0.1:80" &> /dev/null;then ipvsadm -d -t $VIP:$CPORT -r 127.0.0.1:80 fi fi } #定義檢測後端服務器服務健康狀態的函數 checkrs() { local I=1 while [ $I -le $CHKLOOP ];do if curl --connect-timeout 1 http://$1 &> /dev/null; then return 0 fi let I++ done return 1 } #檢測腳本初始化函數 initstatus() { local I local COUNT=0 for I in ${RS[*]};do if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null; then RSSTATUS[$COUNT]=1 else RSSTATUS[$COUNT]=0 fi let COUNT++ done } #腳本開始執行: initstatus ifaddls while :; do #無限循環 let COUNT=0 for I in ${RS[*]};do if checkrs $I; then if [ ${RSSTATUS[$COUNT]} -eq 0 ];then addrs $I ${RW[$COUNT]} [ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date '+%F %T'`, $I is back." >> $LOG fi else if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then delrs $I [ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date '+%F %T'`, $I is gone." >> $LOG fi fi let COUNT++ done ifaddls sleep 5 #睡眠5s再循環 done