2023.12.16 关于 分布式系统 基本介绍

目录

单机架构

服务器负载过高问题

解决方法

分布式系统

引入更多的服务器节点

负载均衡 

数据库读写分离

引入缓存

数据库分库分表 

引入微服务 

基本概念

应用(Application)/ 系统(System) 

模块(Module)/组件(Component)

分布式(Distributed)

集群(Cluster)

主(Master)/从(Slave)

中间件(Middleware)

评价指标(Metric)

可用性(Availability)

响应时长(Response Time RT)

吞吐(Throughput)VS 并发(Concurrent)

分布式小结


单机架构

  • 只有一台服务器,该服务器负责所有工作

实例理解

  • 此处假定是一个电商网站

  • 此处的应用服务,就是写的服务器程序(如 Java Spring 写的 HTTP 服务器)
  • 数据库服务 如 MySQL
  • MySQL 是一个客户端服务器结构的程序,本体是 MySQL 服务器(存储和组织数据的部分)

注意:

  • 绝大多数公司的产品,都是这种单机架构
  • 随着计算机硬件性能飞速发展,单台主机的性能也非常高,足以支持非常高的并发 和 非常大的数据存储

服务器负载过高问题

  • 如果业务进一步增长,用户数量和数据量均水涨船高,一台主机难以应付的时候,就需要引入更多的硬件资源,引入更多的主机
  • 一台主机的硬件资源是有上限的,包括 CPU、内存、硬盘、网络等
  • 服务器每收到一个请求,都需消耗上述的资源
  • 如果同一时刻,处理的请求多了,此时就可能会导致某个硬件资源 不够用
  • 无论是哪个方面不够用了,都可能会导致服务器处理请求的时间边长,甚至处理出错的问题

解决方法

节流

  • 软件上优化,通过性能测试,找到哪个环节出现了瓶颈,再对症下药
  • 该方式对 程序员水平要求高

开源

  • 简单粗暴,直接增加更多的硬件资源
  • 当然一台主机上能增加的硬件资源也是有限的,取决于主板的扩展能力
  • 当 一台主机扩展到极限 还不够用的情况下,便只能引入多台主机了
  • 不是说新的机器买来就直接可以解决问题了,也需要软件上做出对应的调整和适配
  • 一旦引入了多台主机了,咱们的系统就可以称之为是 分布式系统

注意:

  • 引入分布式,必须是万不得已的
  • 因为系统的复杂程度会大大增加,即出现 bug 的概率也会更高

分布式系统

  • 多台不同的服务器中部署不同的服务模块

实例理解

  • 此处假定是一个电商网站

  • 应用服务器,里面可能会包含很多的业务逻辑,可能会吃 CPU 和 内存
  • 数据库服务器,需要更大的硬盘空间,更快的数据访问速度,可以配置更大的硬盘服务器,甚至还可以上 固态硬盘

注意:

  • 此处我们可以针对不同服务器的特点,来配置不同硬件类型的机器,从而可以达到更高的性价比

引入更多的服务器节点

  • 应用服务器是比较吃 CPU 和 内存 的
  • 如果把 CPU 或者 内存 吃没了,此时应用服务器就顶不住了
  • 则需引入更多的应用服务器,来有效解决上述问题

注意:

  • 当机器变多了,管理成本 和 出现问题的概率也会随之提高!

实例理解

  • 此处假定是一个电商网站
  • Scale Out 译为横向扩展

  • 用户的请求先到达 负载均衡器/网关服务器(单独的服务器)
  • 假设有 1W 个用户请求,有2 个应用服务器,此时按照负载均衡的方式,就可以让每个应用服务器承担 5k 的访问量

负载均衡 

  • 负载均衡器的主要功能是将外部发送来的请求均匀分配到多个应用服务器上
  • 而应用服务器需要根据请求执行相应的业务逻辑
  • 所以 负载均衡器对于请求量的承担能力,要远超过应用服务器

注意:

  • 如果请求量大到连负载均衡器也扛不住了的话,引入更多的负载均衡器即可

