当前位置: 首页 > news >正文

搞懂Nginx+keepalived实现双机热备,Nginx服务的高可用

目录

何为Nginx服务高可用

keepalived实现Nginx服务的高可用,双机热备

Keepalived故障转移原理

 双机主备缺点

环境搭建

环境准备

修改yum镜像源

搭建主节点

安装nginx-master

安装keepalived-master

修改keepalived.conf配置(默认抢占式)

启动keepalived

安装从节点

效果验证

模拟Master节点宕机


何为Nginx服务高可用

在使用 Nginx 做反向代理或者负载均衡的时候,都是以 Nginx 为入口,如果 Nginx 宕机了,那么所有的服务都无法正常提供,影响非常严重。所有我们需要保证 nginx 高可用,就是配置备份机,前一个挂了,还有后一个。

为了避免负载均衡服务器宕机造成严重影响,就需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。

高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是我们不能保证一个系统能永远不出问题,所以我们只能通过设计来尽可能的去减少由于系统的故障所造成的影响。

keepalived实现Nginx服务的高可用,双机热备

我们可以通过 keepalived 来实现 Nginx 的高可用,keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。Keepalived的作用是检测 web 服务器的状态,如果有一台 web 服务器死机或工作出现故障,Keepalived 将能检测到,并将有故障的 web 服务器从系统中剔除,当web服务器工作正常后 Keepalived 会自动将该 web 服务器加入到服务器群中。这些工作全部都会自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。keepalived 可以理解为一个健康检查的软件。

高可用至少需要 2 台服务器,主备都得装上keepalived,当请求访问主服务器时,备份服务器会一直检查主服务器的状态。

keepalived 需要绑定一个虚拟地址 vip ( Virtual IP Address ) ,这个虚拟 ip 地址绑定在哪台服务器上请求就会发送到哪台服务器,一开始会绑定在主服务器上。

Keepalived故障转移原理

Keepalived之间的通过VRRP进行心跳检测

Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。

Keepalived高可用服务对之间的故障切换转移,是通过VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)来实现的。

在Keepalived服务正常工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

 双机主备缺点

双机主备最大的缺点就是 浪费,因为需要一台备用机与主机配置一样,一般好一点的主机就很贵,如果主机一直不宕机,那么备机将一直空闲等待,这就造成了一个长期的浪费。

环境搭建

环境准备

  • 两台2核心2G的虚拟机
    • Master   主节点虚拟机
    • Backup  备用节点虚拟机
  • ip
    • Master  192.168.96.112
    • Backup 192.168.96.119
    • vip 192.168.96.252 // 虚拟ip,用于访问nginx时使用
  • 软件环境
    • nginx-1.22.0-1.el7.ngx.x86_64
    • keepalived-1.3.5-19.el7.x86_64

修改yum镜像源

一般刚刚安装的虚拟机是没有nginx的yum源

所以需要手动修改yum源镜像

vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

更新,后面一路Y

yum update

搭建主节点

安装nginx-master

install

yum install nginx -y

启动

systemctl start nginx

访问

安装keepalived-master

install

yum -y install keepalived

修改keepalived.conf配置(默认抢占式)

  • 先查询网卡名称
    ip addr

  • 修改配置文件

    vi /etc/keepalived/keepalived.conf
    • 注释配置文件的这两行数据(这两行数据一个是不跳过检查;一个是周期性脚本)

    • 添加nginx 状态检查脚本

       vrrp_script chk_http_ port {
          script "/usr/local/src/nginx_check.sh"  # 检测脚本,这个脚本在下面第二步进行创建
          interval 1   # (检测脚本执行的间隔)1s
          weight -21  # 权重,如果这个脚本检测为真,服务器权重+2
      }

    • 修改 varrp_instance_VI_1的内容,为下面内容

      vrrp_instance VI_1 {
          state MASTER # 主节点MASTER
          interface ens33 # ip addr 查询到的网卡信息
          virtual_router_id 51
          priority 100 # 权重信息默认
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {
              192.168.96.250 # 设置虚拟ip
          }

    • 监听nginx 脚本

         # 监听nginx 脚本
         track_script {
            chk_http_ port
          }

  • 检查nginx状态配置

    • 这个时候还不是一个执行脚本,需要更改脚本的执行权限

      chmod +x nginx_check.sh

    • 复制如下内容到 nginx_check.sh 里面

      A=`ps -C nginx --no-header |wc -l`
      if [ $A -eq 0 ];then
          # 当nginx 关闭,就立刻关闭 keepalived,用于转移虚拟ip到备用机上。
          if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            systemctl stop keepalived
          fi
      fi

    • cd /usr/local/src //切换到/usr/local/sr目录下,执行下面vi创建脚本

      vi nginx_check.sh

启动keepalived

systemctl start keepalived

安装从节点

从节点配置和主节点的一致,需要更改的地方为下方标记处

效果验证

访问虚拟ip

模拟Master节点宕机

关闭master

systemctl stop nginx

发现自动切换到备用机上去了

 重新启动nginx和keepalived

systemctl start nginx
systemctl start keepalived

发现master节点又起来了

发生故障时的邮件通知处理方法可以看另一篇博客实现Nginx挂掉,keepAlived发现故障,切换VIP节点时发送邮件

相关文章:

  • YOLOV5通道剪枝【附代码】
  • 【Vuex】vue状态机详解
  • 使用 shell 脚本二进制部署 k8s 环境 [支持 docker 和 containerd]
  • windows 和 ubuntu 系统区别
  • Docker基础:Dockerfile相关知识介绍
  • Elastic实战:canal自定义客户端,实现mysql多表同步到es
  • R语言dplyr包select_if函数筛选dataframe数据中的所有因子类型变量(筛选所有的因子数据列、is.factor)
  • LVC | 一种简单的小样本目标检测方法
  • TypeScript 贪吃蛇游戏详细教程
  • 无需内嵌代码的全新GUI截图方案在TouchGFX,ThreadX GUIX,emWin,LVGL,AWTK全部测试通过,含多缓冲方式玩法
  • 【信息科学技术与创新】机器学习 深度学习 人工神经网络相关分析
  • YOLO v7详解
  • 简简单单的结构体
  • Spring Cloud Zookeeper 优雅下线优化
  • 《计算机视觉基础知识蓝皮书》第3篇 卷积神经网络
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • C++类中的特殊成员函数
  • Create React App 使用
  • eclipse的离线汉化
  • Javascript基础之Array数组API
  • js面向对象
  • Linux后台研发超实用命令总结
  • log4j2输出到kafka
  • Magento 1.x 中文订单打印乱码
  • nodejs:开发并发布一个nodejs包
  • Spring Boot MyBatis配置多种数据库
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Vue小说阅读器(仿追书神器)
  • 分享一份非常强势的Android面试题
  • 给github项目添加CI badge
  • 理清楚Vue的结构
  • 利用jquery编写加法运算验证码
  • 前嗅ForeSpider教程:创建模板
  • 让你的分享飞起来——极光推出社会化分享组件
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (LeetCode) T14. Longest Common Prefix
  • (二)WCF的Binding模型
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (强烈推荐)移动端音视频从零到上手(上)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)Mysql的优化设置
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)Linux 多线程条件变量同步
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET MVC之AOP
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net解析传过来的xml_DOM4J解析XML文件