百万级 QPS 接入层网关架构方案演进

文章目录

  • 前言
  • 1、单机架构
  • 2、DNS 轮询
  • 3、Nginx 单机
  • 4、Nginx 主备 + Keepalived
  • 5、LVS 主备 + Keepalived + Nginx 集群
  • 6、LVS 主备 + Keepalived + Nginx 集群 + DNS 轮询

前言

随着PC、移动互联网的快速发展,越来越多的人通过手机、电脑、平板等设备访问各种各样APP、网站系统。国民级的产品应用接入层QPS甚至能够达到百万、千万级别,那么针对这么大请求量,系统接入层该如何设计才能确保能够承载大请求的同时,保证可用性、拓展性呢?通过该文章我们来梳理一下接入层架构方案

1、单机架构

一个系统投放到线上初期,并不会有大量的用户进行访问使用,不存在大量请求造成服务器负载过高,故障宕机的情况发生,一个系统的QPS(每秒查询数量)可能连5都不到。针对这种QPS很小的情况,我们只需要一台Tomcat服务器对外提供服务就可以满足要求了。

用户通过浏览器输入域名,域名会被DNS域名解析服务进行解析,就能够得到目标服务器的IP地址,有了IP地址就能够将HTTP请求包发送到目标节点上。所有的客户端HTTP请求都会发送到这1台服务器上,服务器对目标HTTP请求进行响应操作,架构图如下:
在这里插入图片描述
这在系统初期还是可以满足要求的,但是随着用户量的越来越多,就会导致单台Tomcat要处理更多的请求,随着用户数的增长,并发压力主要落在单机的Tomcat上,响应逐渐变慢。假设 SpringBoot 内嵌的Tomcat 能够承载的QPS是1000,此时接入层请求量达到 3000 QPS,此时单台Tomcat根本无法满足大请求量场景(需要3台)。就可以通过DNS轮询方案解决该问题。

2、DNS 轮询

上面提到,一个域名网址通过DNS服务可以就解析出IP地址,一台Tomcat通过IP地址对外提供服务。只要一个域名能够轮询解析出3个IP,就能够通过该域名轮询访问3台Tomcat服务,上面提到的单机Tomcat无法处理大流量请求的问题就迎刃而解了。通过一个域名解析出n个IP的操作就是DNS轮询,架构图如下:
在这里插入图片描述
这样通过DNS轮询解析多个IP确实解决了更大请求量的问题,但是随着请求量的不断上升,还是需要不断的横向扩展Tomcat资源,申请更多的IP地址,一个域名要解析出更多的IP地址(无疑是对IP资源的浪费),而且有个致命的问题就是:无法进行故障检测。也就是说如果出现了某台Tomcat宕机,DNS还是会将请求发送给宕机的Tomcat,虽然满足了高性能,但是并不满足高可用的特性,此时不得不提到Nginx

3、Nginx 单机

上面提到了,DNS轮询方案不能够保证高可用(不能检查到哪个Tomcat发生故障),而且随着用户的增多造成IP地址的浪费(需要更多的Tomcat提供服务),通过Nginx就能很好的解决上述提到的问题,Nginx作为一款高性能反向代理负载均衡服务器,理想情况下能够抗住3~5W QPS,我们只需要一台Nginx服务器对n台Tomcat集群进行反向代理、负载均衡、故障转移,就能够解决上述提到的问题。

所有的用户请求都不会直接发送到Tomcat服务器,而是通过Nginx服务器进行路由转发到目标Tomcat上,只需要域名解析一个IP地址对应到Nginx上,不需要为每台Tomcat都申请公网IP地址,Nginx与Tomcat集群之间通过内网IP进行通讯即可,架构图如下:
在这里插入图片描述
此时就算某台Tomcat发生故障不可以处理请求,Nginx会检测Tomcat运行状态并进行故障转移,不会继续将HTTP请求转发宕机的Tomcat节点上,而且Nginx能够承受极高的并发量,我们可以随意横向拓展Tomcat服务器以满足更高请求量的要求,省掉了大量的公网IP地址,上图中只是画了3台,实际上能够代理更多的Tomcat资源。但是有一个问题,就是Nginx如果出现了故障,那就会导致整个系统的请求入口不可用,即便Tomcat集群规模在大,能处理的请求量再多,也无济于事,能否有一个办法保证Nginx的高可用呢?当然有,那就是通过Keepalived来处理单点问题。

