Linux环境下实现nginx主从备份+集群搭建

4 篇文章 0 订阅
2 篇文章 0 订阅

Linux环境下实现nginx双机热备+集群搭建

说明:本案例模拟真实生产环境,模拟搭建6台linux服务器(CentOS7),6台linux服务器上需要安装nginx(本案例选用1.18.0版本),安装keepalived(本案例选用2.2.7版本)

一、nginx高可用方案介绍

  1. 什么是nginx的高可用?
    nginx高可用就是部署配置两台以上的nginx服务器,正常情况下,主服务器进行工作,从服务器作为备用节点,等待主服务器宕机后,自动切换到备用服务器来接替主服务器继续工作
  2. 为什么要使用nginx的高可用?
    首先,先从nginx的单体架构开始分析,nginx单体架构图如下所示:
    nginx单体架构图
    nginx单体架构往往会存在单点故障或性能上的瓶颈,当nginx服务器宕机或者性能达到瓶颈时,整个应用将会无法使用
    因此,需要引入nginx的高可用方案,来防止单点故障,解决nginx性能上的瓶颈问题
    nginx高可用架构如下所示:
    nginx高可用架构
    相比较nginx单体架构,nginx高可用架构引入了nginx+keepalived机制,高可用架构中至少需要部署两台nginx(主从),并且每一台nginx服务器上需要安装keepalived工具,keepalived通过VRRP(虚拟路由冗余协议)来进行工作,通过keepalived自身提供的健康检查功能,作为MASTER的keepalived持续向作为BACKUP的keepalived发送广播心跳包,当作为BAKCUP的keepalived获取不到来自MASTER的广播包时,就会认为主服务器上的keepalived宕机,之后会通过keepalived的选举机制,选举出新的MASTER节点,完成虚拟ip(vip)的漂移,由新选举出来的MASTER节点接管宕机的keepalived节点继续工作,当主服务器上的keepalived重新启动后,通过进行抢占式或者非抢占式的配置,来决定是从服务器上的keepalived节点继续工作还是主服务器抢占vip继续工作
    主服务器上的nginx宕机时,keepalived会通过配置,持续执行nginx的监控脚本,当发现主服务器上找不到nginx的进程时,就会执行监控脚本中的重启nginx的命令,如果还是监控不到nginx进程,就会重新计算主服务器上keepalived的权重,当主服务器上的权重小于从服务器上的权重时,就会进行vip的漂移,由从服务器上的keepalived节点继续工作,当主服务器上的nginx重新启动后,通过监控重新计算keepalived的权重,当主服务器上的权重大于从服务器上的权重时,主服务器上的keepalived节点又可继续进行工作
    这种主从热备机制的高可用架构,虽然解决了单点故障的问题,但是却不能解决nginx性能上的瓶颈,从某种意义上来说,这种主从热备机制的高可用方案,依然属于单体架构,因为始终只有一台nginx在工作,当并发量很高的时候,依然会存在nginx性能上的瓶颈,因此需要通过nginx的水平扩展,通过引入主从热备+集群的方式,解决单点故障和弥补nginx性能上的瓶颈
    主从热备+集群的高可用架构如下所示:
    nginx主从热备+集群架构图
    从上图可以看出,主从服务器之间通过keepalived实现主从热备,解决单点故障问题,通过集群部署的方式分担客户端发送来的请求,降低单体nginx所承受的负载,弥补nginx的性能瓶颈,真正实现nginx的高可用
  3. nginx的高可用方案
    ①双机热备机制(主从热备/双主热备)
    ②双机热备+集群机制

二、主从备份(双机热备)搭建

服务器名称服务器ip
server1192.168.132.138
server2192.168.132.141
  1. 本案例将192.168.132.138作为主节点cd到keepalived核心配置文件所在目录下,执行vim keepalived.conf命令编辑核心配置文件
vrrp_instance VI_1 {
    state MASTER    # 设置keepalived节点的初始化状态为MASTER
    interface ens33
    virtual_router_id 51
    priority 100    # 设置keepalived节点的优先级
    advert_int 1    # 设置vrrp包发送间隔,即多久进行一次master选举,主从节点需要设置相同
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    # 设置虚拟ip,即对外暴露地址
        192.168.132.16
    }
}
  1. 192.168.132.141作为从节点,对从节点上的keepalived核心配置文件进行编辑修改