数据库读写分离

  • 虽然增加 应用服务器 确实能够处理更高的请求量
  • 但是与此同时 存储服务器 要承担的请求量也会变得更多
  • 所以我们可以引入更多的 存储服务器

实例理解

  • 此处假定是一个电商网站

  • 在实际的应用场景中,读的频率是比写要高的!
  • 主服务器一般是一个,从服务器可以有多个(一主多从)
  • 同时数据库通过负载均衡的方式,让应用服务器进行访问

引入缓存

  • 数据库天然有个问题,响应速度比较慢的(读硬盘)
  • 把数据区分 冷热 ,热点数据放到缓存中,缓存的访问速度往往比数据库要快很多
  • 热点数据 即会频繁访问到的数据
  • 二八原则,即 20% 的数据,能够支持 80% 的访问量

实例理解

  • 此处假定是一个电商网站

注意:

  • 此处 Redis 便可作为缓存服务器

数据库分库分表 

  • 引入分布式系统,不光要能够应对更高的请求量(并发量),同时也要能够应对更大的数据量
  • 所以可能会出现 一台主机无法存下全部数据的情况,引入多台主机存储即可

实例理解

  • 此处假定是一个电商网站

  • 由原来的 一个数据库服务器,即 数据库服务器上有多个数据库(database)
  • 转变为 引入多个数据库服务器,每个数据库服务器存储一个或一部分数据库(database)

注意:

  • 如果某个表特别大,大到一台主机存不下,也可以针对表进行拆分
  • 具体分库分表如何实践,还是要结合实际的业务场景来展开

引入微服务 

  • 之前应用服务器,一个服务器程序里面做了很多的业务
  • 这就可能导致这一个服务器的代码变得越来越复杂
  • 为了更方便与代码的维护,就可以把这样的一个复杂的服务器,拆分成更多的,功能单一的,但是更小的服务器(微服务)
  • 而且随着服务种类和数量增加,我们可以根据业务需求,灵活地调整每个微服务的规模和配置

实例理解

  • 此处假定是一个电商网站

注意:

  • 当应用服务器复杂了,势必就需要更多的人来维护了
  • 微服务的本质上是在解决 人 的问题
  • 按照 功能 拆分成多组 微服务,有利于 人员的组织结构 分配

问题:

1. 系统性能的下降

  • 拆出来更多的服务,多个功能之间要更依赖 网络通信
  • 网络通信的速度很可能是比硬盘还慢!
  • 要想保证性能不想下降太多,只能引入更多的机器,更多的硬件资源

2. 系统复杂程度提高,可用性受到影响

  • 服务器更多了,出现问题的概率就更大了
  • 这就需要一系列手段,来保证系统的可用性(更丰富的监控报警,以及配套的运维人员)

优势:

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

基本概念

应用(Application)/ 系统(System) 

  • 一个 应用 或 系统,就是 一个或一组服务器程序

模块(Module)/组件(Component)

  • 一个应用里面有很多个功能
  • 每个独立的功能,就可以称为是一个 模块 或 组件

分布式(Distributed)

  • 本质上就是引入多个服务器 或 主机,来协和配合完成一系列的工作
  • 物理上的多个主机

集群(Cluster)

  • 本质上就是引入多个服务器 或 主机,来协和配合完成一系列的工作
  • 逻辑上的多个主机

主(Master)/从(Slave)

  • 分布式系统中一种比较典型的结构
  • 多个服务器节点,其中一个是主,另外的是从,从节点 的数据要从主节点这里同步过来

中间件(Middleware)

  • 和业务无关的服务(功能更通用的服务)
  • 如 数据库、缓存、消息队列 等

评价指标(Metric)

可用性(Availability)
  • 系统整体可用的时间 ➗ 总的时间
  • 一个系统的第一要务
响应时长(Response Time RT)
  • 衡量服务器的性能
  • 越小越好
  • 和具体的服务器要做的业务密切相关
吞吐(Throughput)VS 并发(Concurrent)
  • 衡量系统的处理请求的能力
  • 衡量性能的一种方式

分布式小结

1、单机架构(应用程序 + 数据库服务器)