4、Nginx 主备 + Keepalived

为了防止单点Nginx宕机导致接入层请求入口不可用,这里可以通过Keepalived来保证Nginx的高可用,这里就需要2台Nginx(一个为主,另一个为备),这里的主备并不是主从那样的关系,也就是说只有主节点Nginx才提供服务,备节点Nginx并不会处理用户请求,只要当主节点出现宕机,才会使用备用节点代替主节点提供服务,这样就避免了Nginx出现单点故障的问题了!但是缺点就是造成了资源的浪费(毕竟主节点正常运行时,备用Nginx不工作!)

值得一提的是,阿里云ECS是不支持Keepalived这套方案的,所以不要妄想在阿里云ECS上使用这套高可用架构。

每台Nginx服务器上都需要安装Keepalived,使用keepalived软件模拟出虚拟IP,然后把虚拟IP绑定到多台Nginx服务器上,不过需要有独立的公网IP用于映射虚拟IP,浏览器访问虚拟IP时,会请求到主Nginx服务器,通过虚拟IP作为接入层请求的入口,主节点Nginx宕机时就会出现IP漂移,将访问入口转接到备Nginx节点,架构图如下:
在这里插入图片描述

完美!解决了Nginx单点故障的问题,看起来确实没什么问题了,不过别忘记了,我们的标题是百万级QPS,上面这个架构也不过能抗个上万级别的QPS,别说百万级别,连几十万级别都很难了,这里有人可能会提到是不是可以加DNS轮询,当然可以!不过就算有多套主备Nginx组合,还是很难达接受百万级别QPS的场景。对于Nginx这种七层负载负载均衡器来说,想要扛百万的QPS还是不太现实的。这是我们可能会想,能否找个性能更强大的负载均衡器给Nginx做反向代理呢(好像俄罗斯套娃),当然有,这里就得提一下四层负载均衡器 LVS了。

5、LVS 主备 + Keepalived + Nginx 集群

LVS一般被用作于负载调度器,它与Nginx的功能类似,但不同点在于:LVS工作在OSI七层网络模型中的第四层-传输层,而Nginx则是工作在第七层-应用层,同时LVS并非是以进程的方式运行在操作系统上的,而是直接位于Linux内核中工作,因此LVS的性能一般是Nginx的十倍以上。

通过四层负载均衡器为七层负载均衡器做请求接受、分发是常用的方案,因为四层负载均衡器性能更强大。如果一台Nginx能够处理3W QPS,那么一台LVS负载均衡器就能够处理30W左右QPS,差距是不是很大!所以我们可以使用LVS接入层请求入口,收到大量请求后再转发给Nginx服务器,然后再通过Nginx服务器路由到Tomcat服务上处理请求,LVS再通过Keepalived提供的IP漂移机制实现单点高可用,这套架构就能够抗住几十万级别的QPS量级了!如下图:
在这里插入图片描述

说到这里,我觉得大家应该也明白了,在这个架构的基础上,在使用DNS轮询方案就能够构建出百万级别的QPS接入层。

6、LVS 主备 + Keepalived + Nginx 集群 + DNS 轮询

毕竟单台LVS负载均衡就能扛几十万,加入单台能够扛35W+ QPS,那么只需要DNS轮询解析3个公网IP地址,就能够处理百万级别请求量级,架构图如下(图中我只画了两个LVS主备):
在这里插入图片描述