vrrp_instance VI_1 {
    state BACKUP    # 设置keepalived节点初始换状态
    interface ens33
    virtual_router_id 51
    priority 90    # 设置keepalived节点优先级,应小于keepalived主节点优先级
    advert_int 1    # 设置vrrp包发送间隔,朱从节点需设置相同
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    # 设置虚拟ip,需与主节点设置一致
        192.168.132.16
    }
}
  1. 以上配置只是做了节点的主从配置,当keepalived主节点发生故障时,会发生虚拟ip(vip)漂移,keepalived从节点会接管主节点继续进行工作,当keepalived主节点恢复正常后,又会重新抢占vip进行工作,但是,当主节点服务器上的nginx发生故障时,整个应用还是无法正常使用,因此就需要通过keepalived配置检测nginx的健康状况,实现nginx主备服务器的自动切换
  2. 编写keepalived检测脚本
#!/bin/bash

A=`ps -C nginx --no-header | wc -l`    # 声明检测nginx进程检测命令
if [ $A -eq 0 ];then    # 如果nginx进程不存在
    /usr/local/nginx/sbin/nginx    # 启动nginx
    sleep 2    # 睡眠2秒
    if [ $A -eq 0 ];then   # 重建检测nginx进程是否存在
        exit 1    # 如果不存在,返回1
    else 
        exit 0    # 如果存在,返回0
    fi
fi

注:
①#!/bin/bash只能放在第一行,表示本脚本由/bin/路径的bash程序来解释,#后面不能有空格,否则keepalived执行检测脚本时会报错
②如果脚本返回1,则会自动进行priority+weight优先级计算
检测脚本在主从节点服务器上都要存在
④脚本文件需要赋可执行权限chmod 777 脚本名称
5. 重新对主从keepalived节点进行配置,新增keepalived的脚本检测命令

# 声明nginx检测函数
vrrp_script nginx_check {
    script /usr/local/nginx/sbin/nginx_check.sh    # 指定检测脚本位置
    interval 2    # 每2秒检测一次nginx的运行状态
    weight -20    # 失败一次,进行一次priority+weight优先级计算
    fail 2    # 如果脚本检测两次失败,则认为nginx发生故障
    rise 1    # 如果脚本检测成功一次,则认为nginx恢复正常
}

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.132.16
    }
    track_script {    # 声明需要进行检测的函数
        nginx_check    # 对应上面定义的nginx检测函数名称
    }
}

  1. 主从节点服务器分别启动nginx和keepalived,浏览器访问配置的虚拟ip地址,发现是主节点服务器上的nginx给出的响应
    访问虚拟ip测试

  2. 在主节点服务器上,kill掉nginx进程,浏览器立即访问虚拟ip地址,会发现请求一直在loading,等待几秒钟后,浏览器重新请求,发现主节点服务器上的nginx又能给出响应了,执行ps -ef|grep nginx命令发现存在nginx进程,说明主节点keepalived执行了nginx检测脚本,重启了nginx服务(脚本文件中sleep指令和启动nginx指令交换位置,测试效果会更明显)
    查看nginx进程变化情况

  3. cd到nginx执行文件目录下,执行mv命令将nginx启动文件移动到其他目录下,再次kill掉nginx进程,观察nginx进程的变化情况,因为nginx启动文件不在脚本声明的路径下,因此执行nginx检查脚本,不会在启动nginx服务,每执行失败一次,就会重新计算优先级,失败指定次数后,就会认为nginx服务发生故障,此时如果主节点优先级<从节点优先级,vip就会漂移到从节点服务器上,此时浏览器访问192.168.132.16虚拟ip,就会发现,是从节点服务器上nginx做出的响应
    访问虚拟ip

  4. 将nginx启动文件mv到原来执行文件所在目录下,keepalived主节点执行检测脚本时,会重启nginx服务,keepalived执行检测脚本成功指定次数后,就会认为主节点上nginx服务恢复正常,此时keepalived主节点就会抢占虚拟ip重新绑定的主节点所在服务器上,通过浏览器访问192.168.132.16虚拟ip,就会发现,主节点服务器上nginx又重新做出的响应
    访问虚拟ip
    至此,nginx双机热备搭建完成