2、数据库和应用分离

  • 应用程序和数据库服务器 分别放到不同主机上部署了

3、引入负载均衡 把请求比较均匀的分发给集群中的每个应用服务器

  • 当集群中的某个机器挂了,其他的主机仍然可以承担服务,提高了整个系统的可用性

4、引入读写分离 数据库主存结构

  • 一个数据库节点作为主节点,其他N个数据库节点作为从节点
  • 主节点负责写数据,从节点负责读数据
  • 主节点现需要把修改过的数据同步给从节点

5、引入缓存 冷热数据分离

  • 进一步提升了服务器针对请求的处理能力
  • 二八原则
  • Redis 在一个分布式系统中通常被用作 缓存
  • 引入的问题是 数据库和缓存的数据一致性问题

6、引入分库分表 数据库能够进一步扩展存储空间

7、引入微服务 从业务上进一步拆分应用服务器

  • 从业务功能的角度,把应用服务器 拆分成更多的功能更单一、更简单、更小的服务器

注意:

  • 上述这样的几个演化的步骤,只是一个粗略的过程
  • 实际上一个商业项目,真实的演化过程,都是和它的业务发展密切相关的
  • 业务是更重要的,技术只是给业务提供支持的
  • 所谓的 分布式系统 就是想办法引入更多的硬件资源来解决当下的业务问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣日记12.18-【二叉树篇】合并二叉树

力扣日记:【二叉树篇】合并二叉树 日期:2023.12.18 参考:代码随想录、力扣 617. 合并二叉树 题目描述 难度:简单 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时&#xf…

软件测试培训三个月,想找到工作,到底应该怎么搞

功能方面:问的最多的就是测试流程,测试计划包含哪些内容,公司人员配置,有bug开发认为不是 bug怎么处理,怎样才算是好的用例,测试用例设计方法(等价类,边界值等概念方法)&…

C# 使用FluentHttpClient请求WebApi

写在前面 FluentHttpClient 是一个REST API 异步调用 HTTP 客户端,调用过程非常便捷,采用流式编程,可以将所有请求所需的参数一次性发送,并直接获取序列化后的结果。 老规矩从NuGet上安装该类库: 这边一定要认准是 P…

python/c++ Leetcode题解——1.两数之和

目录 方法1:枚举法 思路 Code 方法2:哈希表 思路 Code 方法1:枚举法 思路 最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x。 当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已…

使用GPU利用ffmpeg-在Pyhton代码中实现视频转码到MP4格式的过程记录【失败告终-原因是显示型号太老不支持】

01-安装Nvida的显卡驱动和CUDA 参考文章 https://blog.csdn.net/wenhao_ir/article/details/125253533 进行安装。 02-下载ffmpeg的可执行文件 下载ffmpeg的Windows可执行文件,下载页面: https://www.gyan.dev/ffmpeg/builds/#release-builds 我在202…

深度学习中的潜在空间

1 潜在空间定义 Latent Space 潜在空间:Latent ,这个词的语义是“隐藏”的意思。“Latent Space 潜在空间”也可以理解为“隐藏的空间”。Latent Space 这一概念是十分重要的,它在“深度学习”领域中处于核心地位,即它是用来学习…

ROS机器人入门

http://www.autolabor.com.cn/book/ROSTutorials/ 1、ROS简介 ROS 是一个适用于机器人的开源的元操作系统。其实它并不是一个真正的操作系统,其 底层的任务调度、编译、寻址等任务还是由 Linux 操作系统完成,也就是说 ROS 实际上是运 行在 Linux 上的次级…

微信小程序开发学习(基础)

学习课程&#xff1a;2023最新零基础入门微信小程序开发_哔哩哔哩_bilibili 微信开发工具下载地址&#xff1a;微信开发者工具下载地址与更新日志 | 微信开放文档 开发文档&#xff1a;微信开放文档 创建新项目 机型&#xff1a;iPhoneX 快捷键 <view>.row{$}*8 <…

Android hilt使用

一&#xff0c;添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…

对偶问题笔记(1)