通过上述这套架构,能够为接入层提供百万级别的QPS并发,在这里补充一句,上面提到LVS是四层负载均衡器,确实比Nginx这种七层负载均衡器要性能强大太多太多了,但是还有硬件版本的四层负载均衡器,例如:F5,单台就能够达到百万级QPS,但是缺点就是价格太贵太贵了,所以四层负载均衡器如果预算不足,可以使用LVS这种软件负载均衡,性能也是很强的,如果预算充足追求性能,可以使用F5这种氪金操作,当然还有一种方案就是购买云服务厂商的负载均衡服务,例如:阿里云SLB,LVS + Keepalived 也是阿里云SLB负载均衡服务在使用的方案。

最后提一嘴,通过上述这套演进可以发现,别说百万级别,就算是千万级别,也不过是进行拓展加资源就能够解决(LVS替换F5、DNS轮询更多IP地址、升级服务器配置等…),但是话又说回来,你所在公司的业务是否真的需要这么强大高性能的接入层架构,本篇文章提到的所有方案没有好坏之分,只有合适不合适,过度设计是可耻的,选择符合你业务场景的架构方案才是明智之举。

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

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

相关文章

找不到com.fasterxml.jackson.core.exc.StreamWriteException的类文件

1. 前言: 使用springboot搭建的项目, 需要使用 jackson 更改json文件的内容; maven管理jar包, 导入jar包版本信息如下: <!-- 读写json文件所需依赖 --> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databin…

C++语法06 格式化输出及保留小数点后指定位数

格式化输出 格式化输出所用的函数为 printf&#xff0c;它可以输出任意位数的小数。 使用格式&#xff1a;printf(“%.nf”,a)。这句话的作用是将变量a保留n位小数输出。 注意事项&#xff1a; 1、这里的n&#xff0c;需要具体化为一个数字&#xff0c;保留几位小数&#x…

【ARMv8/v9 GIC 系列 3 -- GIC 的 类型寄存器 GICD_TYPER】

文章目录 GIC 类型寄存器 GICD_TYPERESPI_Range, 位[31:27]RSS, 位[26]No1N, 位[25]A3V, 位[24]IDBits, 位[23:19]DVIS, 位[18]LPIs, 位[17]MBIS, 位[16]NUM_LPIs, 位[15:11]SecurityExtn, 位[10]NMI, 位[9]ESPI, 位[8]CPUNumber, 位[7:5]ITLinesNumber, 位[4:0]GIC 类型寄存器…

朗科HD10M2Pr震撼上市,自带风扇极速降温,匹敌私有云

近日,存储领域的领军企业朗科旗下全资子公司朗科创新宣布,其最新款磁吸硬盘盒HD10M2Pr正式上市。这款产品凭借超薄设计、极速降温、高速传输等多项优势,迅速成为了行业内的讨论焦点。 随着移动设备使用的普及和短视频内容的日益丰富,对于存储空间不断增长的需求逐渐成为日常生活…

导入导出带下拉框模版(EasyExcel)

前言 项目进行到新的一个迭代了&#xff0c;赶了1周需求&#xff0c;接口终于处理完了。分享记录下迭代中处理导入、导出、下载模版功能的细节吧。 一、场景 EasyExcel&#xff08;阿里&#xff09;实现Excel数据处理三层表头&#xff0c;第二、三层表头动态数据根据第二、三层…

RabbitMQ(六)仲裁队列、流式队列、异地容灾(联邦队列Federation Queue)

文章目录 仲裁队列1、创建交换机2、创建仲裁队列3、验证主节点宕机不影响消息发送和接收 流式队列&#xff08;不推荐&#xff0c;Kafka主场&#xff09;概念 异地容灾一、Federation插件概述 二、Federation交换机1、总体说明2、准备工作3、启用联邦插件4、添加上游连接端点5、…

NetSuite Inventory Transfer Export Saved Search

用户之前有提出一个实际的需求&#xff0c;大致意思是想要导出Inventory Transfer的相关明细行信息&#xff0c;且要包含From Location&#xff0c;To Location&#xff0c;Quantity等信息。 我们知道From Location和To Location在IT Form中应该是在Main的部分&#xff0c;在D…

