处理高并发、大数据存储的网站技术架构

2023-11-11

本文转载自: https://zhuanlan.zhihu.com/p/24669514     

大型网站技术架构剖析

  • 高并发,大流量 40亿。PV。page view。3.5亿,IP。
  • 高可用,高可用MySQL。7*24小时不间断运行。
  • 海量数据
  • 用户分布广泛,网络情况复杂
  • 安全环境恶劣
  • 需求快速变更,发布频繁
  • 渐进式发展

网站架构演化发展历程

初始阶段的网站(特点:没人)

应用程序、数据库、文件都在一个服务器上

应用服务和数据服务分离

随着网站业务的发展,一台服务器逐渐不能满足需求:性能越来越差,存储空间不足。这是就需要应用和数据分离。

应用服务器

  • 处理大量的业务
  • 需要更快更强的CPU

数据库服务器

  • 需要快速磁盘检索和数据缓存
  • 需要更快的硬盘和更大的内存

文件服务器

  • 要存大量的用户上传文件
  • 需要更大的硬盘

使用缓存改善网站性能

网站访问的特点和二八定律一样:80%的业务访问集中在20%的数据上。所以如果把这一小部分数据缓存在内存中,可以减少数据库的访问压力,提高整个网站的数据访问速度,改善数据库的写入性能。

网站使用的缓存可以分为两种:缓存在应用服务器上的本地缓存和缓存在专门的分布缓存服务器上的远程缓存。

本地缓存的访问快一些,但受应用服务器内存限制,缓存数据量有限,远程分布式缓存可以使用集群的方式,部署大内存的服务器作为专门的缓存服务器,理论上做到不受内存容量的限制的缓存服务。


使用应用服务器集群改善并发处理能力

使用缓存后,数据访问压力得到有效的缓解,但是单一应用服务器能够处理的请求连接有限,在网站高峰期,应用服务器成为整个网站的瓶颈。

使用集群是网站解决高并发,海量数据问题的常用手段。通过负载均衡调度服务器,可将来自用户浏览器的访问请求分发到应用服务器集群中的任何一台服务器上。如果有更多用户,就是集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈


数据库读写分离

网站在使用缓存后,使绝大部分数据操作访问都可以不通过数据库就能完成,但是仍有一部分读操作(缓存访问不命中,缓存过期)和全部的写操作需要访问数据库,在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。

目前大部分的主流数据库都提供主从热备功能,通过配置两台数据主从关系,可以将一台数据库服务的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库的读写分离,从而改善数据库负载压力。


使用反向代理和CDN加速网站响应

随着网站业务不断发展,用户规模越来越大,由于中国复杂的网络环境,不同地区的用户访问网站时,速度差别也极大,为了提供更好的用户体验,留住用户,网站需要加速网站访问速度,主要手段有使用CDN的反向代理。

CDN的反向代理的基本原理都是缓存,区别在于CDN布署在网络提供商的机房;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理中缓存着用户请求的资源,就将其直接返回组用户。

使用CDN的反向代理的目的都是尽早的返回数据给用户,一方面加快用户的访问速度,另一方面也减轻后端服务器的负载压力。


使用分布式文件系统和分布式数据库系统

任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库经过读写分离后,从一台服务器拆分成两台服务器,但是随着网站业务的发展依然不能满足需求,这时需要使用分布式数据库,文件系统也是一样,需要使用分布式文件系统。

分布式数据库是网站数据库拆分的最后手段,只有在单表规模非常大的时候才用。不到不得已时,网站更常用的数据库拆分手段是业务分库,将不同业务的数据库部署在不同的物理服务器上。


使用NoSQL和搜索引擎

随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用一些非关系数据库技术如NoSQL和非数据库查询技术如搜索引擎。

NoSQL的搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具有更好的支持。应用服务器则通过一个统一的数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。


业务拆分

大型网站为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站业务分成不同的产品线,如大型购物网站就会将首页、商铺、订单、买家、卖家等拆分成不同的产品项,分归不同的业务团队负责。

具本技术上,也会根据产品线划分,将一个网站拆分成许多不同的应用,每个应用独立部署维护。应用之间可以通过一个超链接建立关系,也可以通过消息队列进行数据分发,当然最多还是通过访问同一个数据存储系统来构成一个关联的完整系统。


分布式服务

随着业务拆分越来越小,存储系统越来越庞大,应用系统的整体复杂度呈指数级增加,部署维护越来越困难。由于所有应用要和所有数据库系统连接,在数万台服务器规模的网站中这些连接数目是服务器规模的平方,导致数据库连接资源不足,拒绝服务。

