【分布式架构设计理论1】架构设计的演进过程

文章目录

  • 一. 分布式架构要解决的问题
  • 二. 架构设计的演进过程
    • 1. 应用与数据一体
    • 2. 应用与数据分离
    • 3. 添加缓存:突破数据库(IO)瓶颈
    • 4. 服务器集群处理并发
    • 5. 数据库读写分离:释放读性能
      • 5.1. 问题分析
      • 5.2. 解决方案:读写分离
    • 6. 反向代理和 CDN
      • 6.1. 反向代理的作用
      • 6.2. CDN进一步加快静态资源的访问
    • 7. 分布式数据库与分表分库
      • 7.1. 分库分表
      • 7.2. 数据库中间件
    • 8. 业务拆分:引入服务通讯与协调
    • 9. 分布式与微服务

一. 分布式架构要解决的问题

  • 为了应对请求的高并发和业务的复杂性,需要对应用服务进行合理拆分,将其从原来的大而集中变成小而分散;
  • 要想让这些分散的服务共同完成计算任务,就需要解决它们之间的通信与协同问题;
  • 和服务一样,负责存储的数据库也会有分散的情况,因此需要考虑分散存储;
  • 所有的服务、数据库都需要硬件资源作为支撑,所以需要对资源的管理和调度;
  • 软件系统上线以后,还需要对关键指标进行监控。

 

二. 架构设计的演进过程

本章主要讨论:架构设计经历了哪些阶段,以及每个阶段分别解决了哪些问题,又引出了哪些新问题。

1. 应用与数据一体

应用与数据库都部署到一台机器上,比如网页浏览、OA 等,访问人数有限,单台服务器就能轻松应付,利用 LAMP(Linux、Apache、MySQL、PHP)技术就可以迅速搞定。


 

2. 应用与数据分离

随着业务的发展,用户数量和请求数量逐渐上升,服务器的性能便出现了问题。

  1. 应用服务器由于需要处理大量的业务请求,因此对 CPU 和内存有一定要求;
  2. 数据服务器因为需要对数据进行存储和索引等 IO 操作,所以更多地会考虑磁盘的转速和内存。 简单的做法就是应用和数据库部署在不同的机器上。

 

3. 添加缓存:突破数据库(IO)瓶颈

背景:数据库成为瓶颈,即使增加服务器的数量,也不能解决。数据增加对某些数据请求量特别大。获取这些信息的方式是依靠数据库,因此会受到数据库IO性能的影响,久而久之,数据库便成为了整个系统的瓶颈。

这时可以引入缓存技术:

  • 加入缓存技术后,系统性能得到了提高。这是因为缓存位于内存中,而内存的读取速度要比磁盘快得多,能够很快响应用户请求。特别针对一些热点数据,优势尤为明显。
  • 在可用性方面也有明显改善,即使数据服务器出现短时间的故障,在缓存服务器中保存的热点数据或者核心数据依然可以满足用户暂时的访问。

 

缓存技术分为:客户端浏览器缓存、应用服务器本地缓存和缓存服务器缓存

  • 客户端浏览器缓存:
    当用户通过浏览器请求应用服务器的时候,会发起 HTTP 请求。如果将每次 HTTP 请求都缓存下来(how),就可以极大地减小应用服务器的压力。
  • 应用服务器本地缓存:堆
    这种缓存使用的是进程内缓存,又叫托管堆缓存。 由于它运行在内存中,对数据的响应速度很快,因此通常用于存放热点数据。当进程内缓存没有命中时,会到缓存服务器中获取信息,如果还是没有命中,才会去数据库中获取。
  • 缓存服务器缓存:例如redis
    就是进程外缓存,由于缓存会占用内存空间,因此这类服务器往往会配置比较大的内存,通常部署到专门的机器。

 

用户请求访问数据的顺序为

客户端浏览器缓存→应用服务器本地缓存→缓存服务器缓存。如果按照以上次序还没有命中数据,才会访问数据库获取数据。


 

