[Redis][前置知识][下][高并发架构演进]详细讲解

目录

  • 1.单机架构
  • 2.应⽤数据分离架构
  • 3.应⽤服务集群架构
  • 4.读写分离/主从分离架构
  • 5.引⼊缓存⸺冷热分离架构
  • 6.垂直分库/分表
  • 7.业务拆分⸺微服务
  • 8.总结


1.单机架构

  • 只有一台服务器,这个服务器负责所有的工作
    • 大部分公司的产品,都是这种单机架构
      请添加图片描述

2.应⽤数据分离架构

  • 当业务进一步增长时,用户量和数据量都会水涨船高,一台主机难以应付的时候,就需要引入更多的主机和更多的硬件资源
    • 一旦引入多台主机,该系统就可以称之为"分布式系统"了
    • 实际上,引入分布式,也是"万不得已"的举措,因为此时系统的复杂度会大大提高
  • 特点:将数据库服务独⽴部署在同⼀个数据中⼼的其他服务器上,应⽤服务通过⽹络访问数据
    • 应用服务器:可能包含很多业务逻辑,比较吃CPU和内存
    • 数据库服务器:需要更大的硬盘控件,更快的数据访问速度
    • 综合以上特点,可以达到较高的性价比
      请添加图片描述

3.应⽤服务集群架构

  • 理论上来说,有两种方案

    • 垂直扩展/纵向扩展Scale Up:通过购买性能更优、价格更⾼的应⽤服务器来应对更多的流量
      • 优势:在于完全不需要对系统软件做任何的调整
      • 劣势:硬件性能和价格的增⻓关系是⾮线性的,意味着选择性能2倍的硬件可能需要花费超过4倍的价格,其次硬件性能提升是有明显上限的
    • ⽔平扩展/横向扩展Scale Out:通过调整软件架构,增加应⽤层硬件,将⽤⼾流量分担到不同的应⽤层服务器上,来提升系统的承载能⼒
      • 优势:在于成本相对较低,并且提升的上限空间也很⼤
      • 劣势:带给系统更多的复杂性,需要技术团队有更丰富的经验
    • 综上,实际上基本用的都是水平扩展的方案
  • 为了解决水平扩展这个方案,需要引入一个新的组件:负载均衡

    • 为了解决⽤⼾流量向哪台应⽤服务器分发的问题,需要⼀个专⻔的系统组件做流量分发
      • 用户的请求,先到达负载均衡器/网关服务器(单独的服务器)
      • 负载均衡器对于请求的承担能力,要远超过应用服务器
      • 类似于"多线程"
    • 如果请求量大到负载均衡器也扛不住了,怎么办?
      • 引入更多的负载均衡器 --> 引入更多的机房
    • 实际中负载均衡不仅仅指的是⼯作在应⽤层的,甚⾄可能是其他的⽹络层之中
      请添加图片描述
  • 流量调度算法有很多种,简单介绍⼏种较为常⻅的:

    • Round-Robin 轮询算法:即⾮常公平地将请求依次分给不同的应⽤服务器
    • Weight-Round-Robin 轮询算法:为不同的服务器(⽐如性能不同)赋予不同的权重, 能者多劳
    • ⼀致哈希散列算法:通过计算⽤⼾的特征值(⽐如IP地址)得到哈希值,根据哈希结果做分发
      • 优点:确保来⾃相同⽤⼾的请求总是被分给指定的服务器,也就是平时遇到的专项客⼾经理服务

4.读写分离/主从分离架构

  • 到目前为止介绍的架构⾥,⽆论扩展多少台服务器,这些请求最终都会从数据库读写数据,到⼀定程度之后,数据的压⼒成为系统承载能⼒的瓶颈点
  • 可以像扩展应⽤服务器⼀样扩展数据库服务器么?
    • 肯定不行,因为数据库服务有其特殊性
      • 如果将数据分散到各台服务器之后,数据的⼀致性将⽆法得到保障
      • 数据的⼀致性:针对同⼀个系统,⽆论何时何地,都应该看到⼀个始终维持统⼀的数据
  • 解决办法:保留⼀个主要的数据库作为写⼊数据库,其他的数据库作为从属数据库
    • 从库的所有数据全部来⾃主库的数据,经过同步后,从库可以维护着与主库⼀致的数据
      • 主服务器一般是一个,从服务器可以有多个
      • 同时,从服务器可以通过负载均衡的方式,让应用服务器进行访问
    • 为了分担数据库的压⼒,可以将写数据请求全部交给主库处理,但读请求分散到各个从库中
      • 由于⼤部分的系统中,读写请求都是不成⽐例的(读的频率比写高),所以只要将读请求由各个从库分担之后,数据库的压⼒就没有那么⼤了
      • 当然这个过程不是⽆代价的,主库到从库的数据同步其实是有时间成本的,这个问题暂时不做进⼀步探讨
    • 应⽤中需要对读写请求做分离处理,所以可以利⽤⼀些数据库中间件,将请求分离的职责托管出去
      请添加图片描述

