百万级 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.rhkb.cn/news/354950.html

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

相关文章

OCC介绍及框架分析

1.OCC介绍 Open CASCADE (简称OCC)是一开源的几何造型引擎,OCCT库是由Open CASCADE公司开发和市场运作的。它是为开源社区比较成熟的基于BREP结构的建模引擎,能够满足二维三维实体造型和曲面造型,国内研究和使用它的单…

[论文笔记]Are Large Language Models All You Need for Task-Oriented Dialogue?

引言 今天带来论文Are Large Language Models All You Need for Task-Oriented Dialogue?的笔记。 主要评估了LLM在完成多轮对话任务以及同外部数据库进行交互的能力。在明确的信念状态跟踪方面,LLMs的表现不及专门的任务特定模型。然而,如果为它们提…

【机器学习】基于稀疏识别方法的洛伦兹混沌系统预测

1. 引言 1.1. DNN模型的来由 从数据中识别非线性动态学意味着什么? 假设我们有时间序列数据,这些数据来自一个(非线性)动态学系统。 识别一个系统意味着基于数据推断该系统的控制方程。换句话说,就是找到动态系统方…

[创业之路-120] :全程图解:软件研发人员如何从企业的顶层看软件产品研发?

目录 一、企业全局 二、供应链 三、团队管理 四、研发流程IPD 五、软件开发流程 六、项目管理 七、研发管理者的自我修炼 一、企业全局 二、供应链 三、团队管理 四、研发流程IPD 五、软件开发流程 六、项目管理 七、研发管理者的自我修炼

系统架构设计师 - 数据库系统(1)

数据库系统 数据库系统数据库模式 ★分布式数据库 ★★★数据库设计阶段 ★★ER模型 ★关系模型 ★ ★结构约束条件完整性约束 关系代数 ★ ★ ★ ★概述自然连接 大家好呀!我是小笙,本章我主要分享系统架构设计师 - 数据库系统(1)知识,希望内…

idea插件开发之在项目右键添加菜单

写在前面 本文看下如何在右键列表中增加菜单。 正戏 首先创建一个Action,要显示的menu选择ProjectViewPopupMenu,如下: action public class CAction extends AnAction {Overridepublic void actionPerformed(AnActionEvent e) { // …

OSPF 动态路由协议(思科、华为)

#交换设备 OSPF 动态路由协议 一、基本概念 1.中文翻译:开放式最短路径优先路由协议(open shortest path first),是一个内部网关路由协议(一个自治系统内)2.也称为:链路状态路由协议&#xf…

火爆全网 LLM大模型教程:从零开始构建大语言模型,git突破18K标星

什么!一本书的Github仓库居然有18.5k的星标!(这含金量不必多说) 对GPT大模型感兴趣的有福了!这本书的名字叫 《Build a Large Language Model (From Scratch)》 也就是 从零开始构建大语言模型! 虽然这是一…

常说的云VR是什么意思?与传统vr的区别

虚拟现实(Virtual Reality,简称VR)是一种利用计算机技术模拟产生一个三维空间的虚拟世界,让用户通过视觉、听觉、触觉等感官,获得与现实世界类似或超越的体验。VR技术发展历程可追溯至上世纪,经历概念提出、…

鸿蒙 Web组件的生命周期(api10、11、12)

概述 开发者可以使用Web组件加载本地或者在线网页。 Web组件提供了丰富的组件生命周期回调接口,通过这些回调接口,开发者可以感知Web组件的生命周期状态变化,进行相关的业务处理。 Web组件的状态主要包括:Controller绑定到Web组…

两行css 实现瀑布流

html <ul ><li><a href"" ><img src"05094532gc6w.jpg" alt"111" /><p>传奇</p></a></li><li><a href"" ><img src"05094532gc6w.jpg" alt"111"…

文件防篡改监控工具 - WGCLOUD全面介绍

WGCLOUD是一款优秀的运维监控软件&#xff0c;免费、轻量、高效&#xff0c;部署容易&#xff0c;上手简单&#xff0c;对新手非常友好 WGCLOUD部署完成后&#xff0c;点击菜单【文件防篡改】&#xff0c;可以看到如下页面 我们点击【添加】按钮&#xff0c;输入监控文件的信息…

深圳比创达EMC|EMC与EMI测试整改:保障电子设备电磁兼容性步骤

随着电子技术的迅猛发展&#xff0c;电子设备在我们的日常生活中扮演着越来越重要的角色。然而&#xff0c;这些设备在运行时产生的电磁干扰&#xff08;EMI&#xff09;以及对外界电磁干扰的敏感性&#xff08;EMC&#xff09;问题&#xff0c;不仅影响着设备本身的性能&#…

Windows电脑部署Jellyfin服务端并进行远程访问配置详细教程

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…

代理模式(静态代理/动态代理)

代理模式&#xff08;Proxy Pattern&#xff09; 一 定义 为其他对象提供一种代理&#xff0c;以控制对这个对象的访问。 代理对象在客户端和目标对象之间起到了中介作用&#xff0c;起到保护或增强目标对象的作用。 属于结构型设计模式。 代理模式分为静态代理和动态代理。…

[Mysql] 的基础知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完整

目录 前言 上篇的内容概况 下篇的内容概况 数据库的分类 关系型数据库 常见的关系型数据库系统 非关系型数据库 1. 键值对数据库&#xff08;Key-Value Stores&#xff09; 特点&#xff1a; 常见的键值对数据库&#xff1a; 2. 文档数据库&#xff08;Document Store…

好用的linux一键换源脚本

最近发现一个好用的linux一键换源脚本&#xff0c;记录一下 官方链接 大陆使用 bash <(curl -sSL https://linuxmirrors.cn/main.sh)# github地址 bash <(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/ChangeMirrors.sh) # gitee地址 …

Redis 网络模型

一、用户空间和内核空间 1.1 linux 简介 服务器大多采用 Linux 系统&#xff0c;这里我们以 Linux 为例来讲解&#xff0c;下面有两个不同的 linux 发行版&#xff0c;分别位 ubuntu 和 centos&#xff0c;其实发行版就是在 Linux 系统上包了一层壳。 任何 Linux 发行版&#…

RS-232协议详解:深入理解与实际应用

RS-232协议详解 RS-232协议&#xff0c;也称为推荐标准232&#xff0c;是一种用于串行通信的标准协议。它在计算机和外围设备之间的通信中广泛应用。本文将详细介绍RS-232协议的各个方面&#xff0c;包括其历史、工作原理、信号类型、连接方式、应用场景等。希望通过这篇文章&a…

如何使用React的lazy和Suspense来实现代码分割?

在React中&#xff0c;使用React.lazy和Suspense可以方便地实现组件的代码分割。代码分割是一种优化技术&#xff0c;它将代码拆分成多个包&#xff0c;然后按需加载这些包&#xff0c;从而加快应用的初始加载时间。下面是如何使用这两个API的基本步骤&#xff1a; 使用React.l…