负载均衡高可用之LVS+Keepalived(DR/主备)+apache
介绍:
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
实验环境:
四台机器分别安装centos6.3(本实验用的是虚拟机),两台做lvs转发器,分主和备,两个作为后端web服务器,五个ip。
名称 | IP |
LVS-MASTER | 172.16.1.176 |
LVS-BACKUP | 172.16.1.177 |
LVS-DR-VIP | 172.16.1.195 |
WEB1-REALSERVER | 172.16.1.178 |
WEB2-REALSERVER | 172.16.1.179 |
安装完系统后执行yum groupinstall -y "development tools"
实验步骤:
① 在realserver主机上实行脚本realserver,为lo:0绑定VIP地址172.16.1.195,这步分别在二个web主机上172.16.1.178、172.16.1.179实施。这步提前做,是因为以后的过程中这一步是不会发生更改的。
1. #vim /usr/local/sbin/realserver
2. #!/bin/bash
3. SNS_VIP=172.16.1.195
4. . /etc/rc.d/init.d/functions
5. case "$1" in
6. start)
7. ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
8. /sbin/route add -host $SNS_VIP dev lo:0
9. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
10. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
11. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
12. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
13. sysctl -p >/dev/null 2>&1
14. echo "RealServer Start OK"
15. ;;
16.stop)
17. ifconfig lo:0 down
18. route del $SNS_VIP >/dev/null 2>&1
19. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
20. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
21. echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
22. echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
23. echo "RealServer Stoped"
24. ;;
25.*)
26. echo "Usage: $0 {start|stop}"
27. exit 1
28.esac
29.exit 0
简单说明下上述脚本的作用:
1)vip(virtual ip)。直接路由模式的vip必须跟服务器对外提供服务的ip地址在同一个网段,并且lvs 负载均衡器和其他所有提供相同功能的服务器都使用这个vip;
2)vip被绑定在环回接口lo0:0上,其广播地址是其本身,子网掩码是255.255.255.255。这与标准的网络地址设置有很大的不同。采用这种可变长掩码方式把网段划分成只含一个主机地址的目的是避免ip地址冲突;
3)echo这段的作用是抑制arp广播。如果不做arp抑制,将会有众多的机器向其他宣称:“嗨!我是奥巴马,我在这里呢!”,这样就乱套了。
②为二台lvs主机安装lvs+keepalived软件。安装lvs软件是必须做的,因为keepalived是运行在lvs之上的,因此lvs及keepalived必须装在一个系统里面。过程如下:
1. #mkdir /usr/local/src/lvs
2. #cd /usr/local/src/lvs
3. #wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
4. #ln -s /usr/src/kernels/2.6.18-53.el5PAE-i686/[李凯(Li1] /usr/src/linux
5. #tar zxvf ipvsadm-1.24.tar.gz
6. #cd ipvsadm-1.24
7. #make
8. #make install
③编辑keepalived.conf文件,直接用keepalived实现负载均衡及高可用性。
a)Keepalved的安装
1. a)Keepalved的安装
2. #wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz
3. #tar zxvf keepalived-1.1.15.tar.gz
4. #cd keepalived-1.1.15
5. #./configure
6. #make
7. #make install
将keepalived做成启动脚务,方便管理:
1. #cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
2. #cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
3. #mkdir /etc/keepalived
4. #cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
5. #cp /usr/local/sbin/keepalived /usr/sbin/
6. #service keepalived start|stop
b)Keealived的配置
①分别在主从负载均衡服务器上配置keepalived.conf ,内容分别如下:
1. ! Configuration File for keepalived
2. global_defs {
3. notification_email {
4. yuhongchun027@163.com
5. }
6. notification_email_from sns-lvs@gmail.com
7. smtp_server 127.0.0.1
8. router_id LVS_DEVEL
9. }
10.vrrp_instance VI_1 {
11. state MASTER
12. interface eth0
13. virtual_router_id 51
14. priority 100
15. advert_int 1
16. authentication {
17. auth_type PASS
18. auth_pass 1111
19. }
20. virtual_ipaddress {
21. 172.16.1.195
22. }
23.}
24.virtual_server 172.16.1.195 80 {
25. delay_loop 6
26. lb_algo wrr
27. lb_kind DR
28. persistence_timeout 60
29. protocol TCP
30. real_server 172.16.1.178 80 {
31. weight 3
32. TCP_CHECK {
33. connect_timeout 10
34. nb_get_retry 3
35. delay_before_retry 3
36. connect_port 80
37. }
38. }
39. real_server 172.16.1.179 80 {
40. weight 3
41. TCP_CHECK {
42. connect_timeout 10
43. nb_get_retry 3
44. delay_before_retry 3
45. connect_port 80
46. }
47. }
48.}
1. ! Configuration File for keepalived
2. global_defs {
3. notification_email {
4. yuhongchun027@163.com
5. }
6. notification_email_from sns-lvs@gmail.com
7. smtp_server 127.0.0.1
8. router_id LVS_DEVEL
9. }
10.vrrp_instance VI_1 {
11. state BACKUP
12. interface eth0
13. virtual_router_id 51
14. priority 99
15. advert_int 1
16. authentication {
17. auth_type PASS
18. auth_pass 1111
19. }
20. virtual_ipaddress {
21. 172.16.1.195
22. }
23.}
24.virtual_server 172.16.1.195 80 {
25. delay_loop 6
26. lb_algo wrr
27. lb_kind DR
28. persistence_timeout 60
29. protocol TCP
30. real_server 172.16.1.178 80 {
31. weight 3
32. TCP_CHECK {
33. connect_timeout 10
34. nb_get_retry 3
35. delay_before_retry 3
36. connect_port 80
37. }
38. }
39. real_server 172.16.1.179 80 {
40. weight 3
41. TCP_CHECK {
42. connect_timeout 10
43. nb_get_retry 3
44. delay_before_retry 3
45. connect_port 80
46. }
47. }
48.}
②分别在二台lvs机上启动servciekeepalived start就可实现负载均衡及高可用集群;keepalived.conf内容说明如下:
●全局定义块
1、email通知。作用:有故障,发邮件报警。
2、Lvs负载均衡器标识(lvs_id)。在一个网络内,它应该是唯一的。
3、花括号“{}”。用来分隔定义块,因此必须成对出现。如果写漏了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。
●VRRP定义块
1、同步vrrp组vrrp_sync_group。作用:确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些?
2、实例组group。至少包含一个vrrp实例。
3、Vrrp实例vrrp_instance。实例名出自实例组group所包含的那些名字。
(1)实例状态state。只有MASTER和BACKUP两种状态,并且需要大写这些单词。其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER;当失效的MASTER所在的系统恢复时,BACKUP从MASTER恢复到BACKUP状态。
(2)通信接口interface。对外提供服务的网络接口,如eth0,eth1.当前主流的服务器都有2个或2个以上的接口,在选择服务接口时,一定要核实清楚。
(3)lvs_sync_daemon_inteface。负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。但它的机制优于Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在DR模式中,lvs_sync_daemon_inteface 与服务接口interface 使用同一个网络接口。
(4)虚拟路由标识virtual_router_id。这个标识是一个数字,并且同一个vrrp实例使用唯一的标识。即同一个vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同时在整个vrrp内是唯一的。
(5)优先级priority。这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER 的优先级高于BACKUP。若MASTER的priority值为150,那么BACKUP的priority只能是140或更小的数值。
(6)同步通知间隔advert_int。MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒。
(7)验证authentication。包含验证类型和验证密码。类型主要有PASS、AH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP 使用相同的密码才能正常通信。
4、 虚拟ip地址virtual_ipaddress。可以有多个地址,每个地址占一行,不需要指定子网掩码。注意:这个ip必须与我们在lvs客户端设定的vip相一致!
●虚拟服务器virtual_server定义块
虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。
1、虚拟服务器virtual_server。这个ip来自于vrrp定义块的第“4”步,后面一个空格,然后加上端口号。定义一个vip,可以实现多个tcp端口的负载均衡功能。
(1)delay_loop。健康检查时间间隔,单位是秒。
(2)lb_algo。负载均衡调度算法,互联网应用常使用wlc或rr。
(3)lb_kind。负载均衡转发规则。一般包括DR、NAT、TUN3种,在我的方案中,都使用DR的方式。
(4)persistence_timeout。会话保持时间,单位是秒。这个选项对动态网站很有用处:当用户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。在这里,我们来做一个假设,假定现在有一个lvs 环境,使用DR转发模式,真实服务器有3个,负载均衡器不启用会话保持功能。当用户第一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这时候,问题就可能出现了---登陆不能成功。因为没有会话保持,负载均衡器可能会把第2次的请求转发到其他的服务器。
(5)转发协议protocol。一般有tcp和udp两种。实话说,我还没尝试过udp协议类的转发。
、真实服务器real_server,也即服务器池。Real_server的值包括ip地址和端口号,多个连续的真实ip。
(1)权重weight,权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载,性能较好的机器,负载分担大些;反之,性能差的机器,则分担较少的负载,这样就可以合理的利用不同性能的机器资源。
(2)Tcp检查tcp_check。
附注:以上就是lvs+keepalived的基本配置步骤,有兴趣的同学建议可做下lvs的1+2的基本架构实验,即不需要keepalived,采用单lvs的方式,其lvs_dr脚本如下
1. #vim /usr/local/sbin/lvs-dr.sh
2. #!/bin/bash
3. #website director vip.
4. SNS_VIP=192.168.1.188
5. SNS_RIP1=192.168.1.104
6. SNS_RIP2=192.168.1.105
7. ./etc/rc.d/init.d/functions
8. logger $0 called with $1
9. case "$1" in
10. start)
11. # set squid vip
12. /sbin/ipvsadm --set 30 5 60
13. /sbin/ifconfig eth0:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP up
14. /sbin/route add -host $SNS_VIP dev eth0:0
15. /sbin/ipvsadm -A -t $SNS_VIP:80 -s wrr -p 3
16. /sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP1:80 -g -w 1
17. /sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP2:80 -g -w 1
18. touch /var/lock/subsys/ipvsadm >/dev/null 2>&1
19. ;;
20.stop)
21. /sbin/ipvsadm -C
22. /sbin/ipvsadm -Z
23. ifconfig eth0:0 down
24. route del $SNS_VIP
25. rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
26. echo "ipvsadm stoped"
27. ;;
28.status)
29. if [ ! -e /var/lock/subsys/ipvsadm ];then
30. echo "ipvsadm stoped"
31. exit 1
32. else
33. echo "ipvsadm OK"
34. fi
35. ;;
36.*)
37. echo "Usage: $0 {start|stop|status}"
38. exit 1
39.esac
40.exit 0
测试
1. 测试负载均衡
转发器:
输入命令: watch "ipvsadm "
观看主备切换,由于两个web的权重相同,所以这里数字会交替增长
在两个web服务器的 /var/www/html下分别建立index.html文件,用vim编辑,分别输入本机ip作为标识
访问虚拟ip 172.16.1.195 刷新页面连个web的ip会交替变化,说明负载均衡构建已经启用。
2. 测试lvs转发器的主备切换
关闭主转发器172.16.1.176,模拟主lvs故障,观察backup是否启用
访问172.16.1.195,刷新页面发现两个web的ip交替变化,在backup上利用watch “ipvsadm” 说明backup在master故障后接管了转发工作。
如果master恢复,由于设置的master优先级比backup高,所以转发工作又会转到master上。注意keepalived最好设置成为开机启动。
测试完成
记住软链接必须要做
$ ln -s /usr/src/kernels/2.6.32-358.18.1.el6.x86_64 /usr/src/linux
$ tar -zxf ipvsadm-1.24.tar.gz
$ cd ipvsadm-1.24
$ make && make install
$ cd ..
$ yum install openssl-devel openssl popt-devel
$ tar -zxf keepalived-1.1.20.tar.gz
$ cd keepalived-1.1.20
$ ./configure --prefix=/ && make && make install
/sbin/ifconfig lo:1 172.16.1.195 netmask 255.255.255.255
参考链接
1. http://network.51cto.com/art/201006/206831_all.htm
2. ttcPqEAtQcF5Z_VShgXAVz2kJoWMPOlYoN56mrhhEmcUFEU0eXxY23NvpdqLq9wwmBOSAeCcAECYItyhLPt3FZx6S5Tzpu
负载均衡高可用之LVS+Keepalived(DR/主备)+apache
原文地址:http://10572997.blog.51cto.com/10562997/1720702