【伍哥原创】
环境和网络拓扑图:
用户机 192.168.1.30 windows系统
服务器 192.168.1.34 LVS(直接路由方式)的master机器,负载均衡
服务器 192.168.1.27 LVS(直接路由方式)的backup机器,但master挂机时接管负载均衡
服务器 192.168.1.101 real web server A,通过nginx提供http服务
服务器 192.168.1.102 real web server B,通过nginx提供http服务
虚拟IP 192.168.1.200,面向用户的服务IP
PS,如果没有这么多测试机器,可以把lvs-master和web-server-a合并,lvs-backup和web-server-b合并,配置稍微改一下,这样也是完全可以的。
1,LVS直接路由方式负载均衡的原理
LVS直接路由方式工作在数据链路层(第二层),它通过把数据包的MAC地址修改成后端实际服务器的MAC地址来实现负载的调度;实际服务器的响应 数据包直接返回到用户机,而不须经过负载调度服务器。这样做了以后,马上面临的一个问题是数据包的目标IP地址和后端实际服务器自己的IP地址不一致。这 时候就需要通过添加IP别名来处理,就是说把面向用户的服务IP作为别名添加到本地回环接口lo,这样做就可以让数据包认为自己来对了地方。另外,还必须 防止后端实际服务器响应针对IP别名的ARP广播。关于ARP详情大家可以自己google一下,简单来说就是为了获得某个IP对应的MAC地址而做广 播,而对应的那个IP的机器就会做出响应。
2,安装real web server
nginx的安装就不说了,可以参考伍哥前面的文章。接着跑一个shell脚本处理IP别名和ARP广播。
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
|
#!/bin/bash
# 命名为realserver.sh
LVS_VIP=192.168.1.200
.
/etc/rc
.d
/init
.d
/functions
case
"$1"
in
start)
ifconfig
lo:0 $LVS_VIP netmask 255.255.255.255 broadcast $LVS_VIP
/sbin/route
add -host $LVS_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
"Real Server Start OK"
;;
stop)
ifconfig
lo:0 down
route del $LVS_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
"Real Server Stoped"
;;
*)
echo
"Usage: $0 {start|stop}"
exit
1
esac
exit
0
|
接着启动nginx和realserver
1
2
|
/usr/local/nginx/sbin/nginx
#伍哥的nginx是编译安装的,监听80端口
sh realserver.sh start
|
3,安装负载调度服务器
分两步来,先安装好ipvsadm,再安装keepalived。
安装好ipvsadm
1
2
3
4
5
6
7
8
|
ntpdate 210.72.145.44
#校对一下时间
yum -y
install
libnl* popt*
ln
-s
/usr/src/kernels/2
.6.32-220.23.1.el6.i686/
/usr/src/linux
cd
/usr/src
wget http:
//www
.linuxvirtualserver.org
/software/kernel-2
.6
/ipvsadm-1
.26.
tar
.gz
tar
zxf ipvsadm-1.26.
tar
.gz
cd
ipvsadm-1.26
make
&&
make
install
|
安装keepalived (这时候keepalived可以包含lvs的功能了)
1
2
3
4
5
6
7
8
9
10
11
|
cd
/usr/local/src
wget http:
//www
.keepalived.org
/software/keepalived-1
.2.2.
tar
.gz
tar
zxf keepalived-1.2.2.
tar
.gz
cd
keepalived-1.2.2
.
/configure
--prefix=
/usr/local/keepalived
make
&&
make
install
cd
/usr/local/keepalived
cp
sbin
/keepalived
/usr/sbin/
cp
etc
/sysconfig/keepalived
/etc/sysconfig/
cp
etc
/rc
.d
/init
.d
/keepalived
/etc/init
.d/
mkdir
/etc/keepalived
#配置文件的目录
|
配置LVS-DR-MASTER服务器的keepalived:/ete/keepalived/keepalived.conf
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
|
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER #备机器改为BACKUP
interface eth0
virtual_router_id 51
priority 100 #备机器改为小于100,比如80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200
}
}
virtual_server 192.168.1.200 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.1.101 80 {
weight 3
TCP_CHECK {
connect_timeout 1
nb_get_retry 3
connect_port 80
}
}
real_server 192.168.1.102 80 {
weight 1
TCP_CHECK {
connect_timeout 1
nb_get_retry 3
connect_port 80
}
}
}
|
接着配置LVS-DR-BACKUP服务器的keepalived:/ete/keepalived/keepalived.conf:
1
2
3
4
|
...
state MASTER #备机器改为BACKUP
...
priority 100 #备机器改为小于100,比如80
|
4,测试
4.2 测试高可用,把服务器 192.168.1.34 LVS(直接路由方式)的master机器上的keepalived停掉
4.3 测试高可用,把服务器 192.168.1.101 real web server A的nginx停掉