一、VRRP协议(虚拟路由器冗余协议)
进入正题之前我们需要先了解一下什么是VRRP协议。VRRP即虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP),是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,VRRP主要的作用是:当一个计算器群组里主路由出现故障的时候,通过自动切换机制,将请求发送到备用机器上。
一个VRRP路由群组由多个运行VRRP协议的路由器组成,该群组对外表现为一个具有固定IP的虚拟逻辑路由器,该组虚拟逻辑路由器由N个VRRP物理路由器组成。同时这些物理路由器又区分为两类:主控路由器和备份路由器。一个VRRP路由群组里面,有且仅有一个主控路由器,可以有N个备份路由器。当主控路由器发生故障的时候,备份路由器可以在一定的时延之后自动的“取代”主控路由器的地位,此过程非常快速,对于用户端来说是无感知的、透明的。
二、KeepAlive
KeepAlive是一个基于VRRP协议的软件,最开始设计的目的就是为了实现高可用LVS的,后来又加入了可以实现高可用的vrrp功能。
三、环境搭建
1.一主多从
ip:192.168.181.133 master

global_defs {
    router_id LVS_1
    vrrp_mcast_group4 224.24.24.18
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.181.100
    }
}

192.168.181.134 backup

global_defs {
    router_id LVS_2
    vrrp_mcast_group4 224.24.24.18
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 1
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.181.100
    }
}

192.168.181.135 backup

global_defs {
    router_id LVS_3
    vrrp_mcast_group4 224.24.24.18
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 1
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.181.100
    }
}

可以通过tcpdump -nn -i ens33 host 224.24.24.18查看vrrp广播。master会不断的向局域网内的其他backup发送广播,一旦backup没有收到广播就会认定主机挂掉了,这些会backup会重新进行“选举”推选出一台机器作为master继续运行,一句是priority权重。

keepalived vip 请求状态 SYN_RECV_高可用


将三台服务器都开启服务。访问虚拟ip:192.168.181.100,发现页面定位到了定位到192.168.181.133

keepalived vip 请求状态 SYN_RECV_web服务器_02


关闭192.168.181.133服务 。systemctl stop keepalived.service (模拟服务器关闭)

此时再次访问虚拟ip。发现ip漂移到了192.168.181.134

keepalived vip 请求状态 SYN_RECV_高可用_03


关闭192.168.181.134服务,ip继续漂移到192.168.181.135

keepalived vip 请求状态 SYN_RECV_服务器_04


2.双主结构

若实现双主结构(互为主从),只需要再构造一个虚拟路由器,将192.168.181.134(已经是backup)设置为master,192.168.181.133(已经是master)设置为backup即可。互为主从可以使两台服务器同时对外提供服务,将资源利用最大化。

3.LVS集群配置

环境:
调度服务器:192.168.181.138
nginx web服务器:192.168.181.140 192.168.181.141
虚拟路由ip:192.168.181.100

web服务器配置

##开启路由转发。
echo "1">/proc/sys/net/ipv4/ip_forward
##绑定VIP到网卡
ifconfig ens33:0 192.168.181.100 broadcast 192.168.181.100 netmask 255.255.255.255 up
##添加发送数据包到vip的路由
route add -host 192.168.181.100 dev ens33:0
##抑制ARP请求
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce 
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

keepalived vip 请求状态 SYN_RECV_高可用_05


配置调度服务器(若使用高可用多主结构,可以参考上面的做法)

global_defs {
    router_id LVS_1
    vrrp_mcast_group4 224.24.24.18
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.181.100
    }
}

virtual_server 192.168.181.100 80 {
    delay_loop 1
    lb_algo rr #lb使用的调度算法
    lb_kind DR #lb所使用的模型
    #nat_mask 255.255.0.0
    persistence_timeout 0
    protocol TCP
    sorry_server 127.0.0.1 80 #当所有real_server宕机后的错误提示服务器

    real_server 192.168.181.140 80 { #node1节点
       weight 1
        HTTP_GET { #验证real_server方式
            url {
              path /
              status_code 200
            }
            connect_timeout 3 #超时时间
            nb_get_retry 3 #重试次数
            delay_before_retry 3 #重试前的等待时间
        }
    }
    real_server 192.168.181.141 80 { #node2节点
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

使用ipvsadm -Ln查看当前配置的虚拟服务和各个RS的权重

keepalived vip 请求状态 SYN_RECV_web服务器_06


接下来服务器就按照你预先规定的方式来负载均衡了!

keepalived vip 请求状态 SYN_RECV_服务器_07


keepalived vip 请求状态 SYN_RECV_高可用_08


关掉其中一台web服务器,负载均衡会自动剔除掉故障的web服务器。

注意:很多时候当你配置好集群以后,你会发现你的集群并没有按照原先的负载均衡轮询的方式来进行分发请求。所以要特别注意下面的两个地方:
persistence_timeout 0 这个是持久化超时时间,单位是秒。默认是6分钟。测试的时候改为0。
另外使用ipvsadm -L --timeout命令查看一下tcp/tcpfin/udp三个参数的过期时间(巨坑)。分别是900 120 300。这边测试的时候把时间改短一点 ipvsadm --set 1 2 1。

4.redis高可用

对于keepalive来说,他会检测keepalive自身的故障和机器网络故障,当其中有一个出现问题的时候进行自动的切换。但是有时候会我们不需要他监控“自己”,而需要他监控同一台机器上的其他服务器,比如redis或者mysql,那么这个时候我们就需要去配置vrrp_script参数,使用vrrp_script来对我们需要关注的业务进程进行关注。从而将keepalive的关注点从“自身”转移到“其他服务”。

5.mysql集群管理

virtual_server 192.168.181.100 3306 {

    delay_loop 1
    lb_algo rr #lb使用的调度算法
    lb_kind DR #lb所使用的模型
    #nat_mask 255.255.0.0
    persistence_timeout 0
    protocol TCP

    real_server 192.168.181.143 3306 {
        weight 1
        #notify_down /etc/keepalived/check_mysql.sh #3306端口不可用则执行脚本
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }

    real_server 192.168.181.144 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

四、总结
利用keepalive的vrrp特性来进行高可用配置(master机器参与其中)。利用LVS进行服务器集群的搭建(master仅当代理、分发器)。