系统设计-高性能

news2024/11/26 6:15:18

一、CDN

1、什么是CDN

  • CDN 就是将静态资源分发到多个不同的地方以实现就近访问,进而加快静态资源的访问速度,减轻服务器以及带宽的负担.(可看作是一层特殊缓存服务,用来处理静态资源的请求)

2、CDN工作原理

  • 静态资源是如何被缓存到 CDN 节点
    • 可通过预热的方式将源站的资源同步到 CDN 的节点中。用户首次请求资源可直接从 CDN 节点中取,无需回源。可降低源站压力,提升用户体验。若不预热,访问的资源可能不在 CDN 节点中,这时CDN 节点将请求源站获取资,即为回源。

      • 回源:当 CDN 节点上没有用户请求的资源或该资源的缓存已经过期时,CDN 节点需要从原始服务器获取最新的资源内容,这个过程就是回源。当用户请求发生回源的话,会导致该请求的响应速度比未使用 CDN 还慢,因为相比于未使用 CDN 还多了一层 CDN 的调用流程。
      • 预热:预热是指在 CDN 上提前将内容缓存到 CDN 节点上。这样当用户在请求这些资源时,能够快速地从最近的 CDN 节点获取到而不需要回源,进而减少了对源站的访问压力,提高了访问速度。
    • 若资源更新,可对其刷新 ,删除 CDN 节点上缓存的旧资源,并强制 CDN 节点回源站获取最新资源。
  • 如何找到最合适的 CDN 节点
    • GSLB (Global Server Load Balance,全局负载均衡)是 CDN 的大脑,负责多个 CDN 节点之间相互协作,最常用的是基于 DNS 的 GSLB。CDN 会通过 GSLB 找到最合适的 CDN 节点

      • 浏览器向 DNS 服务器发送域名请求;

      • DNS 服务器向根据 CNAME( Canonical Name ) 别名记录向 GSLB 发送请求;
      • GSLB 返回性能最好(通常距离请求地址最近)的 CDN 节点(边缘服务器,真正缓存内容的地方)的地址给浏览器;
      • 浏览器直接访问指定的 CDN 节点。
    • GSLB 会根据请求的 IP 地址、CDN 节点状态(比如负载情况、性能、响应时间、带宽)等指标来综合判断具体返回哪一个 CDN 节点的地址。

  • 如何防止静态资源被盗用
    • 设置 Referer 防盗链,具体来说就是根据 HTTP 请求的头信息里面的 Referer 字段对请求进行限制。我们可以通过 Referer 字段获取到当前请求页面的来源页面的网站地址,这样我们就能确定请求是否来自合法的网站。CDN 服务提供商几乎都提供了这种比较基础的防盗链机制。

    • 时间戳防盗链机制

二、负载均衡

1、什么是负载均衡

  • 指的是将用户请求分摊到不同的服务器上处理,以提高系统整体的并发处理能力以及可靠性。负载均衡服务可以有由专门的软件或者硬件来完成,硬件的性能更好,软件的价格更便宜.
  • 负载均衡是一种比较常用且实施起来较为简单的提高系统并发能力和可靠性的手段

2、负载均衡的分类

  • 服务端负载均衡
    • 主要应用在 系统外部请求 和 网关层 之间,可以使用 软件(Nginx) 或者 硬件(F5) 实现。
      • 硬件负载均衡的优势是性能很强且稳定,缺点就是太贵
      • 软件负载均衡
        • 四层负载均衡(LVS):工作在 OSI 模型第四层,也就是传输层,主要协议是 TCP/UDP,负载均衡器在这一层能够看到数据包里的源端口地址以及目的端口地址,会基于这些信息通过一定的负载均衡算法将数据包转发到后端真实服务器。也就是说,四层负载均衡的核心就是 IP+端口层面的负载均衡,不涉及具体的报文内容。
        • 七层负载均衡(Nginx):工作在 OSI 模型第七层,也就是应用层,主要协议是 HTTP 。这一层的负载均衡比四层负载均衡路由网络请求的方式更加复杂,它会读取报文的数据部分(如HTTP 部分的报文),然后根据读取到的数据内容(如 URL、Cookie)做出负载均衡决策。七层负载均衡器的核心是报文内容层面的负载均衡,执行第七层负载均衡的设备通常被称为 反向代理服务器
        • 七层负载均衡比四层负载均衡会消耗更多的性能,不过,也相对更加灵活,能够更加智能地路由网络请求,如可根据请求的内容进行优化如缓存、压缩、加密。

  • 客户端负载均衡
    • 客户端负载均衡 主要应用于系统内部的不同的服务之间,可以使用现成的负载均衡组件来实现。在客户端负载均衡中,客户端会自己维护一份服务器的地址列表,发送请求之前,客户端会根据对应的负载均衡算法来选择具体某一台服务器处理请求。客户端负载均衡器和服务运行在同一个进程或者说 Java 程序里,不存在额外的网络开销。不过,客户端负载均衡的实现会受到编程语言的限制,比如说 Spring Cloud Load Balancer 就只能用于 Java 语言。Java 领域主流的微服务框架 Dubbo、Spring Cloud 等都内置了开箱即用的客户端负载均衡实现。Dubbo 属于是默认自带了负载均衡功能,Spring Cloud 是通过组件的形式实现的负载均衡,属于可选项,比较常用的是 Spring Cloud Load Balancer(官方,推荐) 和 Ribbon(Netflix,已被弃用)。