既然每一个应用都要执行许多相同的业务操作,比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。由这些可复用的业务连接数据库,提供业务服务,而应用系统只需要管理用户界面,通过分布式服务调用共用业务服务完成具体业务操作。



网站架构设计误区

1.一味追随大公司的解决方案

2.为了技术而技术

3.企图用技术解决所有问题

大型网站架构模式


为了解决大型网站面临的高并发访问、海量数据处理、高可靠运行等一系列问题与挑战,大型互联网公司在实践中提出了许多解决方案,以实现网站高性能、高可用、易伸缩、可扩展、安全等各种技术架构目标。这些解决方案又被更多网站重复使用,从而逐渐形成大型网站架构模式。

网站架构模式

1.分层

分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对比较单一的职责,然后通过上层对下层的依赖和调用组成一个完整的系统。

在大型网站架构中也采用分层结构,将网站软件系统分为应用层、服务层、数据层.


2.分割

网站越大,功能越复杂,服务和数据处理的种类也越多,将这些不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,一方面有助于软件的开发和维护;另一方面,便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。

大型网站分割的粒度可能会很小。比如在应用层,将不同业务进行分割,例如将购物、论坛、搜索、广告分割成不同的应用,由独立的团队负责,部署在不同的服务器上;在同一个应用内部,如果规模庞大业务复杂,会继续进行分割,比如购物业务,可以进一步分割成机票酒店业务、3C 业务,小商品业务等更细小的粒度。而即使在这个粒度上,还是可以继续分割成首页、搜索列表、商品详情等模块,这些模块不管在逻辑上还是物理部署上,都可以是独立的。同样在服务层也可以根据需要将服务分割成合适的模块。

3.分布式

对于大型网站,分层和分割的一个主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。分布式意味着可以使用更多的计算机完成同样的功能,计算机越多,CPU、内存、存储资源也就越多,能够处理的并发访问和数据量就越大,进而能够为更多的用户提供服务。

常用的分布式方案

1.分布式应用和服务

2.分布式静态资源

3.分布式数据和存储

4.分布式计算

5.分布式配置

6.分布式文件系统

4.集群

使用分布式虽然已经将分层和分割后的模块独立部署,但是对于用户访问集中的模块(比如网站的首页),还需要将独立部署的服务器集群化,即多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。

因为服务器集群有更多服务器提供相同服务,因此可以提供更好的并发特性,当有更多用户访问的时候,只需要向集群中加入新的机器即可。同时因为一个应用由多台服务器提供,当某台服务器发生故障时,负载均衡设备或者系统的失效转移机制会将请求转发到集群中其他服务器上,使服务器故障不影响用户使用。所以在网站应用中,即使是访问量很小的分布式应用和服务,也至少要部署两台服务器构成一个小的集群,目的就是提高系统的可用性。

5.缓存

缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,现代CPU 越来越快的一个重要因素就是使用了更多的缓存,在复杂的软件设计中,缓存几乎无处不在。大型网站架构设计在很多方面都使用了缓存设计。

缓存技术:

内容分发网络(CDN) 反向代理

本地缓存 分布式缓存

使用前题:

1.数据访问热点不均衡

2.是数据在某个时间段内有效,不会很快过期

6.异步

大型网站架构中,系统解耦合的手段除了前面提到的分层、分割、分布等,还有一个重要手段是异步,业务之间的消息传递不是同步调用,而是将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行进行协作。

单服务器:

通过多线程共享内存队列的方式实现异步,处在业务操作前面的线程将输出写入到队列,后面的线程从队列中读取数据进行处理

分布式系统:

多个服务器集群通过分布式消息队列实现异步,分布式消息队列可以看作内存队列的分布式部署。

特性:

只要保持数据结构不变,彼此功能实现可以随意变化而不互相影响.

提高系统可用性

加快网站响应速度

消除并发访问高峰

7.冗余

网站需要 7X24 小时连续运行,但是服务器随时可能出现故障,特别是服务器规模比较大时,出现某台服务器宕机是必然事件。要想保证在服务器宕机的情况下网站依然可以继续服务,不丢失数据,就需要一定程度的服务器冗余运行,数据冗余备份,这样当某台服务器宕机时,可以将其上的服务和数据访问转移到其他机器上。

访问和负载很小的服务也必须部署至少两台服务器构成一个集群,其目的就是通过冗余实现服务高可用。数据库除了定期备份,存档保存,实现冷备份外,为了保证在线业务高可用,还需要对数据库进行主从分离,实时同步实现热备份。

为了抵御地震、海啸等不可抗力导致的网站完全瘫痪,某些大型网站会对整个数据中心进行备份,全球范围内部署灾备数据中心。网站程序和数据实时同步到多个灾备数据中心。

