通过keepalived实现LVS的高可用

Keepalived是实现LVS的高可用的工具,它在linux中模拟了一个类似路由中的VRRP协议;它的在linux中的工作机制和VRRP协议几乎一样!因此在了解keepalived时,先了解一下路由器中的VRRP协议!

在路由中VRRP协议保证了内网中用户访问外网络的可靠性,不会因为一个路由器出了问题,而使得内网无法和外网进行通信,导致一些服务器无法连上互联网,使其业务中断!由此可见的出VRRP的重要性!要实现VRRP协议至少要有两个路由,一个为主,另一个为备;主路由器主要提供为内网用户连接互联网,而备路由器则是用于替换主路由器!当主路由出了故障,备份路由要即时替代主路由器实现内网与外网连接而此时的备路由器就成为了主路由,如果出故障的主路由器修复好了又上线,它还会成为主路由器,备份路由器又被打回原形了,依然是备份路由器!

而在路由中,VRRP将局域网内的一组路由器划分在一起,称为一个备份组。备份组由一个Master路由和多个Backup路由器组成,也就是一个主路由器和多个备份由器组成。备份组中路由器是有优先级的,这就是备份路由如何实现成为主路由,主路由上线又如何成为主路由的原因!优先级高的越有可能成为Master路由器。VRRP优先级的取值范围为0255,可配置的范围是12540为系统保留给特殊用途来使用的,255则是系统保留给IP地址拥有者。

备份组功能上相于一台虚拟路由器,它具有IP地址。局域网内的主机仅需要知道这个虚拟路由器的IP地址,并简单配置就能实现访问外网的可靠性!如图:

通过keepalived实现LVS的高可用_keepalived + lvs

Master出了故障,它的优先级会降低,从而使得Backup的优先级高于MasterBackup成为主路由,其虚拟路由的IP会飘逸到Backup,通过Backup连接外网!

其实,路由器通过抢占和非抢占方式实现工作的,非抢占将是Master路由没有出现故障,Backup的优先级再高也不能成为Master;而抢占则是谁的优先级高,谁成为Master

备份组中的路由器也有认证方式;md5simpl(简单字符认证),更够更有效实现安全上网。

VRRP的定时器:VRRP通告报文时间间隔定时器:VRRP备份组中的Master路由器发VRRP报文,通知备份组内的路由器自己工作是否正常。

VRRP抢占延迟时间定时器:为了避免备份组内的成员频繁进行主备状态转成,让Backup有足够时间搜集必要的信息,Backup路由器收到优先级低于本地优先级的通告本文后,不会立即抢占成为Master,而是等待一定时间--抢占延迟时间后,才会对外发送VRRP通告报文取代原来的Master路由器。

每个备份组都有自己的ID,通过不同的ID号来判断备份组;同一个备份主还可以通过不同的ID,路由器的不同类型来实现多主共存。比如:一个备份组ID50且有两个路由器,router1router2,这里定义router1Master,而router2Backup,虚拟IP172.16.15.1,用户经过172.16.15.1访问外网;而同一备份组设置的ID51router1Backuprouter2Master,虚拟IP172.16.15.3,用户通过172.16.15.3也能访问外网,这样就实现了多主共存了,且可以更有效的利用资源!

VRRP的工作机制就是这样,keepalived也是如此;不过keepalivedlinux中不是实现Master路由器和Backup路由器的高可用,它是实现调度器,也就是director的高可用的!

要说director,不妨先说一下负载均衡的LVS模式:

LVS实现了更智能,更人性化的服务器负载均衡,它能根据不同服务器的性能,分发不同的用户请求,还能有效的排除故障服务器,并通知管理员!LVS模式为何能有效的,科学的实现用户请求分发的呢?其实,LVS在同一类服务器前端,应用了一个调度器(director),用户只需将请求发送到director,让director帮忙请求即可,director在通过调度算法来分配用户请求给服务器,然后众多服务器在去响应分配来的请求!如下示意图:

通过keepalived实现LVS的高可用_keepalived + lvs_02