java学习--集合(大写一.1)

看尚硅谷视频做的笔记 1.集合框架概述 1.1生活中的容器 首先知道集合是来解决什么问题的&#xff1f; 1.1.1内存层面需要针对于多个数据进行存储&#xff0c;此时&#xff0c;可以考虑的容器有&#xff1a;数组、集合类 对于内存层面的来说&#xff0c;断电后数据就不复存…

后端学习笔记:Python基础

后端学习笔记&#xff1a;Python基础 数据类型&#xff1a; Python中主要有以下几种常用的基本数据类型&#xff1a; String 字符串类型&#xff0c;用单引号或者双引号引用Number 数字类型&#xff0c;包括浮点数&#xff0c;整数&#xff0c;长整数和复数List 列表项&…

界面构件开发之RC文件

代码; #include <gtk-2.0/gtk/gtk.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <glib-2.0/glib.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);gtk_rc_parse("./mainrc");GtkWidget *winN…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 连续字母长度(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

某棋牌渗透测试

前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、信息收集 这里通过fofa进行收集&#xff0c;语法为&#xff1a;body某棋牌 && titlexxx 图1-1 fofa资产收集 …

Human4DiT:使用 4D Diffusion Transformer 生成自由视角人物视频。

Human4DiT&#xff0c;使用 4D Diffusion Transformer 生成自由视角人物视频。又一个根据一张图&#xff0c;生成人物动画视频的项目&#xff0c;效果如下视频所示。 给定参考图像、SMPL序列和摄像机参数&#xff0c;Human4DiT能够生成自由视图动态人体视频。 相关链接 项目地…

神经网络模型---LeNet-5

一、LeNet-5 1.定义LeNet-5模型 model models.Sequential([1.1添加一个二维卷积层&#xff0c;有6个过滤器&#xff0c;每个过滤器的尺寸是5x5。输入图像尺寸是28x28像素&#xff0c;具有1个颜色通道,激活函数是relu layers.Conv2D(6, (5, 5), activationrelu, input_shape…

【Codesys】-计算开机通电运行时间,累计正常使用时间,故障停机时间

应客户要求&#xff0c;在程序添加了这个用来计算开机运行时间&#xff0c;原理就是取当前时间减去一开始记录的时间&#xff0c;没什么特别要求&#xff0c;记录一下使用的变量类型和数据写法&#xff0c;防止忘记了。 下文只写了一个开机通电运行时间的写法&#xff0c;累计…

ROS操作过程中的报错

文章目录 错误&#xff1a;E: Unable to locate package ros-noetic-desktop-full报错问题报错原因解决方法 错误2&#xff1a;ERROR: cannot download default source list from:报错问题错误原因解决办法 错误&#xff1a;E: Unable to locate package ros-noetic-desktop-fu…

养殖自动化温控系统:现代养殖场的智能守护神

现代农业养殖业中&#xff0c;养殖自动化温控系统已经成为提高生产效率和保障动物福利的关键技术之一。本篇文章将深入介绍养殖自动化温控系统的原理、组成、优势及其在不同类型养殖场中的应用实例&#xff0c;并展望该技术的未来发展。 一、养殖自动化温控系统概述 养殖自动…

智能制造 v3.13.12 发布,ERP、在线课堂、表白墙更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

Hive笔记-3

3.2.2 查看表 1) 展示所有表 (1) 语法: 语法: SHOW TABLES [IN database_name] LIKE [identifier_with_wildcards]; In database_name 写的是查哪个数据库,一般不写默认是当前数据库 Like 后面跟通配符表达式 (2) 案例: 查看在 db_hive1 数据库里有没有以 stu 开头的表 …

C++第二学期期末考试选择题题库(qlu题库,自用)

又到了期末周&#xff0c;突击一下c吧— 第一次实验 1、已知学生记录的定义为&#xff1a; struct student { int no; char name[20]; char sex; struct 注意年月日都是结构体&#xff0c;不是student里面的 { int year; int month; …