3、负载均衡的算法

  • 随机法
  • 轮训法:挨个轮询服务器处理,也可以设置权重
  • 两次随机法:在随机法的基础上多增加了一次随机,多选出一个服务器。随后再根据两台服务器的负载等情况,从其中选择出一个最合适的服务器。
  • 哈希法:将请求参数信息通过哈希函数转换成一个哈希值,然后根据哈希值来决定
  • 最小连接法:当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。相同连接的情况下,可以进行加权随机。最少连接数基于一个服务器连接数越多,负载就越高这一理想假设。然而, 实际情况是连接数并不能代表服务器的实际负载,有些连接耗费系统资源更多,有些连接不怎么耗费系统资源。
  • 最少活跃法:以活动连接数为标准,活动连接数可以理解为当前正在处理的请求数。活跃数越低,说明处理能力越强,这样就可以使处理能力强的服务器处理更多请求。相同活跃数的情况下,可以进行加权随机。
  • 最快响应时间法:以响应时间为标准来选择具体是哪一台服务器处理。客户端会维持每个服务器的响应时间,每次请求挑选响应时间最短的。相同响应时间的情况下,可以进行加权随机。这种算法可以使得请求被更快处理,但可能会造成流量过于集中于高性能服务器的问题。

4、七层负载均衡

  • DNS解析:DNS 解析实现负载均衡的原理:在 DNS 服务器中为同一个主机记录配置多个 IP 地址,这些 IP 地址对应不同的服务器。当用户请求域名的时候,DNS 服务器采用轮询算法返回 IP 地址,这样就实现了轮询版负载均衡。(可支持IP地址权重配置)
  • 反向代理:客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 地址。反向代理“代理”的是目标服务器,这一个过程对于客户端而言是透明的。Nginx 就是最常用的反向代理服务器,它可以将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上。

5、客户端负载均衡怎么做

  • 可使用现成的负载均衡组件来实现
    • Netflix Ribbon 
    • Spring Cloud Load Balancer:随机/轮训
    • dubbo:加权随机、加权轮训、最少活跃数、一致性hash

三、数据库优化

1、读写分离

  • 读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 能够小幅提升写性能,大幅提升读性能。
  • 一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。主库和从库之间会进行数据同步,以保证从库中数据的准确性。这样的架构实现起来比较简单,并且也符合系统的写少读多的特点。

  • 实现

    • 部署多台数据库,选择其中的一台作为主数据库,其他的一台或者多台作为从数据库。
    • 保证主数据库和从数据库之间数据实时同步,这个过程也就是我们常说的主从复制
    • 系统将写请求交给主数据库处理,读请求交给从数据库处理。
  • 具体实现
    • 代理方式:在应用和数据中间加了一个代理层。应用程序所有的数据请求都交给代理层处理,代理层负责分离读写请求,将它们路由到对应的数据库中。提供类似功能的中间件有 MySQL Router(官方, MySQL Proxy 的替代方案)、Atlas(基于 MySQL Proxy)、MaxScaleMyCat
    • 组件方式:引入第三方组件,如sharding-jdbc
  • 主从复制原理:binlog记录mysql数据库中数据的所有变化(DDL和DML语句)
    • 主库将数据库中数据的变化写入到 binlog
    • 从库连接主库,从库会创建一个 I/O 线程向主库请求更新的 binlog
    • 主库会创建一个 binlog dump 线程来发送 binlog ,从库中的 I/O 线程负责接收
    • 从库的 I/O 线程将接收的 binlog 写入到 relay log 中
    • 从库的 SQL 线程读取 relay log 同步数据到本地(也就是再执行一遍 SQL )

  • 避免主从延迟

    • 强制将读请求路由到主库处理

    • 延迟读取

  • 延迟原因:

    • 从库 I/O 线程接收 binlog 的速度跟不上主库写入 binlog 的速度,导致从库 relay log 的数据滞后于主库 binlog 的数据;
    • 从库 SQL 线程执行 relay log 的速度跟不上从库 I/O 线程接收 binlog 的速度,导致从库的数据滞后于从库 relay log 的数据。
      • 从库机器性能比主库差
      • 从库处理请求过多
      • 从库太多
      • 网络延迟

2、分库分表

  • 分库
    • 垂直分库:单一数据库按照业务进行划分,不同的业务使用不同的数据库,进而将一个数据库的压力分担到多个数据库。
    • 水平分库:把同一个表按一定规则拆分到不同的数据库中,每个库可以位于不同的服务器上,这样就实现了水平扩展,解决了单表的存储和性能瓶颈的问题。
  • 分表
    • 垂直分表:对数据表列的拆分,把一张列比较多的表拆分为多张表。
    • 水平分表:对数据表行的拆分,把一张行比较多的表拆分为多张表,可以解决单一表数据量过大的问题。
  • 什么时候需要分库分表
    • 单表的数据达到千万级别以上,数据库读写速度比较缓慢
    • 数据库中的数据占用的空间越来越大,备份时间越来越长。
    • 应用的并发量太大(应该优先考虑其他性能优化方法,而非分库分表)。
  • 缺点:成本高,非必要尽量不采用

3、数据冷热分离

  • 数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。

  • 冷数据和热数据:热数据是指经常被访问和修改且需要快速访问的数据,冷数据是指不经常访问,对当前项目价值较低,但需要长期保存的数据

    • 时间维度区分:按照数据的创建时间、更新时间、过期时间等,将一定时间段内的数据视为热数据,超过该时间段的数据视为冷数据。
    • 访问频率区分:将高频访问的数据视为热数据,低频访问的数据视为冷数据。
       
  • 思想:对数据进行分类,然后分开存储
  • 优缺点
    • 优点:热数据的查询性能得到优化(用户的绝大部分操作体验会更好)、节约成本(可以冷热数据的不同存储需求,选择对应的数据库类型和硬件配置,比如将热数据放在 SSD 上,将冷数据放在 HDD 上)
    • 缺点:系统复杂性和风险增加(需要分离冷热数据,数据错误的风险增加)、统计效率低(统计的时候可能需要用到冷库的数据)。
  • 冷数据迁移:
    • 业务层代码实现:当有对数据进行写操作时,触发冷热分离的逻辑,判断数据是冷数据还是热数据,冷数据就入冷库,热数据就入热库。这种方案会影响性能且冷热数据的判断逻辑不太好确定,还需要修改业务层代码,因此一般不会使用。
    • 任务调度:可以利用 xxl-job 或者其他分布式任务调度平台定时去扫描数据库,找出满足冷数据条件的数据,然后批量地将其复制到冷库中,并从热库中删除。这种方法修改的代码非常少,非常适合按照时间区分冷热数据的场景。
    • 监听数据库的变更日志 binlog :将满足冷数据条件的数据从 binlog 中提取出来,然后复制到冷库中,并从热库中删除。这种方法可以不用修改代码,但不适合按照时间维度区分冷热数据的场景。
    • 如果你的公司有 DBA 的话,也可以让 DBA 进行冷数据的人工迁移,一次迁移完成冷数据到冷库。

  • 冷数据存储

    • 冷数据的存储要求主要是容量大,成本低,可靠性高,访问速度可以适当牺牲。

    • 冷数据存储方案:

      • 中小厂:直接使用 MySQL/PostgreSQL 即可(不改变数据库选型和项目当前使用的数据库保持一致),比如新增一张表来存储某个业务的冷数据或者使用单独的冷库来存放冷数据(涉及跨库查询,增加了系统复杂性和维护难度)
      • 大厂:Hbase(常用)、RocksDB、Doris、Cassandra

四、消息队列

见消息队列文章

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

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

相关文章

单片机知识总结(完整)

1、单片机概述 1.1. 单片机的定义与分类 定义: 单片机(Microcontroller Unit,简称MCU)是一种将微处理器、存储器(包括程序存储器和数据存储器)、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型…

代码管理之Gitlab

文章目录 Git基础概述场景本地修改未提交,拉取远程代码修改提交本地,远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区:本地电脑上看到的目录; repository 本地仓库:就是工作区中隐…

基于Java Springboot古风生活体验交流网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

智慧社区管理系统平台提升物业运营效率与用户体验

内容概要 智慧社区管理系统平台是一个集成了多项功能的综合性解决方案,旨在通过先进的技术手段提升物业管理的效率和居民的生活质量。该平台不仅关注物业运营的各个方面,还强调用户体验的重要性。随着科技的发展,社区管理方式正发生着翻天覆…

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器,一般指网站服务器,是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档,也可以放置网站文件以供全世界浏览,或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…

健身房小程序服务渠道开展

健身不单单是锻炼身体、保持身材,也是一种社交方式,城市里门店不少,每家都有一定流量和老客,但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户,而消费者也对门…

利用Java爬虫获得1688商品分类:技术解析与代码示例

