1. Keepalived介绍

Keepalived 是一个基于 vrrp 协议来实现的服务器高可用解决方案,可以利用其实现避免IP单点故障,类似的工具还有 heartbeat  corosync 。不过其不会单独出现,而是搭配着 LVS、Nginx、HAproxy,一起协同工作达到高可用的目的。

 

1.1 VRRP协议

VRRP 全称Vritual Router Redundancy Protocol,虚拟路由冗余协议。通过把几台提供路由功能的设备组成一个虚拟路由设备,使用一定的机制保证虚拟路由的高可用,从而达到保持业务的连续性与可靠性。

在这组成的一个虚拟路由器中,有 master  backup 之分。master是主节点,在一个虚拟路由器中,只能有一个master,但可以有多个backup;backup是备用节点,也就是当master挂掉之后,backup接手master节点的所有资源,当有多个backup节点时,根据其 priority (优先级)的值的大小,来选择谁作为master的替代者。当backup节点的优先级值相同时,根据其IP地址的大小,来决定。

 

1.2 VRRP工作逻辑

keepalived高可用服务搭建_第1张图片

 

2.配置前提

2.1 各节点时间必须同步

可以使用 ntp  chrony 等工具进行时间同步

 

2.2 确保iptables和selinux规则清空

实验环境下,我们直接将防火墙规则清空,关闭selinux

iptables -F
systemctl stop firewalld.service
setenforce 0

在vrrp协议中我们要将我们虚拟路由器中各节点的优先级进行广播,这样在我们故障时,其他节点发现在多播域内自己的优先级最高,可以实现故障切换。

多播地址(组播): 224.0.0.0 -- 239.255.255.255

查看是否支持多播

ifconfig | grep MULTICAST    #查看是否支持多播
ip link set multicast on dev eth0    #开启多播功能



3.配置Keepalived+Nginx

3.1 拓扑结构

         MASTER              keep alived              BACKUP

+-------------+          +------------+         +--------------+

|   Nginx-1   |--------|  virtualIP  |--------|   Nginx-2   |

+-------------+          +------------+         +--------------+

     172.31.208.91       172.31.208.95     172.31.208.92


3.2 安装Keepalived

本机环境是 CentOS7

yum install keepalived
keepalived -v

keepalived高可用服务搭建_第2张图片

3.3 keepalive配置文件

Keepalvie配置文件路径为:/etc/keepalived/keepalived.conf

以下为 MASTER 配置文件示例:请注意 MASTER 与 BACKUP 不同, 需要更改的地方,多余配置请删除

! Configuration File for keepalived

global_defs {
   notification_email {		#定义通知邮箱
   [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1	#定义SMTP服务器地址
   smtp_connect_timeout 30
   router_id lb01  #定义id为lb01,ID要唯一
}

vrrp_script chk_ngx  {		#定义vrrp脚本,检测nginx服务状态
script "/etc/keepalived/chk_ngx.sh"  #具体脚本位置,当nginx服务有问题时停掉keepalive服务

interval 2			    #间隔两秒
weight 2
}

vrrp_instance VI_1 {	        #实例名字为VI_1,相同的实例的备节点名字要和这个相同
    state MASTER	        #状态为MASTER,备节点状态需要改为BACKUP
    interface ens192		#定义通信接口为eth0,此参数备节点和主节点相同
    virtual_router_id 55	#实例ID为55.唯一
    priority 150		#优先级为150,备节点的优先级必须比此数字低	
    advert_int 1		#通信检查检查间隔时间为1秒
    authentication {
        auth_type PASS		#认证类型,此参数备节点设置和主节点设置相同
        auth_pass 1111		#密码是1111,此参数备节点设置和主节点相同
    }
    virtual_ipaddress {		#虚拟机IP,即VIP为172.31.208.95/24,绑定接口为eth0,别名为eth0:1,此参数备节点设置和主节点相同
    	172.31.208.95/24 dev ens192 label ens192:1
    }
    track_script {
    chk_ngx			#触发检查
    }
}

以下为BACKUP的配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
   [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
}
   vrrp_script chk_ngx  {		#定义vrrp脚本,检测nginx服务状态
   script "/etc/keepalived/chk_ngx.sh"  #具体脚本位置,当nginx服务有问题时停掉keepalive服务

   interval 2			    #间隔两秒
   weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.31.208.95/24 dev ens192 label ens192:1 
    }
    track_script {
    chk_ngx			#触发检查
    }

}

说明:

1、vrr_instance实例,名字是VI_1,每个实例可以认为是keepalived服务的一个或者多个业务服务,可以有多个,注意,主节点的中的vrrp

2、state MASTER代表当前实例VI_1的角色状态,当前角色为MASTER,只有MATER和BACKUP两个状态,必须大写

3、interface 为网络通信接口

4、virtual_router_id为虚拟机路由id表示,最好是数字,而且是配置文件中唯一的,MASTER和BACKUP配置中相同的实例id又必须一致

5、priority优先级,数字越大,优先级越高,MASTER必须高于BACKUP

6、advert_int 同步时间,默认1秒

7、authentication,认证, MASTER和BACKUP需要配置一致

8、virtual_ipaddress虚拟IP,注意,此IP可以配置多个,通常为需要跟域名绑定

9、vrrp_script,定义的脚本


3.4监控脚本编写

默认情况下,keepalived软件仅仅在对方机器宕机或者keepalive停掉的时候才会接管业务。但是有时候nginx服务停掉,但是keepalived服务还在工作,此时就会导致用户的访问的vip无法找到对应的服务,所以需要编写脚本,检测nginx服务状态,当服务中断时,keepalive服务也中断,脚本如下

#!/bin/bash
if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then
 systemctl stop keepalived
fi

记得设定可执行权限


4、测试

开启keepalived

systemctl start keepalived
systemctl enable keepalvied

注意,当配置文件有任何错误的时候,systemctl 不会提示keepalived启动失败,需要使用systemclt status检查服务

当配置正确,MASTER会主机会有VIP

keepalived高可用服务搭建_第3张图片


BACKUP上不会有vip

keepalived高可用服务搭建_第4张图片


当模拟nginxi服务停止,MASTER的keepalived服务因为脚本会停止,这时BACKUP会争抢使用vip

keepalived高可用服务搭建_第5张图片

可以看到MASTER上keepalived服务停止,没有vip

而在BACKUP上争抢到了vip

keepalived高可用服务搭建_第6张图片


5、keepalived的裂脑的脚本

    由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消失,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并且在正常运行,

此时就会导致一个IP或者服务存在冲突,两个服务器都会占用同一个VIP,此时就被称为裂脑。

 如果出现了裂脑情况,则需要尽快接入中间仲裁,关闭一台服务器或者keepalived服务


脚本思路:

在BACKUP上执行脚本,如果可以ping通MASTER,并且BACKUP有VIP就报警。

#!/bin/sh
MASTER_VIP=172.31.208.95
MASTER_IP=172.31.208.91
while true
do
ping -c 2 -W 3 $MASTER_IP &>/dev/null
 if [ $? -eq 0 -a `ip addr|grep "$MASTER_IP"|wc -l` -eq 1 ]
  then
    echo "HA is split brain.warning."
else
    echo "HA is OK!"
fi
sleep 5
done

加上可执行权限




keepalived高可用服务搭建_第7张图片