目录

首先放一张双主热备的原理图,用户的请求通过DNS服务器查询到服务器真实IP之后把请求打到服务器的网络接口,该请求将被路由到与 Keepalived 监听的网络接口绑定的 Keepalived 虚拟 IP 地址。当 Keepalived 接收到请求后,它将根据其配置将该请求转发到实际处理请求的服务器。

双主热备会同时让两台nginx服务器都处于工作状态(互为主备),两个虚拟IP同时可用,两台nginx服务器需要在同一个专用网络VPC内,使得服务器之间可以通过内网进行通信。

image_V8d3ebTxgm


前置准备

需要关闭服务器的selinux或者设置规则,否则keepalived执行检测脚本时会报错。

检测脚本,自动检测nginx状态如果宕机会尝试启动nginx,启动失败就关闭keepalived把请求交给另一台。

注:脚本要赋予执行权限!

/etc/keepalived/nginx_check.sh

#!/bin/bash
A=$(ps -C nginx --no-header|wc -l)
if [ $A -eq 0 ];then
    systemctl start nginx
    sleep 3
    if [ $(ps -C nginx --no-header|wc -l) -eq 0 ];then
        systemctl stop keepalived
    fi
fi

配置文件

MASTER配置文件

/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
  # 路由id:当前安装keepalived节点主机标识,全局唯一,可以设置为ip尾数
   router_id node3_33
}

vrrp_script nginx_check {
    script "/etc/keepalived/nginx_check.sh"
    interval 2 # 每隔两秒运行上一行的脚本
    weight -10 # 如果脚本运行失败,降低权重10
}

# 服务器节点
vrrp_instance VI_1 {
  # 当前的node3_33为nginx主节点
    state MASTER
    interface ens32
    # 当前实例绑定的网卡,要根据自己服务器修改!
    virtual_router_id 51
    # 主备节点一致即可
    priority 100
    # 优先级,如果有多个节点,优先级高的数字大
    advert_int 1
    # 主备之间同步检查的时间间隔默认1s
    # 认证授权密码,防止非法节点进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        nginx_check
    }
    virtual_ipaddress {
        192.168.6.160
        # 这里设置你要绑定的VIP,下面同理
    }
}

# 互为主备
vrrp_instance VI_2 {
    state BACKUP
    interface ens32
    virtual_router_id 52
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.6.161
    }
}

BACKUP机配置文件

/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
  # 路由id:当前安装keepalived节点主机标识,全局唯一
   router_id node3_34
}

vrrp_script nginx_check {
    script "/etc/keepalived/nginx_check.sh"
    interval 2 # 每隔两秒运行上一行的脚本
    weight 10 # 如果脚本运行成功,升级权重10
}

# 服务器节点
vrrp_instance VI_1 {
  # 当前的node3_34为nginx从节点
    state BACKUP
    interface ens32
    # 当前实例绑定的网卡
    virtual_router_id 51
    # 主备节点一致即可
    priority 80
    # 优先级,如果有多个节点,优先级高的数字大
    advert_int 1
    # 主备之间同步检查的时间间隔默认1s
    # 认证授权密码,防止非法节点进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        nginx_check
    }
    virtual_ipaddress {
        192.168.6.160
    }
}
# 互为主备
vrrp_instance VI_2 {
    state MASTER
    interface ens32
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.6.161
    }
}

互为主备的好处是其中一台出现故障会自动把两个ip绑定到另一台:

2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:af:cd:c2 brd ff:ff:ff:ff:ff:ff
    altname enp2s0
    inet 192.168.6.34/24 brd 192.168.6.255 scope global noprefixroute ens32
       valid_lft forever preferred_lft forever
    inet 192.168.6.161/32 scope global ens32
       valid_lft forever preferred_lft forever
    inet 192.168.6.160/32 scope global ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feaf:cdc2/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever