Skip to content

Nginx双机热备

常用方案

搭建高性能、高可用的负载均衡集群方案其实有很多,常见的例如:

  • 购买、使用硬件负载均衡器 F5(性能无敌,价格贵,轻松抗下百万QPS)
  • 购买、使用阿里云SLB服务(高效便捷,即买即用)
  • 通过服务器搭建 Nginx + VIP + Keepalived 高可用集群(价格低,低成本,适用于不上云场景!)

对于绝大多数的业务场景来说,都是需要使用云服务器的,所以绝大多数情况根本不会考虑使用 Nginx + VIP + Keepalived 这套高可用负载均衡方案一般用于自建。

实现流程

keepalived在之前单体架构开发时,是一个用的较为频繁的高可用技术,比如MySQL、Redis、MQ、Tomcat等都会通过keepalived提供的虚拟IP(VIP)机制,实现单节点应用的高可用。Keepalived是一个基于VRRP协议来实现的服务高可用方案,VRRP协议允许一台机器可以拥有一个或者多个VIP。

在高可用Nginx集群中,有一个为主Nginx,多个备Nginx,整个集群对外提供一个VIP,通过VIP访问主Nginx,备用Nginx负责监控主节点运行状态,如果发现主节点宕机,则选举其中一个备用Nginx接管主节点的工作,VIP绑定到新选举的主Nginx节点上,这个流程俗称IP漂移,从而实现了高可用。

Nginx双机热备

集群搭建

环境准备

集群部署使用的是虚拟机,不能使用阿里云ECS这种服务,不支持VIP漂移

nginx或其他服务的安装这里不多说

安装 Keepalived

首先,通过 yum【也可以选择其他方式】 安装 keepalived 程序,两台服务器都需要进行下载:

bash
$ yum install -y keepalived

编写 Shell

以Nginx为例

接着需要编写 Nginx 故障检测 Shell 脚本,Keepalived会定时执行ps -C nginx --no-heading|wc -l命令,如果返回0,代表Nginx挂了,然后尝试重启,如果重启失败,停止keepalived触发故障转移如果返回大于0,代表 Nginx 正常运行:

bash
# 两台服务器都需要创建该脚本(注意切换容器ID)
$ cat > /etc/keepalived/check_nginx.sh <<-'EOF'
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
	systemctl stop keepalived
fi
EOF

如果是容器或需要尝试重启一次,参照此脚本

bash
# 两台服务器都需要创建该脚本(注意切换容器ID)
$ cat > /etc/keepalived/check_nginx.sh <<-'EOF'
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    docker start nginx # nginx是nginx容器名字
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        systemctl stop keepalived
    fi
fi
EOF

然后,两台服务器都需要调整一下脚本权限:

bash
# 两台服务器都需要执行
chmod 755 /etc/keepalived/check_nginx.sh

调整 KeepAlived 配置

两台服务器需要调整的配置内容有些区别,所以分别在两台服务器上执行下述命令:

服务器1上的配置内容

nginx
$ cat > /etc/keepalived/keepalived.conf <<-'EOF'
! Configuration File for keepalived
# 全局配置,路由ID,固定不变
global_defs {
    router_id LVS_DEVEL
}
# 定义Nginx状态脚本
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh" 
    # 间隔时间,单位为秒,默认1秒
    interval 2 
    # 权重,当脚本成功或失败对当前节点的优先级是增加还是减少
    weight -5 
}

#VRRP实例
vrrp_instance VI_1 {
    # 主节点
    state MASTER
    # 绑定的网卡,使用ifconfig命令查看获取
    interface eth0
    # 虚拟路由id,保证相同
    virtual_router_id 51
    # 优先级,抢占模式下优先级高的称为主
    priority 101
    # 指定发送VRRP通告的间隔。单位是秒。
    advert_int 2
    # 安全认证用的密码,自定义即可
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 对外暴露的VIP地址
    virtual_ipaddress {
        内网VIP
    }

    # 指定Nginx执行状态脚本
    track_script {
       chk_nginx 
    }
}
EOF

服务器2上的配置内容

nginx
$ cat > /etc/keepalived/keepalived.conf <<-'EOF'
! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh" 
    interval 2 
    weight -5 
}

vrrp_instance VI_1 {
    # 初始角色Backup
    state BACKUP
    interface eth0
    virtual_router_id 51
    # 优先级比master低
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        内网VIP
    }
    track_script {
       chk_nginx 
    }
}
EOF

两台服务器,都启动 Keepalived

bash
# 启动 Keepalived
$ systemctl start keepalived

# 查看日志
$ tail -f /var/log/messages

通过控制台日志可以看到高可用集群部署完毕,此时通过访问内网VIP就能够看到Nginx首页,停止掉某台机器上的keepalived就会出现故障转移,VIP漂移现象!