keepalived+nginx实现高可用双主热备

589 阅读5分钟

keepalived是什么

Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。虽然nginx的抗压性很强,很少出现宕机,但是如果不做热备,nginx一挂服务都会挂掉,所以热备是必须的,当然,根据自己的实际业务需求来决定。

keepalived 原理

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

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

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

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

keepalived安装

去keepalived下载相关压缩包,解压缩后,会发现有configure执行文件来配置相关信息

#会将keepalived的相关配置放到/etc目录下
./configure --prefix=/usr/local/keepalived --sysconf=/etc

make

make install

查看keepalived

分别去相应目录下看下

启动keepalived后可以在ip addr下看到相应的虚拟ip

keepalived的配置

keepalived只有一个配置文件keepalived.conf。里面主要包括以下几个配置区域,分别是global_defs、vrrp_instance、和virtual_server。

1.global_defs区域

主要是配置故障发生时的通知对象以及机器标识,通俗点说就是出状况后发邮件通知的一个配置。

global_defs {
    notification_email {    故障发生时给谁发邮件通知
        a@abc.com
        b@abc.com
        ...
    }
    notification_email_from alert@abc.com    通知邮件从哪个地址发出
    smtp_server smtp.abc.com        smpt_server 通知邮件的smtp地址。
    smtp_connect_timeout 30       连接smtp服务器的超时时间
    enable_traps      开启SNMP陷阱
    router_id host163      路由id:当前安装keepalived的节点主机标识符,保证全局唯一
}

2.vrrp_instance区域

vrrp_instance用来定义对外提供服务的VIP区域及其相关属性

vrrp_instance VI_1 {
    state MASTER         state 可以是MASTER或BACKUP
    interface ens33        本机网卡的名字
    virtual_router_id 51      取值在0-255之间,用来区分多个instance的VRRP组播
    priority 100            权重
    advert_int 1       发VRRP包的时间间隔,即多久进行一次master选举
    authentication {        身份认证区
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {        虚拟ip地址
        # 这时候我们可以通过这个虚拟ip访问nginx
        192.168.27.160
    }
}

3.virtual_server

超大型的LVS中用到,我在这里不用它。

virtual_server 192.168.200.100 443 {
    delay_loop 6                                延迟轮询时间(单位秒)
    lb_algo rr                                 后端调试算法
    lb_kind NAT                               LVS调度类型
    persistence_timeout 50 
    protocol TCP

    real_server 192.168.201.100 443 {                              真正提供服务的服务器
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc         表示用genhash算出的结果
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3                                                           重试次数
            delay_before_retry 3                                                下次重试的时间延迟
        }
    }
}

keepalived双机热备

主节点配置

global_defs {
# 路由id:当前安装keepalived的节点主机标识符,保证全局唯一
router_id keep_171
}
vrrp_instance VI_1 {
# 表示状态是MASTER主机还是备用机BACKUP
state MASTER
# 该实例绑定的网卡
interface ens33
# 保证主备节点一致即可
virtual_router_id 51
# 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
priority 100
# 主备之间同步检查时间间隔,单位秒
advert_int 2
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟出来的ip,可以有多个(vip)
virtual_ipaddress {
192.168.1.161
}
}

从节点配置

global_defs {
router_id keep_172
}
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.161
}
}

两个节点的nginx配置要保证一样。

nginx监听脚本

1. 增加Nginx重启检测脚本

其实这时候keepalived和nginx并没有直接的关联,所以如果只是主节点的nginx挂掉,并不会实现双机热备。因为两服务互不影响,keepalived其实是监控master上的keepalived的心跳的

写个脚本监听nginx,如果nginx挂了,先重启,如果无法重启,然后用命令把keepalived也停掉,这样就会完成双机热备的任务。

vim /etc/keepalived/check_nginx_alive_or_not.sh

shell脚本

#!/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监听nginx脚本

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

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

track_script {
check_nginx_alive # 追踪 nginx 脚本
}

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

systemctl restart keepalived

双主热备

双机主备的情况下,会对其中一台机器有很大的资源浪费,这时候,我们来试试另一种架构,双主热备,通过dns轮询两个keepalived虚拟ip,互为主备。

master1

global_defs {
router_id keep_171
}
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.161
}
}
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.162
}
}

master2

global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}