8.自动化

在无人值守的情况下网站可以正常运行,一切都可以自动化是网站的理想状态。目前大型网站的自动化架构设计主要集中在发布运维方面。

网站在运行过程中可能会遇到各种问题:服务器宕机、程序Bug、存储空间不足、突然爆发的访问高峰。网站需要对线上生产环境进行自动化监控,对服务器进行心跳检测,并监控其各项性能指标和应用程序的关键数据指标。如果发现异常、超出预设的阈值,就进行自动化报警,向相关人员发送报警信息,警告故障可能会发生。在检测到故障发生后,系统会进行自动化失效转移,将失效的服务器从集群中隔离出去,不再处理系统中的应用请求。待故障消除后,系统进行自动化失效恢复,重新启动服务,同步数据保证数据的一致性。在网站遇到访问高峰,超出网站最大处理能力时,为了保证整个网站的安全可用,还会进行自动化降级,通过拒绝部分请求及关闭部分不重要的服务将系统负载降至一个安全的水平,必要时,还需要自动化分配资源,将空闲资源分配给重要的服务,扩大其部署规模。

9.安全

互联网的开放特性使得从诞生起就面对巨大的安全挑战,网站在安全架构方面也积累了许多模式:通过密码和手机校验码进行身份认证;登录、交易等操作需要对网络通信进行加密,网站服务器上存储的敏感数据如用户信息等也进行加密处理;为了防止机器人程序滥用网络资源攻击网站,网站使用验证码进行识别;对于常见的用于攻击网站的XSS攻击、SQL注入、进行编码转换等相应处理;对于垃圾信息、敏感进行过滤;对交易转账等重要操作根据交易模式和交易信息进行风险控制


















