Nginx: 高可用和与虚拟路由冗余协议VRRP原理以及KeepAlived软件架构

news2024/9/23 13:30:15

Nginx 服务的高可用


1 )服务可用

  • 假定是这样一个最传统的一个CS模式的一个客户服务器模式
    • 这里有用户和一台服务器
    • 服务器可能是mysql, 也可能是webserver, 或其他服务器
  • 想实现服务可用的一个三要素
    • 1.1 ) server 需要公网的ip地址以及申请一个域名
    • 1.2 ) 需要服务软件和相关端口
    • 1.3 ) 存在对应的数据,如:
      • webserver需要css, html, js 等
      • sqlserver需要库和表

2 ) Nginx 高可用

  • 我的客户端通过互联网去访问远端的Nginx服务器
  • Nginx 服务器肯定是需要具备上面服务可用的三要素
    • Nginx有一个合法的公网ip地址和域名
    • Nginx软件可用,并且80,443等端口正常
    • Nginx资源文件访问正常
  • 如果这台Nginx在运行的过程中,并发量很大,存在服务器掉电等等一些不可控的故障,要实现我的业务连续性的这种高可用,应如何?
  • 保证Nginx宕机后,转移到另外一台Nginx服务器上,并且把IP地址配置到备用的Nginx上,同时启动相关端口,以及相同的数据文件,这样高可用就实现了
  • 这个难点在如何去保证现在Nginx上所配置的面向公网的这个IP地址能够实现在Nginx宕掉之后去自动的转移到另外一台Nginx上
  • 这个需要VRRP的虚拟路由冗余协议,本身能够解决这个问题
    • 能够实现宕机时将IP地址,从一台服务器自动的去转移到另外一台服务器上
    • 同时在这两台服务器之间,是有心跳信息监控的
    • 保证IP地址,总是能够配置到一台存活的Nginx服务器上
    • 从而去实现Nginx服务的高可用

3 )VRRP 原理

  • IP地址是如何实现在多台服务器之间进行转移的是比较难实现的
  • 在这里有一个叫VRRP协议本身它就是为解决这样一个问题而生

