概述

nginx作为负载均衡器,所有请求都到nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机,后端web服务将无法提供服务,影响严重。

所以在架构设计中,可以利用nginx的反向代理和负载均衡实现后端应用的负载均衡和高可用性,同时我们还需要考虑Nginx的单点故障。真正做到架构高可用性。

主要考虑以下几点:

1、Nginx服务因为意外现象挂掉

2、服务器宕机导致nginx不可用

目前主流的解决方案就是keepalived+nginx 实现nginx的故障转移,同时做好监控报警。在自动故障转移的同时能通知到相关的应用负责人检查相关应用,排查隐患,彻底解决问题。

keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP

1、实验环境

主机名VIPipnginx端口
nginx01192.168.1.160192.168.1.480
nginx02192.168.1.160192.168.1.5

80

分别在两台服务器上安装nginx和keepalived

2、在nginx01上和nginx02两台主机上安装nginx

2.1、安装nginx(rpm包安装)

yum -y install wget      #安装wget

安装阿里epel源

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com)  

 

选择epel(RHEL 7) 复制安装

用yum 安装nginx

yum -y install nginx

启动nginx 查看端口号

systemctl start nginx

网站测试

 3、在两台主机上装keepalived

3.1、解决依赖

yum -y install gcc openssl-devel pcre-devel libnl-devel

安装keepalived

tar zxf keepalived-2.0.18.tar.gz
cd ke
epalived-2.0.18/
./configure --prefix=/usr/local/keepalived
make && make install

3.2、修改keepalived配置文件

ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
mkdir /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
vim  /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id nginx-01

}

vrrp_script chk_nginx {

       script "/etc/keepalived/nginx_check.sh"

       interval 2  #每2秒检测一次nginx的运行状态

       weight -20  #失败一次,将自己的优先级-20

}

vrrp_instance VI-1 {

    state BACKUP

    interface ens33

    virtual_router_id 51

    priority 100

    advert_int 1

    !nopreempt    #不抢占模式,如果使用抢占模式,只需将其注释即可

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        172.16.16.172

    }

     track_script {

       chk_nginx  # nginx存活状态检测脚本

    }

}

3.3、将keepalived配置文件传给nginx02

scp /etc/keepalived/keepalived.conf 192.168.1.5:/etc/keepalived/keepalived.conf

 修改以下红的的位置

! Configuration File for keepalived

global_defs {

   router_id nginx-02

}

vrrp_script chk_nginx {

       script "/etc/keepalived/nginx_check.sh"

       interval 2

       weight -20

}

vrrp_instance VI-1 {

    state BACKUP

    interface ens33

    virtual_router_id 51

    priority 90

    advert_int 1

    !nopreempt

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        172.16.16.172

    }

     track_script {

       chk_nginx

    }

}

3.4、创建nginx服务检测脚本

分别在nginx01和nginx02服务器的/etc/keepalived目录下创建nginx_check.sh 脚本,并增加执行权限。用于keepalived定时检测nginx的服务状态,如果nginx停止了,会尝试重新启动nginx,如果启动失败,将会keepalived进程杀死,将vip飘逸到备用机器上。

vim /etc/keepalived/nginx_check.sh

#!/bin/bash

num=$(ps -C nginx --no-header | wc -l)

if [ $num -eq 0 ];then

    systemctl start nginx  #尝试重新启动nginx

    sleep 1  #睡眠1秒

    if [ $(ps -C nginx --no-header | wc -l) -eq 0 ];then

        killall keepalived  #若nginx启动失败,将keepalived服务杀死。将vip漂移到其它备份节点

    fi

fi

 说明:

ps -C nginx --no-header | wc -l一般用于shell脚步编写用

-C <指令名称> 选项用来指定程序的名称

--no-header选项去掉头部

killall命令由软件包psmisc提供,确保两台主机要安装psmisc

chmod +x /etc/keepalived/nginx_check.sh

3.5、启动nginx01和nginx02 的 keepalived

systemctl start keepalived

查看进程

ps -ef | grep keepalived

查看VIP绑定状况

ip addr show ens33

nignx01:

nginx02:

3.6、测试故障转移

抢占模式

吧nginx配置文件改错看看脚本是否生效然后VIP是否会漂移

修改nginx 的配置文件把其中也分号去掉重启服务

 因为配置文件改错了重启失败

查看keepalived状态

脚本生效现在keepalived服务已经被杀死

查看VIP

nginx01上的VIP已经消失

 VIP已经漂移到了nginx02上

 

3.6修复模拟故障

将配置文件恢复

然后启动nginx

sysemctl start nginx

启动keepalived

systemctl start keepalived

查看VIP是否回来

ip addr show ens33

VIP已经回到nginx01

查看nginx02是否已经没有VIP 

 上面的结果可以看到因为nginx01 的优先级比较高所以最后VIP又回到了nginx02

4、非抢占模式

和抢占模式的配置相比,只改了两个地方:

    在vrrp_instance块下,两个节点各增加了nopreempt指令,表示不争抢vip。

    两个节点的state都为BACKUP。

 在非抢占模式下,两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。

在两个主机的配置文件中修改

在vrrp_instance模块中修改

state BACKUP  #修改

nopreempt      #增加

 都重启keepalived

systemctl restart keepalived

4.2模拟故障

停止nginx01的keepalived

systemctl stop keepalived

查看VIP的位置

VIP已经转到了nignx02上

 因为是非争抢模式所以吧nginx上的keepalived启动也不会被抢走VIP

 

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