在电商领域,了解商品分类对于市场分析和产品策略至关重要。1688作为中国领先的B2B电商平台,其商品分类数据对于商家来说具有极高的价值。本文将详细介绍如何使用Java编写爬虫程序,以合法合规的方式获取1688商品分类信息,并提供代码…

QT:QListView实现table自定义代理

介绍 QListVIew有两种切换形式,QListView::IconMode和QListView::ListMode,通过setViewMode()进行设置切换。因为QListView可以像QTreeView一样显示树形结构,也可以分成多列。这次目标是将ListView的ListMode形态显示为table。使用代理&…

YOLOv10改进,YOLOv10添加SE注意力机制,二次C2f结构

摘要 理论介绍 SE 注意力机制是一种提升卷积神经网络(CNN)性能的模块,SE更关注重要的特征图,增强了网络的表现,同时仅增加了较少的参数。SE 机制包含两个主要步骤: Squeeze (压缩):对所有特征图进行全局平均池化,生成一个通道描述符。Excitation (激励):将通道描述符…

详解Servlet的使用

目录 Servlet 定义 动态页面 vs 静态页面 主要功能 Servlet的使用 创建Maven项目 引入依赖 创建目录 编写代码 打war包 部署程序 验证程序 Smart Tomcat 安装Smart Tomcat 配置Smart Tomcat插件 启动Tomcat 访问页面 路径对应关系 Servlet运行原理 Tomcat的…

【Nginx从入门到精通】05-安装部署-虚拟机不能上网简单排错

文章目录 总结1、排查步骤 一、排查:Vmware网关二、排查:ipStage 1 :ping 127.0.0.1Stage 2 :ping 宿主机ipStage 3 :ping 网关 失败原因解决方案Stage 4 :ping qq.com 总结 1、排查步骤 Vmware中网关是否…

优化求解 | 非线性最小二乘优化器Ceres安装教程与应用案例

目录 0 专栏介绍1 Ceres库介绍2 Ceres库安装3 Ceres库概念3.1 构建最小二乘问题3.1.1 残差块3.1.2 代价函数 3.2 求解最小二乘问题 4 Ceres库案例4.1 Powell函数优化4.2 非线性曲线拟合 0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及…

Flink Transformation-转换算子

map算子的使用 假如有如下数据: 86.149.9.216 10001 17/05/2015:10:05:30 GET /presentations/logstash-monitorama-2013/images/github-contributions.png 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper…

记录一些PostgreSQL操作

本文分享一些pg操作 查看版本 select version(); PostgreSQL 11.11 查看安装的插件 select * from pg_available_extensions; 查看分词效果 select ‘我爱北京天安门,天安门上太阳升’::tsvector; ‘天安门上太阳升’:2 ‘我爱北京天安门’:1select to_tsvector(‘我爱北京天…

【ubuntu】数学人的环境搭建

Python 语言环境 python 的 pip 第三方库管理 sudo apt install python3-pippython 的 idle 界面 sudo apt install idle3R 语言环境 sudo apt install r-cran-zoo### RStudio 界面 ubuntu sudo snap install rstudio --classicJulia 语言环境 sudo snap install julia --…

android 11添加切换分屏功能

引言 自Android 7开始官方就支持分屏显示,但没有切换分屏的功能,即交换上下屏幕。直到Android 13开始才支持切换分屏,操作方式是:分屏模式下双击中间分割线就会交换上下屏位置。本文的目的就是在Android 11上实现切换分屏的功能。 下图是Android13切换分屏演示 切换分屏…

数据结构——排序算法第一幕(插入排序:直接插入排序、希尔排序 选择排序:直接选择排序,堆排序)超详细!!!!

文章目录 前言一、排序1.1 概念1.2 常见的排序算法 二、插入排序2.1 直接插入排序2.2 希尔排序希尔排序的时间复杂度 三、选择排序3.1 直接选择排序3.2 堆排序 总结 前言 时间很快,转眼间已经到数据结构的排序算法部分啦 今天我们来学习排序算法当中的 插入排序 和 …

C++网络编程之多播

概述 在移动互联网时代,随着多媒体应用的日益普及,如何高效地将数据传输给多个接收者成为了网络通信领域的一个重要课题。多播(英文为Multicast)作为一种高效的网络通信方式,可以将数据同时发送到多个接收者&#xff0…

AWS的流日志

文章目录 一、aws如何观察vpc的日志?二、aws观测其vpc的入口日志三、 具体配置3.1、配置你的存储神器 S33.2、建立子网的流日志 一、aws如何观察vpc的日志? 排查问题的时候除了去抓包看具体的端口信息的时候,还可以根据其所在的vpc的子网信息…

C++ —— 以真我之名 如飞花般绚丽 - 智能指针

目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷:循环引用问题 3. shared_ptr 和 unique_…