3.1 原理

  • 公司内网内,有很多员工都有自己对应的PC电脑
  • PC电脑想要通过一定的网关设备,gateway设备去访问对应的互联网
  • 不可能给每一台个人电脑都去申请一个公网的IP地址,公网IP地址是有是有成本的
  • 每一台PC电脑都去申请一个公网的IP地址,这个是不可能,也是不现实的
  • 因此,有这样一个解决方案,在我们的 gateway 上配置了两个IP地址
    • 里面有一个网卡会配置一个对应的内网内的一个IP地址
    • 这个内网IP地址,和我们所有PC上所配置的内网IP地址是在同一个网段的
    • 同时,gateway 还有另外一个网卡上配置一个公网的IP地址
    • 那 gateway 就能够实现和内网和公网相通
  • 这个时候PC电脑想要去访问公网或internet上的一些东西的时候
    • 比如说去浏览一些网页,查到一些文件的时候
    • 它可以将这个请求转发给这台 gateway
    • 之后,gateway可以将请求再通过另外一块网卡转发给 internet
    • 当报文回来的时候还是一样,也会首先到达gateway的一个公网的网卡上
    • 由 gateway再作为代理,去把这个数据报文传送给对应的PC电脑
    • 它整个过程是这样的
  • 对于我们这样一些网关设备,可能是路由器或者是其他一些设备,它都是一个单点的
  • 假如说,gateway网关设备宕掉后,其实内网内所有的PC都不能够再去访问对应的internet了
  • 这个时候,想要去解决网关设备(重要设备)的一个单点故障的时候,如何去解决呢?
  • 其实我们有这样一种思路, 可以给他找另外一台 gateway
  • 现在给了两台一模一样的设备,给这台设备也配置上一个对应的IP地址
    • 一个内网的IP地址,一个公网的IP地址
  • 但是有一个问题,因为我们这个 gateway 在这配置对应的内网的IP地址的时候
  • 内网的IP地址是不可以相同的,那对这种,如何去解决呢?
  • 不管在PC电脑上,需要去设置代理服务器的地址,还是通过广播的形式去请求对应gateway的IP地址
  • 不管哪一种方式来说,这个IP地址它只能有一个
  • 如何去实现两台gateway,对所有的PC电脑都有一个IP地址
  • 其实VRRP本身就能去实现这样一个功能, 两台gateway都有各自的IP地址但不提供给PC
  • 这两台 gateway 正常情况下只有一台是提供服务的,一个是master(提供服务),另一个是backup
  • 还有一个另外的IP地址,称之为 虚IP, 即:VIP, 比如:
    • VIP: 192.168.1.1
    • master gateway: 192.168.1.2
    • backup gateway: 192.168.1.3
  • 因为这个VIP它是可以在我们两个网关设备之间进行漂移的
  • 某一时刻,我的master的gateway在提供服务的时候,其实这个VIP地址是配置到对应的 master gateway上的
  • 其实这个VIP是真正对外提供服务的,也就是说,所有的PC电脑想要访问的时候,都需要将代理设置为对应的VIP
  • 但是这一切,他们之间,这个VIP在master和backup之间进行自动转移, 对我们的PC来说是透明的
  • 因此, 有这样一个场景,比如说在某一时刻,有两台网关设备,这个backup的网关设备,对外是不提供服务的
  • 某一个时刻,master的gateway 挂掉之后,这个VIP才会自动去漂移到我们这个对应的backup的gateway上
  • 这里,还有一个 vmark,为什么会有vmark这样一个地址呢?
  • 其实, 这个VIP地址是配置在我们的 master gateway上的。
  • MAC地址(物理地址)是跟网卡绑定的, 不同的网卡的MAC 地址肯定是不一样
  • 假如说VIP在这一时刻是配置在 master gateway上的
  • 这个时候,我对应的PC电脑去和 VIP 通信的时候,它会发ARP请求
  • 同时它得到的会是这个master gateway上的对应网卡的一个 MAC 地址信息
  • 这个时候, 我的master有故障, VIP转移到backup上,备用的网关上对应的网卡MAC地址
  • 肯定跟master的MAC地址,是不一样的,所以,在这需要有一个 VMAC
  • 也就是说, 这个VIP和VMAC,它对于所有的客户端来说都是一样的
  • 它是能够实现对应的 master和gateway上进行正确转移的
  • 整个过程是这样的
    • 在某一个时刻,我们的VIP和我们的VMAC都会配置到我们的master gateway上
    • 假如说,master gateway 在某一个时刻故障当掉了
    • 这个时候, VIP和VMAC 会一同的转移到 backup gateway 这个设备上
  • 对整个过程来说,master getway 和 backup gateway 两个配合的是天衣无缝的, 对外,他们就是一个整体
  • VRRP本身就是实现了这样一个能力,总结一下
    • 虚拟网关:有一个master和多个backup组成
    • Master 网关:实际承载报文转发的节点,主节点
    • Backup 网关:主节点故障号转移节点,备用节点
    • 虚拟IP地址:虚拟网关对外提供服务的IP地址
    • IP地址拥有者:真实提供服务的节点,通常为主节点
    • 虚拟MAC地址:回应 ARP 请求时使用虚拟MAC地址
    • master故障后,需要转移到哪一台backup,优先级如何定
    • 非抢占式:master挂掉又恢复,backup一直提供服务,不会回到master上
    • 抢占式:master修复上线后,从backup再次回到master
  • VRRP 原理是为了 KeepAlived 软件提供理论支持的
  • KeepAlived 软件实现了VRRP原理