5.引⼊缓存⸺冷热分离架构

  • 问题:数据库有个天然的问题,响应速度比较慢
  • 分析:随着访问量继续增加,发现业务中⼀些数据的读取频率远⼤于其他数据的读取频率
    • 把这部分数据称为热点数据,与之相对应的是冷数据
    • 针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存
      • 缓存热⻔商品信息或热⻔商品的html⻚⾯等
    • 通过缓存能把绝⼤多数请求在读写数据库前拦截掉,⼤⼤降低数据库压⼒
    • 其中涉及的技术包括:使⽤mem cached作为本地缓存,使⽤Redis作为分布式缓存,还会涉及缓存⼀致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题
  • 解决方案:二八原则
    • 把数据区分"冷热",热点数据放到缓存中
    • 缓存的访问速度往往比数据库要快多了
      请添加图片描述

6.垂直分库/分表

  • 引入分布式系统,不光要能够去应对更高的请求量(并发量),同时也要能应对更大的数据量
  • 需求提出:随着业务的数据量增⼤,⼤量的数据存储在同⼀个库中已经显得有些⼒不从⼼了,所以可以按照业务,将数据分别存储 --> 一台主机存不下,多台主机一起来存储
    • 如果某个表也特别大,大到一台主机存不下,也可以针对表进行拆分
    • 例如:针对评论数据,可按照商品ID进⾏hash,路由到对应的表中存储;针对⽀付记录,可按照⼩时创建表,每个⼩时表继续拆分为⼩表,使⽤⽤⼾ID或记录编号来路由数据
  • 只要实时操作的表数据量⾜够⼩,请求能够⾜够均匀的分发到多台服务器上的⼩表,那数据库就能通过⽔平扩展的⽅式来提⾼性能
    请添加图片描述

7.业务拆分⸺微服务

  • 之前的所有应用服务器,一个服务器程序里面做了很多的业务,这就可能导致这一个服务器的代码变得越来越复杂

    • 为了更方便代码的维护,可以将一个复杂的服务器,拆分成更多的,功能更单一,但是更小的服务器 --> 微服务
  • 注意:微服务本质上是解决了"人"的问题

    • 一般只有大厂才会涉及到"人的问题"
  • 随着⼈员增加,业务发展,将业务分给不同的开发团队去维护,每个团队独⽴实现⾃⼰的微服务,然后互相之间对数据的直接访问进⾏隔离

    • 可以利⽤Gateway、消息总线等技术,实现相互之间的调⽤关联
    • 甚⾄可以把⼀些类似⽤⼾管理、安全管理、数据采集等业务提成公共服务
      请添加图片描述
  • 引入微服务,解决了人的问题,付出的代价呢?

    • 系统的性能下降,拆出来更多的服务,多个功能之间要更依赖网络通信
    • 系统复杂程度提高,可用性受到影响,出现问题的概率更大了
  • 微服务的优势

    • 解决了人的问题
    • 使用微服务,可以更方便于功能的服用
    • 可以给不同的服务进行不同机器配置的部署

8.总结

  • 单机架构:应用程序 + 数据库服务器
  • 数据库和应用分离:应用程序和数据库服务器,分别放到不同的机器上部署了
  • 引入负载均衡,应用服务器 --> 集群:通过负载均衡器,把请求比较均匀的分发给集群中的每个应用服务器
  • 引入读写分离,数据库主从结构:一个数据库节点作为主节点,其他N个数据库节点作为从节点
    • 主节点负责写数据,从节点负责读数据
    • 主节点需要把修改过的数据同步给从节点
  • 引入缓存,冷热数据分离:进一步提升了服务器针对请求的处理能力 --> 二八原则
    • Redis在一个分布式系统中,通常就扮演着缓存这样的角色
    • 引入的问题:数据库和缓存的数据一致性问题
  • 引入微服务,从业务上进一步拆分应用服务器:从业务功能的角度,把应用服务器,拆分成更多的功能更单一、更简单、更小的服务器
  • 综上所谓的分布式系统,就是想办法引入更多的硬件资源

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

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

相关文章

自己建网站怎么建

自己建立一个网站可能听起来有点复杂,但实际上,有很多简单且免费的方法可以实现。下面将介绍一些基本步骤,帮助你开始自己建立一个网站。 首先,你需要明确你的网站目的是什么。是个人博客、商业网站,还是其他类型的网…

frp内网穿透功能使用教程

frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。 文档地…

深度学习----------------------文本预处理

目录 文本预处理读取数据集词源化词表该部分总代码该部分总代码 整合所有功能该部分总代码 文本预处理 文本预处理:把文本当作一个时序序列 将解析文本的常见预处理步骤。 这些步骤通常包括: ①将文本作为字符串加载到内存中。 ②将字符串拆分为词元&…

【数据结构篇】~链表算法题3(环形链表)