本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理高并发、大数据存储的网站技术架构 的相关文章

  • 将 RGB 颜色值转换为十六进制字符串

    在我的 Java 应用程序中 我能够得到Color of a JButton就红 绿 蓝而言 我将这些值存储在三个中ints 如何将这些 RGB 值转换为String包含等效的十六进制表示形式 例如 0033fA 您可以使用 String
  • 构造函数重载相同的参数

    假设我的类有 2 个字段 x 和 y 类型为double 是否可以定义 2 个构造函数 以便 constructor1 将创建对象并设置其x构造函数中参数的属性告诉和y默认值和构造函数2反之亦然 public class Test priv
  • HHH000513:升级到 Hibernate 6 后无法为实体创建 ReflectionOptimizer

    最近从 Hibernate 5 升级到 6 我在调试级别看到以下错误 12 36 11 892 main DEBUG org hibernate bytecode internal bytebuddy BytecodeProviderImp
  • 如何在同一台机器上运行 2 个(或更多)Wildfly 实例?

    我想通过运行 2 个独立的 Wildfly 实例来模拟 2 个服务器 当您不想在同一个实例上部署所有 WAR 然后只能将它们关闭并一起启动时 这非常有用 我正在将 Eclipse 与 JBoss 插件一起使用 在服务器视图中 我希望有 2
  • 光学标记阅读器的开源库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个用于光学标记读取 OMR 的开源库 有这样的库吗 我想在我的 java 应用程序中使用这个库 zxing 可能对你有用 http
  • Swagger 3.0.0:如果没有 SwaggerConfig 和 @Profile,则无法在生产中禁用

    我正在从 2 x 升级到 SpringFox Swagger 3 0 0 它引入了 Spring Boot 启动器springfox boot starter消除了对基于 2 x 的需要的依赖性SwaggerConfig NO LONGER
  • Java 的 System.arraycopy() 对于小数组有效吗?

    是Java的System arraycopy 对于小数组来说是高效的 或者它是本机方法这一事实是否使其可能比简单的循环和函数调用效率低得多 本机方法是否会因跨越某种 Java 系统桥梁而产生额外的性能开销 稍微扩展一下 Sid 所写的内容
  • 在 Eclipse 中跨文件搜索注释掉的代码

    有没有一种快速方法可以在 Eclipse 中查找 Java 文件中所有注释掉的代码 也许是搜索中的任何选项 或者任何可以执行此操作的附加组件 它应该只能找到被注释掉的代码 而不是普通的注释 在 Eclipse 中 我只是在打开正则表达式复选
  • 无法让远程 EJB 与 Wildfly 上的 EJB 客户端 API 配合使用

    我目前正在努力让远程 EJB 调用在 wildfly 8 x 和 9 x 上工作 详细来说 它是关于使用 EJB 客户端 API 方法从独立客户端应用程序 而不是从另一个应用程序服务器 进行远程调用 远程命名方法适用于我 但不适用于我的场景
  • 为什么Java HashMap的最大容量是1<<30而不是1<<31?

    Why is the maximum capacity of a Java HashMap 1 lt lt 30 and not 1 lt lt 31 even though the max value of an int is 231 1
  • JPA 为每个项目选择最新实例

    假设我有一个会议实体 每次会议都有一个与会者和一个会议日期 在我的会议表中 我可能为每个与会者举行多个会议 每个会议都有不同的日期 我需要一个 JPA 查询 该查询将为所有与会者仅选择最新的会议 例如 如果我的桌子看起来像这样 Meetin
  • splitByWholeSeparatorPreserveAllTokens 和 split 之间的区别

    有什么区别StringUtils splitByWholeSeparatorPreserveAllTokens and String split With splitByWholeSeparatorPreserveAllTokens 我们可
  • Ubuntu 的打包 - Web 应用程序

    Web 应用程序没有与 C 或类似文件不同的 make 文件 但是 它需要放置在特定的目录中 例如 var www 我是 Linux 打包新手 所以我的问题是 如何将我的应用程序打包到 deb 中 以便在安装时将其放入 etc myprog
  • 创建一个 int 类型的随机数组。爪哇

    我需要创建一个随机的 int 数组 并按我自己的类对其进行排序 这是我制作数组的地方 public class MyProgram9 public static void main String args int list new int
  • 在Java中使用==而不是equals来比较不可变对象可以吗

    考虑调用静态工厂方法 valueOf 的两个 Integer 类型的引用 如下所示 Integer a Integer valueOf 10 Integer b Integer valueOf 10 考虑到Integer是不可变的 使用 而
  • 使用 Mockitos 传递参数化输入

    我正在使用 Mockito 进行单元测试 我想知道是否可以使用 Junit 测试中的方式发送参数化输入参数 e g InjectMocks MockClass mockClass new MockClass Test public void
  • 如何强制初始化 Hibernate JPA 代理以在 JSON 调用中使用它

    我有一个 Spring 3 JPA 2 0 应用程序 在我的 Controller我需要一个初始化的对象 但我有代理 我需要能够以编程方式初始化它 我需要类似的功能org hibernate Hibernate initialize Obj
  • Java 8 Stream - 为什么过滤器方法不执行? [复制]

    这个问题在这里已经有答案了 我正在学习使用java流进行过滤 但是过滤后的流没有打印任何内容 我认为过滤器方法没有被执行 我的过滤代码如下 Stream of d2 a2 b1 b3 c filter s gt s startsWith b
  • JTable中动态加载大量数据

    这是我的问题 我目前有一个 JTable 其中包含 5 000 到超过 200 000 行 你知道我要说什么了 数据已经加载到内存中了 这不是问题 但是如何 我可以创建一个高效的 JTable 以便它只加载以下行 是可见的 并且任何事件仅作
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文

