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

news2024/12/22 10:03:23

文章目录

  • 前言
  • 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.coloradmin.cn/o/1843496.html

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

相关文章

pdf只要前几页,pdf怎么只要前几页

在现代办公和学习环境中,PDF文件已成为我们日常处理信息的重要工具。然而,有时我们并不需要整个PDF文件的内容,而只是其中的几页。那么,如何高效地提取PDF文件中的特定页面呢?本文将为您介绍几种实用的方法。 打开 “ …

阿里CEO个人投资的智驾公司,走了不一样的路

佑驾创新在去年8月和11月完成两轮融资,在今年5月底递表港交所,目前拿到了29家车企88款车型的量产订单。自动驾驶赛道不缺明星,这些因素本不足以凸显它的差异化。但是在招股书中,一条特殊的发展路线,却让佑驾创新显得不…

搭建开发模式下的以太坊私有链【Geth:1.14.5】

一、为什么用到私有链? 在以太坊的公有链上部署智能合约、发起交易需要花费以太币。而通过修改配置,可以在本机搭建一套以太坊私有链,因为与公有链没关系,既不用同步公有链庞大的数据,也不用花钱购买以太币&#xff0…

2024GLEE生活暨教育(上海)博览会,8月20-22日,国家会展中心(上海)

2024GLEE生活暨教育(上海)博览会将于8月20-22日在中国国家会展中心(上海)举行,博览会总面积近万平方米,设有美好生活和教育产品两大主力展区,全面覆盖婴幼儿、学龄前、小学、初中、高中、大学、中年、老年各个年龄段的…

2024年了,上大学可以不需要用到电脑吗?

前言 在2024年的今天,电脑已经成为了人们工作生活的一大部分。Oh, no!好像手机才是。 好像每个人都是这样的:可以没有电脑,但不能没有手机…… 所以2024年的今天,上大学的小伙伴们可以不需要用到电脑吗?…

DDMA信号处理以及数据处理的流程---cfar检测

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…

SpringBoot 实现全局异常处理

为什么要使用全局异常处理? 减少冗余代码: 在不使用全局异常处理器的情况下,项目中各层可能会出现大量的try {…} catch {…} finally {…}代码块,这些代码块不仅冗余,还影响代码的可读性。全局异常处理器允许我们在一…

第二十五篇——信息加密:韦小宝说谎的秘诀

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 加密这件事,对于这个时代的我们来说非常重要,那么…

数据分析中的数学:从基础到应用20240617

数据分析中的数学:从基础到应用 数据分析离不开数学的支持,统计学和概率论是其重要组成部分。本文将通过几个具体的实例,详细讲解数据分析中常用的数学知识,并通过Python代码演示如何应用这些知识。 1. 描述性统计 基本概念和用…

java学习--集合(大写二.2)

看尚硅谷视频做的笔记 2.collection接口及方法 jdk8里有一些默认的方法,更多的是体现的是一种规范,规范更多关注的是一些抽象方法。 看接口里面的抽象方法,选一个具体的实现类。 测试collection的方法,存储一个一个数据都有哪些…

ENVI实战—一文搞定监督分类

实验1:利用ROI建立样本训练集和验证集 目的:学会利用ROI建立计算机分类时的样本集 过程: ①导入影像:打开ENVI,选择“打开→打开为→光学传感器→ESA→Sentinel-2”,将Sentinel-2影像导入到ENVI平台中。…

LabVIEW与3D相机开发高精度表面检测系统

使用LabVIEW与3D相机开发一个高精度表面检测系统。该系统能够实时获取三维图像,进行精细的表面分析,广泛应用于工业质量控制、自动化检测和科学研究等领域。通过真实案例,展示开发过程中的关键步骤、挑战及解决方案,确保系统的高性…

MySQL客户端与服务端建立连接抓包分析

文章目录 MySQL客户端与服务端建立连接流程抓包分析1.连接建立流程2.各类数据包介绍2.1挑战数据包2.2认证数据包2.3切换认证插件请求数据包2.4切换认证插件响应数据包2.5成功数据包2.6失败数据包3.注意点4.测试代码MySQL客户端与服务端建立连接流程抓包分析 抓包工具采用的是W…

大厂的 404 页面都长啥样?看到最后一个,我笑了~

每天浏览各大网站,难免会碰到404页面啊。你注意过404页面么?猿妹搜罗来了下面这些知名网站的404页面,以供大家欣赏,看看哪个网站更有创意: 腾讯 网易 淘宝 百度 新浪微博 新浪 京东 优酷 腾讯视频 搜狐 携程 去哪儿 今…

C#——装箱与拆箱详情

装箱与拆箱 装箱: 将值类型转换成引用类型的过程; 拆箱: 把引用类型转为值类型的过程,就是拆箱 装箱 拆箱

usb摄像头应用编程

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

JUC并发编程-第二天:线程高级部分

线程高级部分 线程不安全原子性可见性有序性(指令重排)更多的解决线程安全 线程不安全 多线程下并发同时对共享数据进行读写,会造成数据混乱线程不安全 当多线程下并发访问临界资源时,如果破坏其原子性、可见性、有序性&#xff…

账号和权限的管理

文章目录 管理用户账号和组账号用户账号的分类超级用户普通用户程序用户 UID(用户id)和(组账号)GIDUID用户识别号GID组标识号 用户账号文件添加用户账号设置/更改用户口令 管理用户账号和组账号 用户账号的分类 超级用户 root 用户是 Linux 操作系统中默认的超级…

《米小圈动画汉字》汉字教育动画化:传统与创新的完美融合!

汉字,作为中华文化的瑰宝,承载着千百年来中华民族的智慧和思想。每一个汉字不仅仅是一个符号,更是一段历史的见证,一种文化的传承。在当今全球化的背景下,汉字教育面临着新的挑战与机遇。在这种背景下,如何…

LabVIEW程序退出后线程仍在运行问题

LabVIEW程序退出后,线程仍在运行的问题可能源于资源管理不当、未正确终止循环、事件结构未处理、并发编程错误以及外部库调用未结束等方面。本文将从这些角度详细分析,探讨可能的原因和解决方案,并提供预防措施,帮助开发者避免类似…