目录 1 从 Lagrange 函数引入对偶问题2. 强对偶性与 KKT 条件3. 对偶性的鞍点特征 1 从 Lagrange 函数引入对偶问题 考虑如下优化问题 { min ⁡ f 0 ( x ) s . t f i ( x ) ≤ 0 , i 1 , ⋯ , p , h j ( x ) 0 , j 1 , ⋯ , q , x ∈ Ω , \begin{align} \begin{cases}\min…

Pipelined-ADC设计一:序言

现在是2023年12月18日&#xff0c;准备开新帖&#xff0c;设计一个 流水线型 模数转换器&#xff08; Pipelined-ADC &#xff09;。记录帖&#xff0c;后续会放在咸鱼。同步记录&#xff0c;谨防盗用。 初定指标&#xff1a;12位50Mhz&#xff0c;采用2.5bit每级结构&#xff…

奇数魔方阵

魔方阵的生成方法为第0行中间位置为1 2开始的其余n*n-1个数&#xff0c;依次按以下规则存放 1.下一个元素存放在当前元素的上一行、下一列 2.如果上一行下一列已有元素&#xff0c;则下一个元素存放的位置为当前列的下一行 3.在找上一行、下一行或下一列的时候&#xff0c;把矩…

计算机组成原理——校验码

计算机组成原理学习笔记——校验码-CSDN博客 校验码——海明码及码距&#xff0c;码距_海明码的码距是多少-CSDN博客 1 下列关于码距与检错与纠错能力的描述中正确的是 &#xff08;ABC&#xff09; &#xff08;多选&#xff09; A. 码距为1的编码不具备任何检错能力 B. 码…

可能是全网最详细的线性回归原理讲解!!!

ps&#xff1a;此处的特征向量有别于线性代数中的特征向量&#xff0c;准确来讲这里的特征向量是一个样本的所有属性值。 用梯度下降慢慢逼近这个最小值点 本文图片来源于可能是全网最详细的线性回归原理讲解&#xff01;&#xff01;&#xff01;_哔哩哔哩_bilibili 可以结合…

C++学习笔记(十二)------is_a关系(继承关系)

你好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 文章目录 前言 一、继承关系…

基于Levenberg-Marquardt算法改进的BP神经网络-公式推导及应用

Levenberg-Marquardt算法是一种用于非线性最小化问题的优化算法&#xff0c;通常用于训练神经网络。它结合了梯度下降和高斯-牛顿方法的特点&#xff0c;旨在提高收敛速度和稳定性。下面是基于Levenberg-Marquardt算法改进的反向传播&#xff08;BP&#xff09;神经网络的详细推…

[Kubernetes]3. k8s集群Service详解

在上一节讲解了k8s 的pod,deployment,以及借助pod,deployment来部署项目,但会存在问题: 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod访问还需要端口转发Pod重创后IP变了,名字也变了针对上面的问题,可以借助Service来解决,下面就来看看Service怎么使用 一.Service详…

转发一篇计算机论文

最近看到一篇雷军老师在1992年的一篇计算机论文&#xff0c;个人看了对计算机科学从另外一个角度又多了一层理解&#xff0c;感觉很有收获&#xff0c;鉴于网上的图片看起来不清楚&#xff0c;本人特地到中国知网上去下载了这篇论文&#xff0c;希望给有心学习的人一点帮助。我…

Goland如何进行Debug断点调试

1. 进入编辑 2. 进行编辑 3. 调试运行 将鼠标移到按钮上&#xff0c;即显示其功能与快捷键 4. 常用调试快捷键 按键说明F7单步执行(进入方法)F8单步执行(不进入方法)F9继续执行

adb详细教程(五)-复制文件、截屏、录屏

adb对于安卓移动端来说&#xff0c;是个非常重要的调试工具。在进行安卓端的开发或测试过程中&#xff0c;有时需要了截屏或录屏&#xff0c;在设备上操作完成后再将文件导入电脑非常繁琐。​如果使用adb指令在进行截屏或录屏则会便捷许多。此篇文章介绍了如何使用adb指令进行文…