KeepAlived软件架构

  • VRRP协议最初设计是用来解决局域网环境中网关的高可用问题
  • KeepAlived的软件实现了VRRP协议提供对虚拟IP的一个转移能力
  • 同时, 它最初设计是用来高可用我们的LVS服务, 是Linux虚拟服务器角色
  • LVS是非常重要的负载均衡服务, 它在四层对应用服务进行负载均衡
  • 因此它的负载均衡能力比LBS还要强, 由于它是在内核中
  • Nginx 作为负载均衡是在七层进行负载均衡需要考虑应用层的很多特征信息
  • 肯定不如在四层这种传输层直接去进行负载均衡,能力更强
  • 它本身最初设计就是为了高可用LVS的,只是在后来它又被开发者开发出来更多的用途
  • 也能够去兼容高可用于其他一些应用服务

1 )架构图

  • 在这个架构图中,右边最核心的有一个 VRRP Stack
  • 也就是实现了 VRRP 的一个协议栈,对软件本身它就是实现了VRRP协议的一个软件
  • 它最重要的一个功能就是 VRRP Stack, 能够实现VRRP协议,能够对IP进行转移
  • 下面还有一个IPVS wrapper, KeepAlived 本身的设计就是用来高可用 IPVS 和 LVS 的
  • LVS其实它有很多的这个规则,它的规则也是需要在不同的服务器上进行转移的
  • 比如说你有两台LVS的服务器,正常情况下是由其中一台提供服务
  • 如果一台断掉之后,除了利用 VRRP Stack 这样一个协议栈的能力
  • 将虚拟IP转移到另外一台备用节点服务器上
  • 除此之外,还需要在备用服务器节点去生效新的IPVS规则,也就是LVS的一个规则
  • 因此,在这内置有一个叫 IPVS wrapper 的模块
  • 这个模块就是用来实现IPVS规则,在不同的服务器上进行转移的
  • 当主节点当掉之后,它会自动的将主节点上的这个IPVS规则给擦除掉
  • 同时,虚拟IP会转移到备用服务器节点上
  • 同时在备用服务器节点上也会利用IPVS wrapper 模块去启用对应的IPVS规则
  • 从而实现了对LVS的一个高可用
  • 在这所谓的IPVS规则,其实就是Nginx程序,其实都一样,只是LVS本身它是不需要数据的
  • 为什么叫LVS虚拟服务器呢?就是因为它本身不会真正去处理这样一些数据
  • 真正的处理这些请求的服务器都会在后面的服务器
  • 既然自己本身不处理这个请求,只是把请求转发到后端的很多真实的服务器上
  • 这个时候,就需要有一个 Checkers 这样的一个模块
  • 这个 Checkers 模块,其实说白了,也就是这台高可用的LBS或者是Nginx服务器
  • 能够实现对我们后端提供这种请求处理的真实服务器进行一个健康状态监测
  • 比如说,他提供了多种监测方式,如TCP的监测方式,或者是HTTP/SSL检测方式等
  • 如果想启用HTTP的监测方式的时候,比如说我这台LBS的服务器,或者是在Nginx的服务器
  • 也就是说这台服务器它会定期的通过HTTP的形式发送一个数据包给我后端的每一个应用服务器
  • 应用服务器,收到之后会返回一个HTTP的包,如果定期收到回应包是200的
  • 就认为后端这台应用服务器是存活着的, 否则认为是 Down掉了
  • 这个时候当新的请求过来的时候,这个请求不会再转发到后端这台已经Down掉的服务器上
  • KeepAlived 本身针对 LVS能够提供一个健康状态监测的能力
  • KeepAlived 本身是为 LBS 高可用设计的,但是它也能够去实现对Nginx的高可用
  • 只是说它内置没有这样的模块,需要去写一些辅助脚本来去实现辅助 KeepAlived 进行监测
  • 当然它还有其他模块,像内存管理模块,像IO复用模块等等

