Keepalived服务高可用

Keepalived一个基于VRRP(Virtual Router Redundancy Protocol,即虚拟路由冗余协议) 协议实现的 LVS (Linux Virtual Server)服务高可用方案,通过在两个台服务器上搭建Keepalived,其中一台为主节点(Master),一台为备用节点(Backup),Keepalived对外提供一个虚拟IP(VIP)(该IP不是A和B主机的IP),主节点会定时发送消息给备用节点,当备用节点没有收到主节点发送过来的消息时备用节点会充当主节点(也就是接管虚拟IP),继续提供服务,确保服务的高可用。

官网:Keepalived for Linux

阿里云ECS HaVip高可用请参考HaVip结合keepalived实现主备双机高可用 (aliyun.com)

安装

1.下载Keepalived

wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz

2.解压

tar -zxvf keepalived-2.2.4.tar.gz
cd keepalived-2.2.4

3.安装依赖

yum -y install gcc gcc-c++ autoconf automake libnl libnl-devel

4.编译与安装

# 编译前配置
./configure --prefix=/usr/local/keepalived --sysconf=/etc
# 编译与安装
make && make install

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

5.添加Keepalived 服务

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

systemctl daemon-reload

配置

查看当前网络信息

# 或ifconfig
ip addr

编辑keepalived.conf文件

# 清空默认配置
echo "" > /etc/keepalived/keepalived.conf
# 编辑配置
vim /etc/keepalived/keepalived.conf

配置内容:

Master节点配置:

# 全局配置
global_defs {
   # 路由id,定义一个全局id作为当前节点的标识名
   router_id LVS_01
}

# 实例配置,一个实例就相当于一个服务类型,比如,nginx vip, nacos vip,mysql vip, ...
# 通过配置多个vrrp_instance实例可以实现多主多备或互相主备用(一个主备用占用一个vip,互相主备时应再定义一个新的vip)
vrrp_instance VI_1 {
    # 节点类型,MASTER:主节点 BACKUP:备用节点
    state MASTER
    # 该实例绑定的网卡名称
    interface ens192
    # 保证主备节点一致即可(实例ID),如果有多个实例配置,各实例之间不能相同
    virtual_router_id 51
    # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
    priority 100
    # 非抢占,master死掉后backup充当master,但master随后又启动了,会抢占backup的vip,这样就执行了2次切换,为避免该问题可以设置这个参数。
    nopreempt
    # 主备之间同步检查时间间隔,单位秒,默认1
    advert_int 1
    # 认证权限密码,防止非法节点进入(主备配置要一致)
    authentication {
        # 授权类型
        auth_type PASS
        # 授权码
        auth_pass 123456
    }
    # 虚拟出来的ip(vip),可以有多个(一行一个)
    virtual_ipaddress {
        192.168.1.149
    }
}

Backup节点配置:

# 全局配置
global_defs {
   # 路由id,定义一个全局id作为当前节点的标识名
   router_id LVS_02
}

# 实例配置,一个实例就相当于一个服务类型,比如,nginx vip, nacos vip,mysql vip, ...
# 通过配置多个vrrp_instance实例可以实现多主多备或互相主备用(一个主备用占用一个vip,互相主备时应再定义一个新的vip)
vrrp_instance VI_1 {
    # 节点类型,MASTER:主节点 BACKUP:备用节点
    state BACKUP
    # 该实例绑定的网卡名称
    interface ens192
    # 保证主备节点一致即可(实例ID),如果有多个实例配置,各实例之间不能相同
    virtual_router_id 51
    # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
    priority 80
    # 非抢占,master死掉后backup充当master,但master随后又启动了,会抢占backup的vip,这样就执行了2次切换,为避免该问题可以设置这个参数。
    nopreempt    
    # 主备之间同步检查时间间隔,单位秒
    advert_int 1
    # 认证权限密码,防止非法节点进入(主备配置要一致)
    authentication {
            # 授权类型
        auth_type PASS
        # 授权码
        auth_pass 123456
    }
    # 虚拟出来的ip(vip),可以有多个(一行一个),准备要绑定到同一个vip
    virtual_ipaddress {
        192.168.1.149
    }
}

启动Keepalived

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

查看启动是否成功

ps -ef|grep keepalived

通过ip addr查看ens192网卡中是否多个一个vip信息

执行systemctl stop keepalived命令停掉其中一个节点,再通过curl http://192.168.1.49请求是否正常

实现nginx高可用

1.添加nginx进程监听

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

NGIINX_ALIVE=`ps -C nginx --no-header |wc -l`
# 如果nginx进程不存在,尝试启动nginx
if [ $NGIINX_ALIVE -eq 0 ];then
        # 尝试启动nginx
    service nginx start
    # 等待3秒
    sleep 3
    # 查看nginx是否启动成功
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            # nginx没启成功,停掉keepalived,使备用节点启用
        killall keepalived
    fi
fi

2.添加执行权限

chmod +x /etc/keepalived/check_nginx.sh

3.修改keepalived.conf配置文件

vim /etc/keepalived/keepalived.conf

新增内容:

# 定时监听nginx状态脚本
vrrp_script check_nginx_alive {
    script "/etc/keepalived/check_nginx.sh"
    # 监听间隔
    interval 2
    # 如果脚本运行成功,则升级权重+10
    weight 10
}

# 在vrrp_instance中新增追踪脚本
vrrp_instance VI_1 {

  ...
    
  track_script {
      # 追踪 nginx 脚本
      check_nginx_alive
  }
}

4.重启keepalived

systemctl restart keepalived

参考:

Keepalived 原理与实战

keepalived 配置文件参数详解

如果觉得我的文章对你有用,请随意赞赏