随机推荐

  • 如何从Windows切换到Linux

    作者 栈栈 链接 CU技术社区 微软已经马上准备在2020年1月份终止对Windows 7的支持 这意味着您将不再获得bug修复或安全更新 如果您是Windows 7的最终支持者之一 并且不想陷入一个不安全的系统 则可以选择 升级到Wind
  • Verilog功能模块——Uart收发

    摘要 本文分享了一种通用的Uart收发模块 可实现Uart协议所支持的任意波特率 任意位宽数据 5 8 任意校验位 无校验 奇校验 偶校验 1校验 0校验 任意停止位 1 1 5 2 的数据传输 此模块需要搭配FIFO使用 以消除发送端和接
  • 最新AI创作系统ChatGPT网站源码+详细图文搭建教程/支持GPT-4/支持AI绘画/Prompt应用/访客体验功能

    一 SparkAI创作系统 如何搭建部署AI创作ChatGPT系统呢 小编这里写一个详细图文教程吧 SparkAi使用Nestjs和Vue3框架技术 持续集成AI能力到AIGC系统 1 1 程序核心功能 程序已支持ChatGPT3 5 4
  • Python:安装Flask web框架hello world示例

    安装easy install pip install distribute 安装pip easy install pip 安装 virtualenv pip install virtualenv 激活Flask pip install Fl
  • 搭建私人图床结合内网穿透实现公网访问,让您的摄影作品连接世界

    文章目录 1 树洞外链网站搭建 1 1 下载安装树洞外链 1 2 树洞外链网页测试 1 3 cpolar的安装和注册 2 本地网页发布 2 1 Cpolar临时数据隧道 2 2 Cpolar稳定隧道 云端设置 2 3 Cpolar稳定隧道
  • Select、Poll、Epoll的使用和区别,多种IO的区别

    目录 一 四种IO分类 二 I O多路复用select 三 I O多路复用Poll 四 I O多路复用Epoll 五 三种多路复用的区别总结 1 支持一个进程所能打开的最大连接数 2 fd剧增后带来的IO效率问题 3 消息传递方式 4 索引
  • 一、PyTorch基础:Tensor基础操作

    1 1Tensor Tensor 又名张量 读者可能对这个名词似曾相识 因它不仅在PyTorch中出现过 它也是Theano TensorFlow Torch和MxNet中重要的数据结构 关于张量的本质不乏深度的剖析 但从工程角度来讲 可简
  • SQL注入-报错注入

    页面没有显示位 但有数据库的报错信息时 可使用报错注入 报错注入是最常用的注入方式 也是使用起来最方便 我觉得 的一种注入方式 updatexml 1 3 第二个参数包含特殊字符时 数据库会报错 并将第二个参数的内容显示在报错内容中 返回结
  • 机器学习——特征工程(3分钟的超详细介绍)

    目录 1 什么是特征工程 2 数据预处理和特征处理 2 1 数据预处理 2 2 特征处理 3 特征降维 3 0 什么是特征降维 3 1 特征选择 3 2 线性降维 3 2 1 主成分分析法 PCA 3 2 2 线性判别分析法 LDA 1 什
  • 使用ESCAPE处理模糊查询%的问题

    前言 在模糊查询时 如果要查询的内容中有 比例 小明 如果不做处理 那么就会查询到所以的小明相关的数据 不能只查询到小明 的数据 1 创建工具类 工具类 public class StringUtils private static fin
  • QT关于QGIS3.26的二次开发

    目录 1 使用平台以及版本 2 显示一张tif格式的图片 3 代码的具体分析 4 一点基础知识 5 其他代码 1 使用平台以及版本 VS 2022 编译器MSVC2019 QT版本 5 15 2 系统 win10 QGIS版本 3 26 9
  • Raspberry系统管理 —— 安装和配置OpenVINO

    文章目录 什么是OpenVINO 下载测试用例 加速自己的模型 什么是OpenVINO OpenVINO Open Visual Inference and Neural Network Optimization 是一个用于视觉推理和神经网
  • 【计算机视觉

    文章目录 一 2D open vocabulary object detection的发展和研究现状 二 基于大规模外部图像数据集 2 1 OVR CNN Open Vocabulary Object Detection Using Cap
  • PyQt学习笔记-信号与槽

    PyQt学习笔记 信号与槽 一 基本概念 二 编辑信号与槽 三 自定义槽 四 将自定义的槽函数连接到信号 五 多窗口设计 1 设置启动窗口 2 窗口之间的关联 一 基本概念 信号与槽是Qt的核心机制 也是PyQt5编程时对象之间通信的基础
  • JDBC操作MySQL5日期类型字段的问题解决方法

    JDBC操作MySQL5日期类型字段的问题解决方法 由于日期数据的特殊性和多样性 以及不同的数据库 编程语言对日期的定义和处理方式差别 导致了日期处理的复杂性 和多样性 流行的Hibernate iBatis等持久化框架从中解决了各种Jav
  • Flutter之数据库的使用(sqflite_common_ffi)

    sqflite是Flutter的SQLite插件 支持的平台有 iOS Android MacOS 桌面端可以使用sqflite common ffi 本篇文章以sqflite common ffi为主 sqflite common ffi
  • m2增长率曲线_中国m2历年数据曲线图_中国m2历年数据

    2012年5月经济数据 搜狐财经 580x400 39KB JPEG 李彦宏 有图有真相 移动互联网时代真的结束了 693x390 130KB PNG 图1 全国主要城市分用途地价环比增长率曲线图 540x248 36KB JPEG 美元强
  • 八大排序算法-基数排序

    基数排序 radix sort 定义 属于 分配式排序 distribution sort 又称 桶子法 bucket sort 或bin sort 顾名思义 它是透过键值的部份资讯 将要排序的元素分配至某些 桶 中 藉以达到排序的作用 分
  • JSP的初次使用

    什么是jsp JSP这三个字母是Java Server Pages的缩写 见名知意java的服务器页面 来段代码 h1 这是一个简单的JSP页面 h1 p style font size 36 color blue 1到100的连续 p
  • 处理高并发、大数据存储的网站技术架构

    本文转载自 https zhuanlan zhihu com p 24669514 大型网站技术架构剖析 高并发 大流量 40亿 PV page view 3 5亿 IP 高可用 高可用MySQL 7 24小时不间断运行 海量数据 用户分布