4. 服务器集群处理并发

随着用户请求量的增加,另外一个问题又出现了,那就是并发,即会出现多个用户同时请求应用服务器。这里可以通过部署多台应用服务器来分担单台的负载压力。

在这里插入图片描述

负载均衡器说明:

  1. 单台应用服务器中部署的应用服务并没有改变,在用户请求与服务器之间加入了负载均衡器,以便将用户请求路由到对应的服务器中。注意负载均衡器采用的均衡算法要能保证

a. 用户请求均匀地分布到多台服务器上
b. 请求的状态问题:属于同一个会话的所有请求在同一个服务器上处理
c. 针对不同服务器资源的优劣能够动态调整流量

  1. 由于负载均衡器位于互联网与应用服务器之间,因此可以对用户流量进行监控,同时对提出访问请求的用户的身份和权限进行验证,即也充当了网关的作用。

 

5. 数据库读写分离:释放读性能

5.1. 问题分析

加入缓存可以解决部分热点数据的读取问题,但缓存的容量毕竟有限,那些非热点的数据依然要从数据库中读取。

数据库对于写入和读取操作的性能是不一样的。在写入数据时,会造成锁行或者锁表,此时如果有其他写入操作并发执行,就会出现排队现象。读取操作不仅比写入操作更加快捷,并且可以通过索引、数据库缓存等方式实现。

 

5.2. 解决方案:读写分离

设置主从数据库,主库(master)主要用来写入数据,然后通过同步binlog 的方式,将更新的数据同步到从库(slave)中。对于应用服务器而言,在写数据时只需要访问主库,在读数据时只用访问从库就好了。

利用读数据效率较高的优势,扩展更多的从库,从而服务于请求读取操作的用户。毕竟在现实场景中,大多数操作是读取操作。8:2。

在这里插入图片描述

 

读写分离技术要考虑的问题:

  • 数据同步技术可以分为同步复制技术、异步复制技术和半同步复制技术,
  • 读写分离架构设计也需要考虑可靠性的问题。例如,如果主库挂掉,从库如何接替主库进行工作;之后主库恢复了,是成为从库还是继续担任主库,以及主从库如何同步数据。

 

6. 反向代理和 CDN

之前讨论的架构,用户都是通过客户端直接访问应用服务器获取服务,这使得应用服务器暴露在互联网中,容易遭到攻击。比如:流量攻击,非法请求等。可以在应用服务器与互联网之间加上一个反向代理服务器,由此服务器来接收用户的请求,然后再将请求转发到内网的应用服务器。

在这里插入图片描述

6.1. 反向代理的作用

反向代理服务器的作用:

  • 反向代理服务器只对请求进行转发,因此当有人攻击它的时候,是不会影响到内网的应用服务器,这在无形中保护了应用服务器,提高了安全性
  • 反向代理服务器也在互联网与内网之间起适配(让公网客户端也能访问到内部服务)和网速转换(哪些用户使用高速、哪些用户使用低速等)的作用。如下例子:

应用服务器需要服务于公网和教育网,但是这两个网络的网速不同,那么就可以在应用服务器与互联网之间放两台反向代理服务器,一台连接公网,另一台连接教育网,用于屏蔽网络差异。

公网客户端和校园网客户端分别来自公网与校园网两个不同的网络,由于两者访问速度不同(为了满足这两个客户端不同流量需求),因此会分别设置公网反向代理服务器和校园网反向代理服务器,通过这种方式将位于不通网络的用户请求接入到系统中。(添加反向代理器是为了让公网客户端也能访问到某些内部服务)

 

6.2. CDN进一步加快静态资源的访问

CDN,它的全称是 Content Delivery Network,也就是内容分发网络。