2 )核心服务能力

  • 第一个就是能够实现对服务器服务的一个故障转移
  • 第二个就是通常用于对负载均衡器的高可用
    • 比如说LVS或者是Nginx,HAproxy等等负载均衡器都能够去实现高可用

3 ) 适用的场景

  • 高可用 LVS
    • 虚拟IP的转移
    • 生成ipvs规则
    • RS健康状态检测
  • 高可用其他服务
    • 虚拟IP的转移
    • 编写脚本实现服务启动/停止

4 )核心组件

  • vrrp stack:vrrp协议的实现
  • ipvs wrapper:为集群内的节点生成ipvs规则
  • checkers:对集群内所有的RS做健康状态检测
  • 控制组件:对配置文件解析和加载

5 )总结

  • KeepAlived 本身就是一个VRRP协议栈的一个实现
  • 能够实现对虚拟IP的实时在不同的服务器节点之间转移
  • KeepAlived本身是为LVS高可用设计的,但是它也可以去高可用其他的一些服务
  • 只是如果说想要去高可用LVS的其他服务的话,必须通过写一些辅助脚本来实现
  • 但是要用高层LVS的话,你根本不需要写任何脚本,在配置文件中做就OK了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MIG IP核详解

1.MIG IP核简介 MIG(Memory Interface Generators) IP 核是Xilinx公司针对DDR存储器开发的 IP,里面集成存储器控制模块,实现DDR读写操作的控制流程,下图是7系列的 MIG IP 核结构框图。MIG IP 核对外分出了两组接口。左侧是用户接口&#xff…

自制实战吃鸡手柄原理

在前面的讨论中,通过类似物理点击的方式来实现了声控触发射击键的点击 【Arduino】自制声控点击器(吼叫吃鸡助手)_辅助机械臂物理物理键盘点击器神器-CSDN博客 为了更有实战效果,我们可以把玩具枪改造为一个手柄,这样…

2024年Java最新面试题总结(三年经验)

目录 第一章、基础技术栈1.1)集合,string等基础问题1、arraylist ,linkedlist的区别,为啥集合有的快有的慢2、字符串倒叙输出2.1、字符串常用方法2.2、字符串号拼接的底层原理3、讲一下Java的集合框架4、定义线程安全的map&#x…

进制数基础知识 与 位运算(基础版)

