使用脚本实现LVS负载均衡
环境:
3台主机
DS:192.168.100.1
RS1:192.168.100.11
RS2:192.168.100.12
VIP:192.168.100.100
安装ipvsadm
./configure --prefix=/usr/local/ipvsadm
make && make install
DS脚本如下:
#!/bin/bash
# description: start LVS of DirectorServer
VIP=192.168.100.100
RIP1=192.168.100.11
RIP2=192.168.100.12
./etc/rc.d/init.d/functions
logger LVS is $1
case "$1" in
start)
/sbin/ipvsadm --set 30 5 60
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255up
/sbin/route add -host $VIP dev eth0:0
/sbin/ipvsadm -A -t $VIP:80 -s wrr -p 3
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1
touch /var/lock/subsys/ipvsadm >/dev/null 2>&1
echo "LVS is started!"
;;
stop)
/sbin/ipvsadm -C
/sbin/ipvsadm -Z
ifconfig eth0:0 down
ifconfig eth0:1 down
route del $VIP
route del $VIP
rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
echo "LVS is stoped"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm has stoped"
else
echo "ipvsadm has started"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
RS脚本如下:
#!/bin/bash
# description: Config realserver lo and apply noarp
VIP=192.168.100.100
. /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $VIP >/dev/null 2>&1
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
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
LVS+Keepalived实现负载均衡高可用
环境:
DS1:192.168.100.1
DS2:192.168.100.2
RS1:192.168.100.11
RS2:192.168.100.12
VIP:192.168.100.100
之前已经安装ipvsadm这里不再阐述
安装keepalived
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.xxxxx
make && make install
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /sbin
配置keepalived.conf
DS1:
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.100
}
}
virtual_server 192.168.100.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.100.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
DS2:
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.100
}
}
virtual_server 192.168.100.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.100.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
两台DS都启动keepalived
/etc/init.d/keepalived start
两台RS也需要都运行上文的脚本
ipvsadm -ln 查看LVS状态
ipvsadm -lnc 查看LVS链接状态
可通过一个测试页面进行测试,代码如下(每两秒刷新一次,不缓存数据):
通过不同的客户端访问,页面会轮流出现node1和node2
<html>
<head>
<title>test</title>
<meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache"/>
<meta http-equiv="Refresh" content="2"/>
</head>
<body>this is node1或2</body>
</html>