通过keepalived实现LVS的高可用
Keepalived是实现LVS的高可用的工具,它在linux中模拟了一个类似路由中的VRRP协议;它的在linux中的工作机制和VRRP协议几乎一样!因此在了解keepalived时,先了解一下路由器中的VRRP协议!
在路由中VRRP协议保证了内网中用户访问外网络的可靠性,不会因为一个路由器出了问题,而使得内网无法和外网进行通信,导致一些服务器无法连上互联网,使其业务中断!由此可见的出VRRP的重要性!要实现VRRP协议至少要有两个路由,一个为主,另一个为备;主路由器主要提供为内网用户连接互联网,而备路由器则是用于替换主路由器!当主路由出了故障,备份路由要即时替代主路由器实现内网与外网连接,而此时的备路由器就成为了主路由,如果出故障的主路由器修复好了又上线,它还会成为主路由器,备份路由器又被打回原形了,依然是备份路由器!
而在路由中,VRRP将局域网内的一组路由器划分在一起,称为一个备份组。备份组由一个Master路由和多个Backup路由器组成,也就是一个主路由器和多个备份由器组成。备份组中路由器是有优先级的,这就是备份路由如何实现成为主路由,主路由上线又如何成为主路由的原因!优先级高的越有可能成为Master路由器。VRRP优先级的取值范围为0到255,可配置的范围是1到254,0为系统保留给特殊用途来使用的,255则是系统保留给IP地址拥有者。
备份组功能上相同于一台虚拟路由器,它具有IP地址。局域网内的主机仅需要知道这个虚拟路由器的IP地址,并简单配置就能实现访问外网的可靠性!如图:
当Master出了故障,它的优先级会降低,从而使得Backup的优先级高于Master,Backup成为主路由,其虚拟路由的IP会飘逸到Backup,通过Backup连接外网!
其实,路由器通过抢占和非抢占方式实现工作的,非抢占将是Master路由没有出现故障,Backup的优先级再高也不能成为Master;而抢占则是谁的优先级高,谁成为Master。
备份组中的路由器也有认证方式;md5、simpl(简单字符认证),更够更有效实现安全上网。
VRRP的定时器:VRRP通告报文时间间隔定时器:VRRP备份组中的Master路由器发VRRP报文,通知备份组内的路由器自己工作是否正常。
VRRP抢占延迟时间定时器:为了避免备份组内的成员频繁进行主备状态转成,让Backup有足够时间搜集必要的信息,Backup路由器收到优先级低于本地优先级的通告本文后,不会立即抢占成为Master,而是等待一定时间--抢占延迟时间后,才会对外发送VRRP通告报文取代原来的Master路由器。
每个备份组都有自己的ID,通过不同的ID号来判断备份组;同一个备份主还可以通过不同的ID,路由器的不同类型来实现多主共存。比如:一个备份组ID为50且有两个路由器,router1和router2,这里定义router1为Master,而router2为Backup,虚拟IP为172.16.15.1,用户经过172.16.15.1访问外网;而同一备份组设置的ID为51且router1为Backup,router2为Master,虚拟IP为172.16.15.3,用户通过172.16.15.3也能访问外网,这样就实现了多主共存了,且可以更有效的利用资源!
VRRP的工作机制就是这样,keepalived也是如此;不过keepalived在linux中不是实现Master路由器和Backup路由器的高可用,它是实现调度器,也就是director的高可用的!
要说director,不妨先说一下负载均衡的LVS模式:
LVS实现了更智能,更人性化的服务器负载均衡,它能根据不同服务器的性能,分发不同的用户请求,还能有效的排除故障服务器,并通知管理员!LVS模式为何能有效的,科学的实现用户请求分发的呢?其实,LVS在同一类服务器前端,应用了一个调度器(director),用户只需将请求发送到director,让director帮忙请求即可,director在通过调度算法来分配用户请求给服务器,然后众多服务器在去响应分配来的请求!如下示意图:
试想一下,如果director无法工作了,出故障了,后果会如何?那绝对是致命的,因此,我们应当实现director的高可用。何为高可用?高可用就是:平均在线时长/(平均在线时长+故障维修时长),其值越大高可用性能越强,所有故障维修时长越短越好,为了实现director的高可用,在给其添加一个director,当主director除了故障,让备用的director代替主director来工作;因此就要用到keepalived来实现!
通过Keepalived实现LVS的高可用性:
配置前提:
四台主机,两台作为realserver,分别为RS1、RS2,两台作为director;realserver要关闭arp功能!这里操作均在虚拟机上完成!使用的软件包分别为ipvsadm-1.24-13.el5.i386.rpm、 keepalived-1.2.7-5.el5.i386.rpm
说明:DIR1、DIR2均按装有keepalived,ipvsadm,DIR1为Master,DIR2为Backup,其IP分配如下:
RS1:IP=172.16.15.1
RS2:IP=172.16.15.2
DIR1: IP=172.16.15.3
DIR2: IP=172.16.15.4
VIP=172.16.15.100
RS1:
# yum install httpd# echo “RS1.jun.com
” >> /var/www/html/index.html# serive httpd start# sysctl -w net.ipv4.conf.eth0.arp_announce=2# sysctl -w net.ipv4.conf.all.arp_announce=2# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore# ifconfig lo:0 172.16.15.100 broadcast 172.16.15.100 netmask 255.255.255.255 up# route add -host 172.16.15.100 dev lo:0
RS2:
# yum install httpd# echo “RS2.jun.com
” >> /var/www/html/index.html# service httpd start# sysctl -w net.ipv4.conf.eth0.arp_announce=2# sysctl -w net.ipv4.conf.all.arp_announce=2# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore# ifconfig lo:0 172.16.15.100 broadcast 172.16.15.100 netmask 255.255.255.255 up# route add -host 172.16.15.100 dev lo:0
DIR1:
# yum --nogpgcheck --localinstall keepalived-1.2.7-5.el5.i386.rpm ipvsadm# vim /etc/keepalived/keepalived.confvrrp_script chk_schedown { #模式实现keepalived故障情况script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"interval 2weight -2}vrrp_instance VI_1 { #定义备份组state MASTER #其备份组为Masterinterface eth0virtual_router_id 50 #定义备份组的IDpriority 101 #优先级定义advert_int 1authentication { #认证方式auth_type PASS #基于简单字符认证auth_pass keepalive}track_interface {eth 0}virtual_ipaddress { #定义VIP的地址172.16.15.100/16 dev eth0 label eth0:0 #附属在eth0:0上}track_script {chk_schedown}virtual_server 172.16.15.100 80 { #VIP启动的服务delay_loop 6lb_algo wlc #调度算法为wlclb_kind DRnat_mask 255.255.0.0persistence_timeout 50 #持久连接的超时时长protocol TCPreal_server 172.16.15.1 80 { #定义realserver服务器,RS1weight 2HTTP_GET { #通过HTTP_GET实现健康状况检查url {path /status_code 200 #网页成功响应号为200,作为探测机制}connect_timeout 2 #探测连接时长nb_get_retry 3 #探测次数delay_beforce_retry 1 #延迟时长}}real_server 172.16.15.2 80 { #定义RS2weight 1HTTP_GET {url {path /status_code 200}connect_timeout 2nb_get_retry 3delay_beforce_retry 1}}# service keepalived start# scp /etc/keepalived/keepalived.conf 172.16.15.2:/etc/keepalived/keepalived.conf
DIR2:
# # yum --nogpgcheck --localinstall keepalived-1.2.7-5.el5.i386.rpm ipvsadm# vim /etc/keepalived/keepalived.conf
修改如下内容,其他配置与DIR1一样:
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 50priority 100}# service keepalived start
用浏览器访问172.16.15.100结果如图:
每次刷新会根据调度算法,出现不同的内容!
在DIR1上实现测试,创建一个文件down,模拟director故障!
# cd /etc/keepalived# touch down
在DIR2上可用看到eth0:0的IP,及ipvs规则,如下图:
用Keepalived实现web的高可用:
说明:DIR1与DIR2都要成为web服务器,且必须配有keepalived,要有两个备份组,这两个备份组互为备份!
DIR1:
# yum --nogpgcheck --localinstall keepalived-1.2.7-5.el5.i386.rpm ipvsadm httpd# echo "DIR1.jun.com
" >> /var/www/html/index.html# service httpd start# vim /etc/keepalived/keepalived.confvrrp_script chk_httpd { #定义的httpd脚本执行过程script "killall -0 httpd" #试探性杀死httpdinterval 2 #每隔多长时间检查一次httpd服务weight -2 #检查服务不在是将优先级-2fall 2 #检查两次rise 1 #检查一次成功即启动服务}vrrp_script chk_schedown {script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"interval 2weight -2}vrrp_instance VI_1{ #定义备份组VI_1interface eth0state MASTER #设定为Masterpriority 101 #优先级为101virtual_router_id 51 #id为51garp_master_delay 1authentication {auth_type PASSauth_pass password}track_interface {eth0}virtual_ipaddress {172.16.15.100/16 dev eth0 label eth0:0}track_script {chk_httpdchk_schedown}notify_master "/etc/keepalived/notify.sh master" #通过调用notify.sh脚本notify_backup "/etc/keepalived/notify.sh backup"notify_fault "/etc/keepalived/notify.sh fault"}vrrp_instance VI_2 { #定义备份组VI_2interface eth0state BACKUP#定为BACKUPpriority 100 #优先级为101virtual_router_id 52 #id为52,这个id一定不能与第一个备份组的id一样garp_master_delay 1authentication {auth_type PASSauth_pass password}track_interface {eth0}virtual_ipaddress {172.16.15.101/16 dev eth0 label eth0:1 #定义虚拟IP,虚拟IP也与第一个备份组的IP不一样}track_script {chk_httpdchk_schedown}notify_master "/etc/keepalived/notify.sh master eth0:1"notify_backup "/etc/keepalived/notify.sh backup eth0:1"notify_fault "/etc/keepalived/notify.sh fault eth0:1"
DIR2:
# yum --nogpgcheck --localinstall keepalived-1.2.7-5.el5.i386.rpm ipvsadm httpd# echo "DIR2.jun.com
" >> /var/www/html/index.html# service httpd start# scp /etc/keepalived/keepalived.conf 172.16.15.4:/etc/keepalived/# vim /etc/keepalived/keepalived.conf
只需修改VI_1中:
state BACKUP
priority 100
只需修改VI_2中:
state MASTER
priority 101