三、主从热备机制–抢占式和非抢占式模式配置验证

  • 服务器准备:
    192.168.132.138-------->nginx+keepalived(MASTER)
    192.168.132.141-------->nginx+keepalived(BACKUP)
    192.168.132.16---------->vip
  1. 抢占式
    实际上,keepalived默认配置就是抢占模式,即MASTER服务器正常工作时,BACKUP服务器只作为备用节点等待,并不进行工作,当MASTER服务器宕机后,vip自动漂移到BACKUP服务器,由BACKUP服务器接替MASTER服务器继续工作,当MASTER服务器恢复正常后,通过抢占的方式,实现vip的再次漂移,此时MASTER服务器继续工作,BACKUP服务器仍作为备用节点等待
    (1)分别启动138、141两台服务器上的keepalivednginx
    (2)启动成功后,浏览器访问192.168.132.16虚拟ip地址,发现是主节点138服务器上nginx返回的响应
    访问vip
    (3)在138、141两台服务器上分别执行ip addr命令,观察ens33网卡上ip的绑定情况,可以观察到,此时虚拟ip192.168.132.16绑定在138这台主服务器上
    vip绑定情况
    vip绑定情况
    (4)kill掉138服务器上的keepalived进程,再次在浏览器上访问192.168.132.16虚拟ip,可以发现此时,发送响应信息的是141服务器
    访问虚拟ip
    (5)此时,再次执行ip addr命令查看虚拟ip的绑定情况,发现vip已自动漂移到了141服务器
    vip自动漂移
    (6)重启138服务器上的keepalived服务,发现vip又重新漂移到了138服务器上
  • 注:以下情况才会发生vip的抢占
    ①两台都为master时,server1的优先级大于server2,keepalived启动后,server1变为master,server2自动降为backup,server1宕机,server2接替工作,server1恢复,抢占vip继续工作,server2变为backup
    ②server1为master,server2为backup,并且server1的优先级大于server2,keepalived启动后,server1变为master,server2自动降为backup,server1宕机,server2接替工作,server1恢复,抢占vip继续工作,server2变为backup
    ③server1为master,server2为backup,并且server1优先级小于server2,keepalived启动后,server2变为master,server1自动降为backup,server2宕机,server1接替工作,server2恢复,抢占vip继续工作,server1变为backup
  1. 非抢占式
    非抢占模式即当master节点宕机时,backup节点接替master节点继续工作,当master节点恢复正常后,并不会抢占backup节点上的vip,而是等待backup节点宕机后,再通过vip自动漂移,master节点重新进行工作,非抢占模式需要通过配置才能生效
    (1)cd到keepalived核心配置文件目录下,执行vim keepalived.conf命令进行编辑,通过配置nopreempt属性实现非抢占模式,master和backup都需要添加该属性
vrrp_instance VI_1 {
    state MASTER    # keepalived状态
    interface ens33    # 网卡名称
    virtual_router_id 51    # 虚拟路由id
    priority 100    # 优先级
    advert_int 1    #
    nopreempt    # 开启非抢占模式
    # 认证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟ip
    virtual_ipaddress {
        192.168.132.16
    }
    # nginx宕机后,进行vip漂移的函数
    track_script {
        nginx_check
    }
}

(2)浏览器访问192.168.132.16虚拟ip,master服务器返回响应信息
访问vip
(3)执行ip addr命令,发现虚拟ip绑定在master服务器上
(4)关闭主服务器上的keepalived服务进程,再次执行ip addr命令,发现虚拟ip已经漂移到了backup服务器上
(5)重新启动主服务器上的keepalived服务,执行ip addr命令,发现虚拟ip仍然绑定在backup服务器上
查看虚拟ip绑定情况
(6)关闭从服务器上的keepalived服务进程,发现虚拟ip重新漂移到了master服务器上
查看虚拟ip绑定情况

四、集群环境搭建

服务器名称服务器ip
server1192.168.132.138
server2192.168.132.139
server3192.168.132.140
server4192.168.132.141
server5192.168.132.142
server6192.168.132.143
tomcat1192.168.132.144
tomcat2192.168.132.145

其中,server1-----server4上部署的keepalived搭建双机热备,虚拟ip设置为192.168.132.16,server2-----server5上部署的keepalived搭建双机热备,虚拟ip设置为192.168.132.17,server3-----server6上部署的keepalived搭建双机热备,虚拟ip设置为192.168.132.18
server1–server6上部署的nginx做tomcat1和tomcat2的反向代理

  1. 分别启动server1–server6这六台服务器上的nginx和keepalived,通过观察六台服务器上虚拟ip的绑定情况和浏览器访问虚拟ip地址来测试双机热备是否搭建成功
    访问虚拟ip
    访问虚拟ip
    访问虚拟ip

  2. 启动tomcat1和tomcat2,server1–server6六台服务器上nginx配置的反向代理监听的端口为82,nginx负载均衡默认为轮询,通过浏览器访问虚拟ip192.168.132.16:82、192.168.132.17:82、192.168.132.18:82,测试集群环境下nginx的负载均衡,从而实现nginx真正意义上的高可用架构
    nginx集群下负载均衡测试
    nginx集群下负载均衡测试
    nginx集群下负载均衡测试

  • 19
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值