Keepalived详解

3,864 阅读5分钟

1. Keepalived 简介

Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现web服务的高可用。

Keepalived 是以 VRRP 协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器(可以理解为单个Nginx节点)组成一个路由器组,这个组里面有一个master 和多个 backup,master 上面有一个对外提供服务的 VIP(Virtual IP Address)(该路由器所在局域网内其他机器的默认路由为该 vip),master 会发组播,当 backup 收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。这样的话就可以保证路由器的高可用了。

keepalived 主要有三个模块,分别是core、check 和 vrrp。core 模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check 负责健康检查,包括常见的各种检查方式。vrrp 模块是来实现 VRRP 协议的。

2. Keepalived 安装部署

注意:以下都是在本地Mac上通过虚拟机的方式进行搭建运行的。在阿里云及腾讯云无虚拟IP功能,比较麻烦。

将下载后的keepalived上传到linux上,这里上传到/home/software上

  • 2、解压
tar -zxvf keepalived-2.0.18.tar.gz 
  • 3、配置 解压后,进入相应的文件夹下,用configure进行安装配置。
./configure --prefix=/usr/local/keepalived --sysconf=/etc

prefix:keepalived安装的位置
sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错。

配置过程中可能会出现警告信息,如下所示: 解决方法:安装 libnl/libnl-3 依赖 yum -y install libnl libnl-devel,重新configure一下就好了。

  • 4、安装keepalived
make && make install

-5、通过 whereis keepalived 查看安装后的未知

3. Keepalived 配置与启动

1、进入 /etc/keepalived/,对keepalived.conf进行相关配置。

global_defs {
   # 路由id:当前安装keepalived的节点主机标识符,保证全局唯一
   router_id keep_104
}
# 计算机节点
vrrp_instance VI_1 {
    # 表示状态是MASTER主机还是备用机BACKUP
    state MASTER
    # 该实例绑定的网卡名称
    interface ens33
    # 保证主备节点一致即可
    virtual_router_id 51
    # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
    priority 100
    # 主备之间同步检查时间间隔,单位秒,默认为1s
    advert_int 1
    # 认证权限密码,防止非法节点进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟出来的ip,可以有多个(vip)
    virtual_ipaddress {
        192.168.1.108 # 注意阿里云及腾讯云目前不支持自己定义VIP,
        	        腾讯云支持自己申请,但是目前也暂时关闭了。
    }
}

附:查看网卡名称 2、启动 Keepalived

在sbin目录中进行启动,如下图

查看进程

ps -ef|grep keepalived

查看虚拟 IP(VIP)
在网卡 ens33 下,多了一个 192.168.1.108 ,这个就是虚拟ip

4. 把 Keepalived 注册为系统服务

进入解压缩安装包的 etc 文件夹

将配置文件拷贝至系统 etc文件

cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/

刷新系统服务,加载新添加的 Keepalived 服务

systemctl daemon-reload

之后就可以通过如下命令启动/关闭keepalived

# 启动keepalived
systemctl start keepalived
# 停止keepalived
systemctl stop keepalived
# 重启keepalived
systemctl restart keepalived

5.Keepalived 实现双机主备高可用

在配置完 Keepalived 主服务器节点后,接下来就可以配置备用服务器节点了,备用服务器配置如下:

global_defs {
   router_id keep_105
}

vrrp_instance VI_1 {
    # 备用机设置为BACKUP
    state BACKUP
    interface ens33
    virtual_router_id 51
    # 权重低于MASTER
    priority 80
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        # 注意:主备两台的vip都是一样的,绑定到同一个vip
        192.168.1.108
    }
}

启动 Keepalived

systemctl start keepalived

查看备用服务器 Keepalived 进程

现在主服务器节点 192.168.1.104 以及备用服务器节点 192.168.1.105 以及 Keepalived 虚拟 IP 192.168.1.105已配置完毕

这里我在本地将 Keepalived 虚拟IP 192.168.1.108已映射至 www.keep.com

所以直接访问 www.keep.com 即可访问主服务器节点

当主服务器节点的 Keepalived 服务不可用时(这里我直接将主服务器的 Keepalived 服务直接停止systemctl stop keepalived.service,便于测试),虚拟IP 自动绑定至备用服务器节点地址

6. Keepalived 配置 Nginx 自动重启

1、增加Nginx重启检测脚本

vim /etc/keepalived/check_nginx_alive_or_not.sh
#!/bin/bash

A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
    sleep 3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

增加运行权限

chmod +x /etc/keepalived/check_nginx_alive_or_not.sh

2、在 keepalived.conf 配置定时监听 nginx 状态脚本

vrrp_script check_nginx_alive {
    script "/etc/keepalived/check_nginx_alive_or_not.sh"
    interval 2 # 每隔两秒运行上一行脚本
    weight 10 # 如果脚本运行成功,则升级权重+10
    # weight -10 # 如果脚本运行失败,则升级权重-10
}

3、在vrrp_instance中新增监控的脚本

track_script {
    check_nginx_alive   # 追踪 nginx 脚本
}

4、重启Keepalived使得配置文件生效

systemctl restart keepalived

7. Keepalived 实现双主热备高可用

实现双机主备,可能由于一台资源一直空闲的情况,这是采用双主热备可以解决这个问题。 Keepalived 双主热备详细配置:

规则:以一个虚拟ip分组归为同一个路由

主节点配置

global_defs {
   router_id keep_104
}

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

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.138
    }
}

备用节点配置

global_defs {
   router_id keep_105
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.108
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.138
    }
}