如果把互联网想象成一张大网,那么每台服务器或者每个客户端就是分布在这张大网中的节点。节点之间的距离有远有近,用户请求会从一个节点跳转到另外一个节点,最终跳转到应用服务器获取信息。跳转的次数越少,越能够快速地获取信息,因此可以在离客户端近的节点中存放信息。这样用户通过客户端,只需要跳转较少的次数就能够触达信息。

由于这部分信息更新频率不高,因此推荐存放一些静态数据,例如 JavaScript 文件、静态的 HTML、图片文件等。这样客户端就可以从离自己最近的网络节点获取资源,大大提升了用户体验和传输效率。

 

优劣势

CDN 的加入明显加快了用户访问应用服务器的速度,同时减轻了应用服务器的压力,原来必须直接访问应用服务器的请求,现在不需要经过层层网络,只要找到最近的网络节点就可以获取资源。但从请求资源的角度来看,这种方式也有局限性,即它只对静态资源起作用,而且需要定时对 CDN 服务器进行资源更新。

 

7. 分布式数据库与分表分库

7.1. 分库分表

当数据量非常大时,即使添加了索引、缓存以及读写分离时,查询速度也很慢。这时可以考虑分布式数据库方案:从业务和数据层面对数据库进行分配。如下例子:

  1. 对于表来说:
    假设有 1000 万个会员记录,既可以将其分成两个 500 万,分别放到两张表中存储,也可以按照业务对表中的列进行分割,把表中的某些列放到其他表中存储,然后通过外键关联到主表。(注意:被分割出去的列通常是不经常访问的数据。)
  2. 对于库来说:
    每个数据库能够承受的最大连接数和连接池是有上限的。为了提高数据访问效率,可以根据业务需求对数据库进行分割,让不同的业务访问不同的数据库(有点微服务的味道了)。
    如果将数据库资源分别放到不同的数据库服务器中,就是分布式数据库设计

 

7.2. 数据库中间件

由于数据存储在不同的表/库中,甚至在不同的服务器上面,因此在进行数据库操作的时候会增加代码的复杂度。此时可以加入数据库中间件来实现数据同步,从而消除不同存储载体间的差异。

如图,将数据拆分以后分别放在表 1 和表2 中,两张表所在的数据库服务器也不相同,库与库之间还需要考虑数据同步的问题。因为数据的分散部署,所以从业务应用获取数据时需要依靠数据库中间件的帮忙。

在这里插入图片描述
有一些数据库中间件提供了最佳实践,例如 MyCat 和Sharding JDBC。此外,从数据库服务器管理的角度来看,需要监控服务器的可用性。从数据治理的角度来看,需要考虑数据扩容和数据治理的问题。

注意:数据库的分布式设计以及分表分库,会给系统带来性能的提升,同时也增大了数据库管理和访问的难度。原来只需访问一张表和一个库就可以获取数据,现在需要跨越多张表和多个库。


 

8. 业务拆分:引入服务通讯与协调

通过对前面几个阶段的学习,我们知道系统提升依靠的基本都是以空间换取时间,使用更多的资源和空间处理更多的用户请求。

如果说前面的服务器集群模式是将同一个应用复制到不同的服务器上,那么业务拆分就是将一个应用拆成多个部署到不同的服务器中。

此外,还有的是对核心应用进行水平扩展,将其部署到多台服务器上。应用虽然做了拆分,但应用之间仍旧有关联,存在相互之间的调用、通信和协调问题。由此引入了队列、服务注册发现、消息中心等中间件,这些中间件可以协助系统管理分布到不同服务器、网络节点上的应用。


 

9. 分布式与微服务