试想一下,如果director无法工作了,出故障了,后果会如何?那绝对是致命的,因此,我们应当实现director的高可用。何为高可用?高可用就是:平均在线时长/(平均在线时长+故障维修时长),其值越大高可用性能越强,所有故障维修时长越短越好,为了实现director的高可用,在给其添加一个director,当主director除了故障,让备用的director代替主director来工作;因此就要用到keepalived来实现!

通过Keepalived实现LVS的高可用性:

配置前提

台主机,两台作为realserver,分别为RS1RS2台作为directorrealserver要关闭arp功能!这里操作均在虚拟机上完成!使用的软件包分别为ipvsadm-1.24-13.el5.i386.rpm keepalived-1.2.7-5.el5.i386.rpm

说明DIR1DIR2均按装有keepalivedipvsadmDIR1MasterDIR2Backup,其IP分配如下:

RS1IP=172.16.15.1

RS2IP=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 “<h1>RS1.jun.com</h1>” >> /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 “<h1>RS2.jun.com</h1>” >> /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.conf
vrrp_script chk_schedown {                 #模式实现keepalived故障情况
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 2
weight -2
}
vrrp_instance VI_1 {                         #定义备份组
state MASTER                                 #其备份组为Master
interface eth0
virtual_router_id 50                         #定义备份组的ID
priority 101                                 #优先级定义
advert_int 1
authentication {                             #认证方式
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 6
lb_algo wlc                                  #调度算法为wlc
lb_kind DR
nat_mask 255.255.0.0
persistence_timeout 50                       #持久连接的超时时长
protocol TCP
real_server 172.16.15.1 80 {        #定义realserver服务器,RS1
weight 2
HTTP_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 {              #定义RS2
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_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 BACKUP
interface eth0
virtual_router_id 50
priority 100
}
# service keepalived start

用浏览器访问172.16.15.100结果如图:

通过keepalived实现LVS的高可用_keepalived + lvs_03

每次刷新会根据调度算法,出现不同的内容!

DIR1上实现测试,创建一个文件down,模拟director故障!

# cd /etc/keepalived
# touch down

在DIR2上可用看到eth0:0的IP,及ipvs规则,如下图:

通过keepalived实现LVS的高可用_keepalived + lvs_04

通过keepalived实现LVS的高可用_keepalived + lvs_05

Keepalived实现web的高可用:

说明:DIR1DIR2都要成为web服务器,且必须配有keepalived,要有两个备份组,这两个备份组互为备份!

DIR1

# yum --nogpgcheck --localinstall keepalived-1.2.7-5.el5.i386.rpm ipvsadm httpd
# echo "<h1>DIR1.jun.com</h1>" >> /var/www/html/index.html
# service httpd start
# vim /etc/keepalived/keepalived.conf
vrrp_script chk_httpd {                               #定义的httpd脚本执行过程
script "killall -0 httpd"                             #试探性杀死httpd
interval 2                                           #每隔多长时间检查一次httpd服务
weight -2                                           #检查服务不在是将优先级-2
fall 2                                              #检查两次
rise 1                                              #检查一次成功即启动服务
}
vrrp_script chk_schedown {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 2
weight -2
}
vrrp_instance VI_1{                                  #定义备份组VI_1
interface eth0
state MASTER #设定为Master
priority 101                                     #优先级为101
virtual_router_id 51                              #id为51
garp_master_delay 1
authentication {
auth_type PASS
auth_pass password
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.15.100/16 dev eth0 label eth0:0
}
track_script {
chk_httpd
chk_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_2
interface eth0
state BACKUP#定为BACKUP
priority 100                                   #优先级为101
virtual_router_id 52                            #id为52,这个id一定不能与第一个备份组的id一样
garp_master_delay 1
authentication {
auth_type PASS
auth_pass password
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.15.101/16 dev eth0 label eth0:1           #定义虚拟IP,虚拟IP也与第一个备份组的IP不一样
}
track_script {
chk_httpd
chk_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 "<h1>DIR2.jun.com</h1>" >> /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