DR类型中,Director和RealServer的配置脚本示例:
Director脚本:
#!/bin/bash
#
# LVS script for VS/DR
# chkconfig: - 90 10
#
. /etc/rc.d/init.d/functions
#
VIP=172.16.100.1
DIP=172.16.100.2
RIP1=172.16.100.7
RIP2=172.16.100.8
PORT=80
RSWEIGHT1=2
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:0
# 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
/sbin/ipvsadm -C
# 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
RealServer脚本:
#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
VIP=172.16.100.1
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
后端服务健康状态检查,功能如果两个realserver都挂了则127.0.0.1启动。
#!/bin/bash
VIP=115.24.12.121
CPORT=80
FAIL_BACK=127.0.0.1
RS=("115.24.12.123" "115.24.12.124")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80
TYPE=g
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT
-$TYPE -w $2
[ $? -eq 0 ] && return 0 || return
1
}
delrs() {
ipvsadm -d -t $VIP:$CPORT -r
$1:$RPORT
[ $? -eq 0 ] && return 0 || return
1
}
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
}
let num=0
declare -i FLAG=1
initstatus
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 %H:%M:%S'`, $I is
back." >> $LOG
fi
else
if [
${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] &&
RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is
gone." >> $LOG
fi
fi
let COUNT++
done
let sum=0
for II in ${RSSTATUS[*]}; do
let sum=$II+$sum
done
if [ $sum -eq 0 ];then
let num++
else
let num=$num-$num
fi
if [ $sum -eq 0 ]&&[ $num -eq 1
];then
FLAG=0
addrs
$FAIL_BACK 1
[ $?
-eq 0 ] && echo "`date +'%F %H:%M:%S'`, $FAIL_BACK is
start." >> $LOG
fi
if [ $num -eq 0 ]&&[ $sum -gt 0
]&&[ $FLAG -eq 0 ];then
FLAG=1
delrs
$FAIL_BACK
[ $?
-eq 0 ] && echo "`date +'%F %H:%M:%S'`, $FAIL_BACK is
stop." >> $LOG
fi
sleep 5
done
测试:现在关掉realserver1
日志信息:2016-06-09 07:01:45, 115.24.12.123 is gone.
打开realserver1
日志信息:2016-06-09
07:02:33, 115.24.12.123 is back.
现在关掉realserver2
日志信息:2016-06-09 07:01:45,
115.24.12.124 is gone.
打开realserver2
日志信息:2016-06-09 07:02:33, 115.24.12.124
is back.
同时关掉realserver1与realserver2
日志信息:
2016-06-09 07:04:18, 115.24.12.124 is gone.
2016-06-09 07:04:23, 115.24.12.123 is gone.
2016-06-09 07:04:23, 127.0.0.1 is start.
同时打开realserver1与realserver2
日志信息:
2016-06-09 07:05:12, 115.24.12.123 is back.
2016-06-09 07:05:13, 127.0.0.1 is stop.
2016-06-09 07:05:18, 115.24.12.124 is back.