通过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 “<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结果如图:
每次刷新会根据调度算法,出现不同的内容!
在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 "<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