链表算法题3(环形链表) 环形链表的证明1. 环形链表I​1) 思路2)代码实现 2. 环形链表II​1) 思路11) 思路22)代码实现 环形链表的证明 1. 环形链表I​ https://leetcode.cn/problems/linked-list-cycle/description/ 1) 思路 判断…

Nginx搭建直播服务器,并用rtmp,http-flv,hls三种模式拉流观看直播的流程

一、首先搭建直播服务器 环境widows,并且已经集成了 :nginx-http-flv-module模块 nginx.conf配置如下: worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #error…

计算机人工智能前沿进展-大语言模型方向-2024-09-15

计算机人工智能前沿进展-大语言模型方向-2024-09-15 1. Towards the holistic design of alloys with large language models Z Pei, J Yin, J Neugebauer, A Jain - Nature Reviews Materials, 2024 利用大型语言模型实现合金的全面设计 摘要 文章讨论了大型语言模型在材料…

nginx服务器安装和部署代理

文章目录 Linux下面安装nginx nginx下载官网: [nginx: download](https://nginx.org/en/download.html) 使用yum命令安装gcc环境 yum install -y wget gcc-c pcre-devel zlib-devel openssl-devel//安装多个环境 wget gcc pcre-devel 支持正则表达式 zlib-devel提供了压缩和…

CleanClip vs 传统剪贴板:究竟谁更胜一筹?

在日常工作和生活中,复制粘贴可以说是我们使用最频繁的操作之一。传统的剪贴板功能虽然简单易用,但在功能性和效率上还有很大的提升空间。今天,我们就来比较一下新兴的剪贴板增强工具CleanClip与传统剪贴板,看看到底谁更胜一筹。 1. 剪贴历史管理 传统剪贴板只能存储最后一次…

Java项目实战II基于Java+Spring Boot+MySQL的图书管理系统的设计与实现 (源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在信息爆炸…

【图虫创意-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

用来用去还是用回了ueditor-Vue富文本编辑器二次扩展

用来用去还是用回了ueditor-Vue富文本编辑器二次扩展。我们使用用过UEditor、TinyMCE、CKEditor、wangEditor、Tiptap、Quill项目经历过多次富文本的编辑器的选型使用,发现现在新的富文本编辑总感觉还是没达到我们的要求,果然改回了ueditor。 UEditor 是…

PMP与CMMI:两种管理方法的对比

PMP与CMMI:两种管理方法的对比 PMP:专注于项目管理CMMI:组织过程改进的框架总结:互补而非替代 在现代企业管理中,项目管理和组织能力成熟度模型集成(CMMI)是两个经常被提及的概念。虽然它们都是…

java线程池编程示例

程序功能 这段代码展示了如何使用 Java 线程池 来并发执行多个任务。通过创建一个固定大小为 3 的线程池,程序提交了 5 个任务,并让线程池中的线程并发处理这些任务。每个任务模拟了一个耗时操作,最后程序等待所有任务完成后关闭线程池。 …

『功能项目』按G键持续显示对话内容【61】

本章项目成果展示 我们打开上一篇60靠近Npc显示可对话标识的项目, 本章要做的事情是当靠近Npc按G键显示内容后,再按G键实现两个人的对话显示功能 首先将以下资源图片放进Art文件夹中并设置为精灵模式 在桌面上创建一个文本 讲一下对话内容复制到文本中 …

day22JS-npm中的部分插件使用方法

1. 静态资源目录 静态资源目录就是访问服务器的某些路劲时候,服务器可以吐出一个写好的指定页面。 实现思路: 1、先判断要找的路径是否是文件,如果是文件,就加载发给对方。 2、如果是文件夹,找到这个文件夹所在路径中…

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目, 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本:DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…

Tesseract:在线高性能表结构变更方法(VLDB23)

文章目录 背景表结构变更的必要性现有技术的不足Tesseract(超立方体):一种在MVCC系统中支持非阻塞、事务性的表结构变更的方法动机 基础的DDaM(被作为数据修改的数据定义)对DDL操作的分类的两个维度表结构版本&#xf…

探索未来游戏边界:AI驱动的开放世界RPG引擎与UGC平台

在游戏产业的浩瀚星空中,一项革命性的技术正悄然升起,它不仅重塑了游戏开发的传统模式,更将玩家的创造力推向了前所未有的高度。今天,让我们一同走进这个由AI驱动的开放世界RPG游戏引擎与UGC(用户生成内容)平台的奇幻世界,探索其背后的无限可能。 产品定位:AI赋能,重…

信息安全工程师(8)网络新安全目标与功能

前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要,它们不仅反映了网络安全领域的最新发展趋势,也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对: 目标:建立多层次、全方位的网络安全防…

《沈阳体育学院学报》

《沈阳体育学院学报》创刊于1982年,是由沈阳体育学院主办,面向国内外公开发行的体育类学术期刊;国际标准刊号为ISSN 1004-0560,国内刊号为CN 21-1081/G8;双月刊,单月中旬出版。 《沈阳体育学院学报》是中文…