Keepalived高可用集群来实现web服务器负载均衡集群

一、Keepalived的介绍

Keepalived是一个提供HA重要的底层工具,最早期的作用是为ipvs提供HA功能的,是一个可以提供vrrp已经health-check功能的服务软件,可以只用它提供双机浮动的vipvrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。同时我们还可以利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。 Keepalived是一个基于VRRP协议来实现的WEB 服务高可用方案,可以利用其来避免单点故障。一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

二、VRRP的介绍

VRRPVirtual Router Redundancy Protocol,是虚拟路由冗余协议,通过此协议我们可以把多个路由器做成一个虚拟路由器,从而来保证其中某个路由宕掉的时候不会造成我们内部外出网络的全部中断。VRRP中的各个路由器都有一个唯一的标识VRID,其范围为0-255,路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]。主控路由器负责对ARP请求用该MAC地址做应答。这样,无论如何切换,保证给终端设备的是唯一一致的IPMAC地址,减少了切换对终端设备的影响。其中的VRID中的0255是保留的,0用于IP地址所有者主动放弃主控者角色时使用,255用于VRRP路由器的IP地址和虚拟路由器的接口IP地址相同时所拥有

三、LVS的配置与安装,

启用四台虚拟机,我选择是192.168.0.x.的网段,虚拟主机是172.16.9.1,由于不在一个网段,需要加一个路由Routdde add default gw 172.16.0.1

Real Server1:192.168.0.54 Real Server2:192.168.0.55

HA1:192.168.0.53 HA2;192.168.0.57

VIP:172.16.9.1

配置之前keepalived之前,先下载好yum软件包,配置好http的软件安装,解决好依赖关系,更有利于后面的进行

 

192421899.png

RIP不能被外部主机解析使用脚本vipset.sh进行设置,要用vipset.sh脚本如配置VIParp参数

192536185.png

 

193213467.png

测试一下

Real Server1

193330680.png

Real Server2

193355620.png

Vipset.sh脚本如下所示:

#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
VIP=172.16.9.1          #VIP地址
host=`/bin/hostname` #定义host变量
case"$1"in
start) #start的时候设置本机arp不被外部主机解析
# Start LVS-DR real server onthismachine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo1> /proc/sys/net/ipv4/conf/lo/arp_ignore
echo2> /proc/sys/net/ipv4/conf/lo/arp_announce
echo1> /proc/sys/net/ipv4/conf/all/arp_ignore
echo2> /proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:0$VIP broadcast $VIP netmask255.255.255.255up
#配置vip在lo:0,并且设置广播地址和子网掩码,此处使用32位是保证此vip不能与其他地址通信。
/sbin/route add -host $VIP dev lo:0#增加路由
;;
stop) #stop的时候恢复到系统的初始化arp参数
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0down
echo0> /proc/sys/net/ipv4/conf/lo/arp_ignore
echo0> /proc/sys/net/ipv4/conf/lo/arp_announce
echo0> /proc/sys/net/ipv4/conf/all/arp_ignore
echo0> /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0| grep $VIP`
isrothere=`netstat -rn | grep"lo:0"| grep $VIP`
if[ !"$islothere"-o !"isrothere"];then
# Either the route or the lo:0device
# not found.
echo"LVS-DR real server Stopped."
else
echo"LVS-DR real server Running."
fi
;;
*)
# Invalid entry.
echo"$0: Usage: $0 {start|status|stop}"
exit1
;;
Esac


 

四、DR上的相关软件的配置和安装

 (1)下载keepalived-1.2.7-5.el5.i386.rpm

193437825.png

(2)安装keepalived软件,一定要解决依赖关系

安装之前一定要与服务器时间同步 ntpdate 172.16.9.1

193518252.png

 

  (3)、ipvsadm软件安装

 

193610631.png

五、LVS的配置包括两部分,虚拟主机组和虚拟主机

virtual_server 192.168.200.100 443 {        #设置VIP port    
    delay_loop 6                     #多少秒检查一次real server的健康状态     
    lb_algo rr                      #调度算法     
    lb_kind NAT                     #lvs模型     
    nat_mask 255.255.255.0              #虚拟VIP的掩码     
    persistence_timeout 50              #长连接时间     
    protocol TCP                     #协议类型
    real_server 192.168.201.100 443 {          #定义real server    
        weight 1                          #定义权重     
        SSL_GET {                          #检查web服务的SSL状况     
            url {     
             path /     
              digest ff20ad2481f97b1754ef3e12ecd3a9cc     
            }     
            url {                          #检查服务器的web服务状况     
              path /mrtg/     
              digest 9b3a0c85a887a256d6939da88aabd8cd     
            }     
            connect_timeout 3           #连接超时时间     
            nb_get_retry 3             #重试次数     
            delay_before_retry 3         #重试连接时间间隔     
        }     
    }     
}


六、keepalived配置文件的详解

  (1)RS1里面的keepalived.conf上的配置

 

  Keepalived.conf的脚本
! Configuration File for keepalived
 
global_defs {
   notification_email {
         root@localhost
}
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass keepalivedpass
    }
    virtual_ipaddress {
        172.16.9.1
    }
}
 
virtual_server 172.16.9.1 80  {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.0.0
    persistence_timeout 50
    protocol TCP
 
    real_server 192.168.0.54 80 {
        weight 1
        SSL_GET {
            url {
              path /
              status_code 200
 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
 
virtual_server 172.16.9.1 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.0.0
   # persistence_timeout 50
    protocol TCP
 
    real_server 192.168.0.54 80 {
        weight 2
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
 
    real_server 192.168.0.55 {
        weight 2
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
            connect_port 80
        }
    }
}

194143935.png

194144659.png

194145613.png

然后把RS1上的keepalived.com复制到RS2上,并把其中的stata改成BACKUP,priority修改为100,其他内容不变

 

RS2里面的keepalived.conf脚本

! Configuration File for keepalived
 
global_defs {
   notification_email {
         root@localhost
}
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass keepalivedpass
    }
    virtual_ipaddress {
        172.16.9.1
    }
}
 
virtual_server 172.16.9.1 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.0.0
   # persistence_timeout 50
    protocol TCP
 
    real_server 192.168.0.54 80 {
        weight 2
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
        }
    }
 
    real_server 192.168.0.55 {
        weight 2
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 1
            connect_port 80
        }
    }
}

194335822.png

启动keepalived服务;

 

194421650.png

 

194520141.png

 

194601389.png

访问虚拟IP地址

194650596.png

主备转换测试

# cd /etc/keepalived/

# touch down

194726824.png

在备用节点node2上查看

194846412.png

访问虚拟IP

195128666.png

现在把down文件删除,MASTER节点会夺回资源,因为在node1上的优先级(101)比nod2上的优先级(100)高

双主模式实现

两个主机web服务同时开启,配置的VIP不同,让他们互为主从

修改keepalived.conf配置文件(只需修改配置文件末尾“vrrp_instance VI_2”中的内容)

vrrp_instance VI_2 {
interface eth0
state BACKUP  # BACKUP for slave routers
priority 100  # 100 for BACKUP
virtual_router_id 52
garp_master_delay 1
 
authentication {
auth_type PASS
auth_pass password
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.51.80/16 dev eth0 label eth0:1
}
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"
}


node2上启用“vrrp_instance VI_2”中的内容后,修改一下第二VIP地址与脚本名称(track_httpd, chk_schedown

修改完成后,启动keepalived服务,查看node1node2上的VIP地址配置

node1主机

195238288.png

node2主机

195306135.png

测试

195411152.png

195412903.png

模拟node1出现故障

# cd /etc/keepalived/

# touch down

查看node2上虚拟IP地址

195537339.png

 

此时,访问172.16..9.1192.16.53都是由node2主机返回结果

 

195727659.png

195728654.png