本篇内容主要用三个脚本来实现LVS的配置。脚本1:lvs.sh 是配置在负载均衡端,脚本2:realserver.sh 是配置后端Real Server服务器上的。脚本3:check_lvs.sh 是用在负载均衡端上来测试后端服务器的健康状态的脚本,如有一个Real Server 宕机就会自动清除,如果恢复了就再加上,后端所有服务器都宕机了,会把负载均衡端提供的错误页面加到集群中来。
规划:
负载均衡:
DIP:192.168.1.11
VIP:192.168.1.10
后台Real Server有两个分别为:
rs1:192.168.1.9
rs2:192.168.1.8
在192.168.1.11上安装ipvsadm和httpd服务,当在后端服务器都宕机时提供错误页面。
yum install ipvsadm -y
在rs1,rs2上分别安装httpd服务,并启动服务,提供网页。
yum install httpd -y
在192.168.1.11服务器上编写脚本lvs.sh
cd /opt/scripts
vim lvs.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#!/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如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#!/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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#!/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
|
本文转自 ZhouLS 51CTO博客,原文链接:http://blog.51cto.com/zhou123/1683975