分布式与微服务的区别:

  • 拆分目的不同:

    • 分布式设计是为了解决单体应用资源有限的问题,一台服务器无法支撑更多的用户访问,因此将一个应用拆解成不同的部分,然后分别部署到不同服务器上,从而分担高并发的压力。
    • 微服务是对服务组件进行精细化,目的是更好地解耦,让服务之间通过组合实现高性能、高可用、可伸缩、可扩展。
  • 拆分方式不同:

    • 分布式服务架构将系统按照业务和技术分类进行拆分(比如Hadoop中的HDFS和Yarn),目的是让拆分后的服务负载原来单一服务的业务。
    • 微服务则是更细的拆分(服务下不同的模块),它将服务拆成更小的模块,不仅更专业化,分工也更为精细,并且每个小模块都能独立运行。
  • 部署方式不同:

    • 分布式架构将服务拆分以后,通常会把拆分后的各部分部署到不同服务器上。
    • 微服务既可以将不同的服务模块部署到不同服务器上,也可以在一台服务器上部署多个微服务或者同一个微服务的多个备份,并且多使用容器的方式部署。

在这里插入图片描述

从实践的角度来看,分布式与微服务都是基于分布式架构的思想构建的。可以说微服务是分布式的进化版本,也是分布式的子集,所以它同样会遇到服务拆分、服务通信、协同、管理调度等问题。

 

参考:《分布式架构原理与实践–崔皓》

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

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

相关文章

【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标!说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站点…

数据结构-ArrayList和顺序表

1.线性表 线性表是n个具有相同类型的数据元素所组成的有限序列,当n0时,线性表为一个空表。 常见的线性表:顺序表,链表,栈和队列... 线性表在逻辑上是线性结构,可以说是连续的一条直线。但是在物理结构上…

C#使用WMI获取控制面板中安装的所有程序列表

C#使用WMI获取控制面板中安装的所有程序列表 WMI 全称Windows Management Instrumentation,Windows Management Instrumentation是Windows中用于提供共同的界面和对象模式以便访问有关操作系统、设备、应用程序和服务的管理信息。如果此服务被终止,多数基于 Windo…

CPU狂飙900%如何分析?怎么定位?怎么溯源处理

当你的服务器CPU飙升到900%,系统卡顿、响应迟缓、业务受阻,这种令人焦虑的场景是否让你束手无策?别慌,这并不是世界末日,只要掌握正确的分析与定位方法,就能快速找到问题根源,并有效解决。 CPU…

第五篇 vue3 ref 与 reactive 对比

ref 若需要自动加载 .value ,那么就要在 底部 菜单 中 设置 选项 选择 vue 勾选 : Auto Insert: Dot Value Auto-complete Ref value with .value. 注意点: ref 不能写越过 value. 必须要在valeu 前面 进行定义 通过 reactive 来修改整体名称…

“大模型横扫千军”背后的大数据挖掘--浅谈MapReduce

文章目录 O 背景知识1 数据挖掘2 邦费罗尼原则3 TF.IDF4 哈希函数5 分布式文件系统 一、MapReduce基本介绍1. Map 任务2. 按键分组3. Reduce 任务4. 节点失效处理5.小测验:在一个大型语料库上有100个map任务和若干reduce任务: 二、基于MapReduce的基本运…

Linux系统的第一个进程是什么?

Linux进程的生命周期从创建开始,直至终止,贯穿了一个进程的整个存在过程。我们可以通过系统调用fork()或vfork()来创建一个新的子进程,这标志着一个新进程的诞生。 实际上,Linux系统中的所有进程都是由其父进程创建的。 既然所有…

使用tritonserver完成clip-vit-large-patch14图像特征提取模型的工程化。

1、关于clip-vit-large-patch14模型 关于openapi开源的clip-vit-large-patch14模型的特征提取,可以参考之前的文章:Elasticsearch向量检索需要的数据集以及768维向量生成这篇文章详细介绍了模型的下载地址、使用方式、测试脚本,可以让你一步…

人工智能之深度学习_[3] -PyTorch自动微分模块和构建线性回归模型

文章目录 自动微分模块9.1 梯度基本计算9.2 梯度下降法求最优解9.3 梯度计算注意点9.4 自动微分模块应用 10 PyTorch构建线性回归模型 自动微分模块 自动微分就是自动计算梯度值,也就是计算导数。 什么是梯度 对函数求导的值就是梯度 什么是梯度下降法 是一种求最优梯度值的方法…