目录 1. 计算机常用进制类别 2. 10进制转各种进制(取余倒置法) 3. 二进制转8进制、16进制 3.1 二进制转8进制 3.2 二进制转16进制 4. 原码、反码、补码 5. 整型提升 与 算术转换 5.1 整型提升 5.2 算术转换 6. 移位操作符 6.1 左移操作符( &l…

【spring】学习笔记2:sample、boot功能和组件设计

Spring自带了一个强大的Web框架,名为Spring MVC。Spring MVC的核心 是控制器(controller)的理念。控制器是处理请求并以某种方式进行信息 响应的类。在面向浏览器的应用中,控制器会填充可选的数据模型并将请求 传递给一个视图,以便于生成返回给浏览器的HTML。在pom.xml文件…

前端开发——熟悉WebSocket(包含示例)

最近在开发中需要调用第三方API,现在大家的API基本上都是使用WebSocket来进行的,前端也必须来学一手了 什么是WebSocket 参考:https://blog.csdn.net/L2043524156/article/details/139271715 有如下四个好处: 双向通信&#x…

C# .Net 条码批量自动打印框架 基于Bartender 10.1 V1.0

调用Bartender打印模板,批量打印条码。 需要有一定的C#开发能力。 非常适合工厂中从ERP拿取信息后,批量打印出货条码。 提供全部源代码,毫无保留。 Winform程序,使用了依赖注入(微软DI),数据库访问的ORM为Dapper。…

位图 —— 哈希思想的产物

目录 1.学习位图的前置知识 计算机中数据存储的单位 C中数据类型的大小 2.位图的讲解 位图的引出 位图的使用 位图的实现 位图完整代码 3.位图的总结 位图的优缺点 优点 缺点 1.学习位图的前置知识 计算机中数据存储的单位 想要学习位图,首先要明白什…

在Windows10系统快速启用telnet功能

打开Windows控制面板 → 程序 → 启用或关闭Windows功能 勾选Telnet客户端 然后确定 启用后windowR 打开运行,输入cmd回车 使用telnet命令回车 可以直接使用telnet命令(如果提示telnet是外部命令需要重启电脑) 输入 ?/help 可查看帮助 到…

排序算法:

冒泡排序: 从列表的第一个数字开始进行比较,判断该数和下一个数之间的大小关系,如果该数比右边的数大,则交换位置;否则不变。一般一轮可以确定最大的数字,在列表的最后一位。 代码: 注意&…

开源 AI 智能名片 S2B2C 商城小程序在现代商业中的创新与启示

摘要:本文通过分析一种以 9.9 元裙子为代表的独特商业模式,探讨了其背后的现金流、产品和渠道组合策略,以及开源 AI 智能名片 S2B2C 商城小程序在其中可能发挥的作用和带来的启示。 一、引言 在当今竞争激烈的商业环境中,企业不断…

Redis数据结构与连接

1 基本的数据结构 1.1 string string的实现有多种 int:字符串长度小于等于20且能转成整数raw:字符串长度大于44embstr:字符串长度小于等于44 字符串长度小于1M 时,加倍扩容;超过 1M 每次只多扩1M;字符串…

【如何在Mac电脑和示波器之间共享文件】

如何在Mac电脑和示波器(Tektronix OSC)之间共享文件 Tektronix Lan: Mac Lan: 按下Utility,開始設定; 按下Utility Page,選至I/O; Network Configuration選至Manual,再Set IP Adresses Manually&am…

tailwindcss

什么是Tailwind CSS Tailwind CSS 是一个可定制化的 CSS 框架,最大的特点是功能类优先,和我们知道的bootstrap,element ui,antd,veui等框架一样。将一些CSS样式封装好,用来加速我们开发的一个工具。 简单…

精选算法编程题

一、有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后&am…

JAVAEE初阶第二节——多线程基础(中)

系列文章目录 JAVAEE初阶第二节——多线程基础(中) 多线程基础(中) 多线程带来的的风险-线程安全 (重点)synchronized 关键字volatile 关键字wait 和 notify 文章目录 系列文章目录JAVAEE初阶第二节——多线程基础(中) 多线程基础(中)一.多线程带来的的风险-线程安全 (重点)1…

CSDN字体、颜色设置

目录标题 一、字体设置二、字体颜色设置 一、字体设置 设置文字字体的基本语法如下&#xff1a; <font face"字体名称">显示内容</font>在字体名称部分写入字体的名称&#xff0c;比如常见的&#xff1a;宋体、微软雅黑、黑体、华文行楷、方正姚体、楷…

C++奇迹之旅:深度解析list的模拟实现

文章目录 &#x1f4dd;前言&#x1f320;list节点&#x1f309;list &#x1f320;迭代器的创建&#x1f309;const迭代器 &#x1f320;代码&#x1f6a9;总结 &#x1f4dd;前言 &#x1f320;list节点 我们先建立一个列表里的节点类listnode&#xff0c;用来构造list的节…

【知识】对比Share mem/Pin mem/GPU mem之间的传输速度

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 参考代码 运行结果 参考代码 import torch import time import matplotlib.pyplot as plt# 初始化设备和张量 device torch.device(cuda) dat…

float 或 double 运算的时候会有精度丢失的风险?

《阿里巴巴 Java 开发手册》中提到&#xff1a;“浮点数之间的等值判断&#xff0c;基本数据类型不能用 来比较&#xff0c;包装数据类型不能用 equals 来判断”。“为了避免精度丢失&#xff0c;可以使用 BigDecimal 来进行浮点数的运算”。 浮点数的运算竟然还会有精度丢失…