Keepalived+Nginx高可用案例(抢占式与非抢占式)

(1)下载安装Keepalived源码包

Keepalived官网源码包下载地址

在服务器上解压

tar -xf keepalived-2.2.8.tar.gz

安装相关前置依赖

yum -y install gcc gcc-c++

使用configure工具进行安装

./configure --sysconfdir=/etc --prefix=/usr/local/keepalived --sbindir=/usr/sbin --bindir=/usr/bin

--sysconfdir=DIR #指定配置文件位置 
--prefix=DIR #指定安装路径
 --sbindir=DIR 指定命令位置,后面不需再配置环境变量

使用make make install进行安装

make && make install

(2)配置Keepalived在业务中的参数

本次操作为Keepalived单VIP抢占式配置,即两个虚拟机只有一台绑定VIP对外提供服务,且在一台主机失能时VIP将漂移到备机上接收流量,当主机恢复时VIP将再次切换

主机配置
global_defs {
    router_id logincas1 ### router_id为全局定义当前节点的id,一般为唯一
    enable_script_security
    script_user root  ##定义执行脚本的角色
    vrrp_version 2
}
## 定义脚本
vrrp_script chk_nginx {
    script      "/usr/local/nginx-check.sh" ##脚本路径
    interval    2							##检测间隔
    timeout     4							##失败间隔,失败两次通信则失败
    rise        4							##成功四次则成功
    fall        2							##失败两次则切换
    weight      -50							##脚本检测失败则扣减权重
}
vrrp_instance VI_1 {				##模块配置
        version 2
        state MASTER				##抢占式的情况下主机需设置为MASTER,备机为BACKUP
        interface eth0				##指定VIP流量的网卡
        virtual_router_id 51			##虚拟路由ID
        priority 100				##优先级,备机应比主机低一些
        advert_int 1				##VRRP心跳包发送间隔
        authentication {			##权限认证
          auth_type PASS			##类型:密码
          auth_pass 2222			
        }
        virtual_ipaddress {
          172.29.184.220/24			##VIP配置
        }
        track_script {				##脚本定义
          chk_nginx
        }

}

接下来需要补充完善 nginx-check.sh

思路是通过去检测是否有Nginx进程,检测到没有nginx进程时先执行Nginx的重启操作,一秒之后再次检测,如果Nginx进程还是不存在则关闭Keepalived,使VIP漂移到另一个节点

#!/bin/bash
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
        systemctl restart nginx
        sleep 1
        if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
           systemctl stop keepalived
        fi
fi

遇到的一些问题

当在脚本里使用ps aux | grep nginx | grep -v grep | wc -l去检测Nginx进程时发现脚本一直未生效,合理怀疑是Keepalived运行用户在执行这条命令时存在权限问题(脚本不能配置权限为777,Keepalived会警告并失效)

本次使用的高可用架构为单VIP架构,后续也可以尝试双VIP架构,即互为主备机,配置两个VIP模块,可以选择使用一个VIP接收流量,也可以使用两个VIP来监听流量,看业务的需求。
在单VIP高可用架构中,如果想要主机恢复后VIP不漂移到主机上,可以将主机的state也设置为BACKUP,但优先级需要比备机高一些,以确保初始状态VIP是绑定在主机上的