logback日志自定义占位符

前言 在大型系统运维中,很大程度上是需要依赖日志的。在java大型web工程中,一般都会使用slf4jlogback这一个组合来实现日志的管理。 logback中很多现成的占位符可以可以直接使用,比如线程号【%t】、时间【%d】、日志等级【%p】,…

Qt中自定义信号与槽

在学习信号和槽的时候,我们知道信号一般对应的就是用户的行为,槽指的是接受到信号后的响应,在类内有许多的内置信号和槽函数,能够去实现一些常见的行为,但实际业务开发中,尤其是接受到信号的响应会根据具体…

Yearning开源MySQL SQL审核平台

一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用. 本地部署,注重隐私,简单高效的MYSQL审计平台。 它可以通过流程审批,实现真实线上环境sql的审核和执行,还可以回滚执行,能够确保线上SQL更新的可靠性…

【Python项目】小区监控图像拼接系统

【Python项目】小区监控图像拼接系统 技术简介:采用Python技术、B/S框架、MYSQL数据库等实现。 系统简介:小区监控拼接系统,就是为了能够让业主或者安保人员能够在同一时间将不同地方的图像进行拼接。这样一来,可以很大程度的方便…

汇编与逆向(一)-汇编工具简介

RadASM是一款著名的WIN32汇编编辑器,支持MASM、TASM等多种汇编编译器,Windows界面,支持语法高亮,自带一个资源编辑器和一个调试器。 一、汇编IDE工具:RadASM RadASM有内置的语言包 下载地址:RadASM asse…

基于STM32的智能门锁安防系统(开源)

目录 项目演示 项目概述 硬件组成: 功能实现 1. 开锁模式 1.1 按键密码开锁 1.2 门禁卡开锁 1.3 指纹开锁 2. 功能备注 3. 硬件模块工作流程 3.1 步进电机控制 3.2 蜂鸣器提示 3.3 OLED显示 3.4 指纹与卡片管理 项目源代码分析 1. 主程序流程 (main…

AUTOSAR OS模块详解(三) Alarm

AUTOSAR OS模块详解(三) Alarm 本文主要介绍AUTOSAR OS的Alarm,并对基于英飞凌Aurix TC3XX系列芯片的Vector Microsar代码和配置进行部分讲解。 文章目录 AUTOSAR OS模块详解(三) Alarm1 简介2 功能介绍2.1 触发原理2.2 工作类型2.3 Alarm启动方式2.4 Alarm配置2.5…

YOLO目标检测1

一. 参考资料 《YOLO目标检测》 by 杨建华博士 二. 背景 2.1 目标检测发展简史 2014年,RCNN问世,R-CNN的思路是先使用一个搜索算法从图像中提取出若干感兴趣区域(region of interest,RoI),然后使用一个卷积神经网络(convolutio…

【Qt 常用控件】显示类控件——QLabel

目录 1.QLabel 1.1 textFormat 文本类型 普通文本和富文本 Markdown格式 1.2 alignment 文本对齐方式 1.3 wordWrap 自动换行 1.4 indent 文本缩进 1.5 margin 边距 1.6 buddy,qlabel伙伴 1.7 pixmap图片 和 scaledContents自动填充 1.QLabel 功能&#x…

vif-方差膨胀因子计算

vif-方差膨胀因子 使用statsmodels中的variance_inflation_factor,数据集使用乳腺癌数据集 import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer from tqdm import notebook from statsmodels.stats.outliers_influence impor…

查看电脑或笔记本CPU的核心数方法及CPU详细信息

一、通过任务管理器查看 1.打开任务管理器 可以按下“Ctrl Shift Esc”组合键,或者按下“Ctrl Alt Delete”组合键后选择“任务管理器”来打开。 2.查看CPU信息 在任务管理器界面中,点击“性能”标签页,找到CPU使用记录区域&#xff0c…