vim dirctory.sh
#!/bin/bash
#
# LVS script for VS/DR
#
. /etc/rc.d/init.d/functions
#
VIP=172.16.100.200
RIP1=172.16.100.100
RIP2=172.16.100.101
PORT=80
#
case "$1" in
start)
/sbin/ifconfig eth0:1 $VIP broadcast $VIPnetmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:1
# Since this is the Director we must beableto forward packets
echo1 > /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 forVIP192.168.0.219 port 80
# In this recipe, we will usetheround-robin scheduling method.
# In production, however, you should useaweighted, dynamic scheduling method.
/sbin/ipvsadm -A -t $VIP:80 -s wlc
# Now direct packets for this VIP to
# the real server IP (RIP) insidethecluster
/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
echo0 > /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
#sh dirctory.sh start 两台R而阿里Server配置如下:
保证正常的WEB访问即可
vim realserver.sh
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
VIP=172.16.100.200
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
# sh realserver.sh start 访问WEB服务器:
# ip addr
1: lo: mtu16436 qdisc noqueue state UNKNOWN
link/loopback00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:63:2b:5c brdff:ff:ff:ff:ff:ff
inet 172.16.100.10/24 brd 172.16.100.255 scope global eth0
inet 172.16.100.200/32 brd 172.16.100.200 scope global eth0:1
inet6 fe80::20c:29ff:fe63:2b5c/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]# 备注:
目前才在一个问题,就是如果后端的realserver宕机,如果将其从从lvs集群中剔除此服务器,并且当realserver恢复又是如何将其加入LVS集群中呢,这就是健康检查的功能,这里使用如下的脚本实现。
# vim check_health.sh
#!/bin/bash
#
VIP=172.16.100.200
CPORT=80
FAIL_BACK=127.0.0.1
RS=("172.16.100.100" "172.16.100.101")
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;
forI in ${RS
}; do
if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
fi
letCOUNT++
done
}
initstatus
while :; do
letCOUNT=0
forI 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 isback." >> $LOG
fi
else
if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] &&RSSTATUS[$COUNT]=0 && echo "`date+'%F %H:%M:%S'`, $I isgone." >> $LOG
fi
fi
let COUNT++
done
sleep 5
done 执行脚本:
# touch /var/log/ipvsmonitor.log
# chmod +x check_health.sh
# nohup ./check_health.sh &
# tail -f /var/log/ipvsmonitor.log
2014-10-25 18:11:59, 172.16.100.100 isgone.
2014-10-25 18:11:59, 172.16.100.101 isgone.
2014-10-25 18:18:08, 172.16.100.100 isback.
2014-10-25 18:23:26, 172.16.100.101 isback.
2014-10-25 18:23:56, 172.16.100.101 isgone.
2014-10-25 18:24:12, 172.16.100.101 isback. 启动和停止realserver上的服务,可以看到日志记录,LVS集群会对其进行剔除和添加功能。