【Redis】初识分布式系统

目录

单机架构

分布式系统

应用数据分离架构

应用服务集群架构

读写分离/主从分离架构

冷热分离架构

垂直分库

微服务架构 

分布式名词概念 


本篇博文,将根据分布式系统的演进一步一步介绍每一种架构的形式,最后为大家总结了一些分布式中常用的名词解释

单机架构

单机架构简单来说就是只有一台服务器,这台服务器完成项目中的所有工作

假设项目是一个电商网站,那么单机架构图如下:

上图中,后端服务主要分为两部分:

  • 应用服务:应用服务就是程序员编写的一些应用程序
  • 数据库服务:数据库服务常见的有MySQL服务
  • 注意:MySQL是一个C/S结构的程序,本体是MySQL服务器(存储和组织数据的部分)

在上图中,数据库服务可以去掉,由应用服务即处理业务,也存储数据。也可以实现但较为麻烦!

在早些年,单机架构有着一系列的性能瓶颈,但随着硬件水平的提高,哪怕只有一台主机,主机的性能也是很高的,基本能满足。

在单机架构中上述服务都由一台服务器提供,单机结构在大多数小公司(服务器请求较少时)当中被采用


分布式系统


分布式系统的引入

尽管我们说现在服务器的性能经过多年的发展,已经非常高了,但它的性能也有瓶颈。

如果一个项目业务进一步增加(请求繁忙,处理不过来),用户量和数据量都水涨船高,高到最后达到了一台主机难以应付时我们应该怎么办呢?

办法分为两种:

  • 开源:这种解决方法简单粗暴,啥不够加啥就好,CPU不够用就换个更牛的CPU,内存不够换个更牛的内存,依次类推
  • 节流:软件优化,这比较考验程序员的能力,程序员需要通过性能测试找到哪个环节的瓶颈,并对此进行一系列优化 

对于节流方式,我们能理解,但当节流方式不可用了,即优化已经到了极致了,还是难以应付大量的业务,我们只能采用开源方法!

但对于一台主机来说,它的硬件资源也是有上限的

硬件资源包括但不限于如下几种:

  • CPU
  • 内存
  • 硬盘
  • 网络

可以看出,一台主机加装的硬件数量受主板的扩展能力限制。你总不可以一台主机装20个CPU吧?

那么如果我们一台主机开源也已经做到极致了,还是无法应付大量的业务,我们应该怎么办呢?

此时我们只能引入多台主机了!当然,不是说一台主机买来了就可以直接解决问题了,而是需要我们在软件上做出对应的调整和适配后才可以!

一旦引入了多台主机,那么我们的系统可以称之为分布式系统


分布式系统正确认识

通过上述的一系列过程,我们会发现一个项目不是一定要设计成分布式系统才是最优的,设计成分布式系统是要根据业务来判断的,这是万不得已的下下策,因为分布式系统会带来弊端

分布式系统的弊端:系统的复杂程度大大提高, 引入越多的主机,那么分布式系统的复杂程度可以说是成指数增长的,也就是出现bug的概率会提高!


分布式系统的分类 

根据演化过程,分布式系统可以分成如下几类:

  • 应用数据分离架构
  • 应用服务集群架构
  • 读写分离/主从分离架构
  • 冷热分离架构
  • 垂直分库 
  • 微服务架构

接下来,本文将根据如上架构进行一一详解 


应用数据分离架构

应用数据分离架构指的是把单机架构中的应用服务和数据库服务分别由两台服务器来提供,如下图:

当分离以后,对于两个服务器我们可以分情况讨论:

  • 对于应用服务来说,它伴随着大量的业务处理,也就比较吃CPU和内存资源,那么我们可以为应用服务器提供较好的CPU和较大的内存
  • 对于数据库服务来说,它伴随着大量的存储需求,也就比较吃硬盘空间和硬盘访问速度,那么我们可以为存储服务器配置更大硬盘(硬盘空间),也可以上SSD(硬盘访问速度)。 

可以看到,当我们把两个服务分别部署到两台服务器以后,我们可以根据服务器的具体业务场景,为服务器进行不同的硬件配置,刀都花在了刀刃上,有效提高了性价比。这也就是应用数据分离架构的主要优势!


应用服务集群架构

应用服务集群架构指的是把单机架构中的应用服务分别部署到多台服务器当中,并配备一个负载均衡器(网关服务器),负载均衡器主要应用于请求到来时分析该请求应该分发给哪个应用服务器!负载均衡器的分发采用特定算法!

如下图: 


 为什么有应用服务集群架构? 

在应用数据分离架构中,如果业务处理需要占用大量的CPU和内存,导致CPU和内存资源耗尽,那么我们只能引入更多的应用服务器。原先的业务处理请求分别分发给不同的应用服务器,有效减小了单机的弊端

假设业务请求一共有10000个,应用服务器有两个,那么每个应用服务器只需要处理5000个请求即可

需要注意的是:应用服务集群架构的每一个应用服务器都能处理单个完整的业务请求。区别一下微服务


负载均衡器的负载问题

通过应用服务集群架构图我们可以看出,尽管应用服务器确实分别承担了部分请求,但对于负载均衡器来说,它承担了所有的请求,那么它会不会顶不住呢?

实际上,负载均衡器,对于请求量的承受能力,要远超过应用服务器。

负载均衡器只进行请求的分发,就好比公司中的领导只负责分配工作,我们会发现公司领导分配工作时的时间是远远小于我们开发的时间的,也就是成本低。负载均衡器也同理

应用服务器就相当于程序员,当领导分配给你任务时,你是完成具体的工作的,完成具体工作的时间肯定是比公司领导分配给你任务时的时间大的多的!


多负载均衡器 

尽管我们说负载均衡器对于请求的承受能力是很大的,但再大也会有一个上限。

比如说一个老板分配10个人的任务时还好,那么如果要一个老板分配1000或10000个人的任务呢?

所以当请求量大到负载均衡器也扛不住了,那么我们可以引入多个负载均衡器,实际上就是多个机房,每个负载均衡器处理一个机房的服务器请求,并配备全局负载均衡器用于发送请求给下级负载均衡器,全局负载均衡器可以一次发送多个请求给下级负载均衡器

依次类推,理论上来说我们处理请求个数是无限的

但多负载均衡器也带来了一些挑战:分布式系统中有的主机个数越来越多,导致系统的复杂程度越来越高,出现BUG的概率也越来越大


读写分离/主从分离架构

 读写分离架构指的是把存储服务器分为两个部分

  • 主(master)服务器
  • 从(slave)服务器

主服务器负责处理数据库的写入,从服务器负责读数据库

由于一般来说对数据库的写入操作远远小于访问数据库的次数,所以一般来说主服务器是一个,而从服务器可以有多个(一主多从) 

如下图:

其中主服务器负责写入数据库,从服务器负责读取数据库

同时,当应用服务访问从服务器时通过负载均衡的方式调用从服务器!

当主服务器发生写入操作时,需要保证数据一致性,所以数据要同步到所有从服务器中


为什么要有读写分离/主从分离架构? 

上述,增加应用服务器,确实能够处理更高的业务请求量,但是随之存储服务器,要承担的请求量也就增多了,并且存储服务器的请求都堆积到一台服务器当中,那么存储服务器会不会扛不住呢?

显然是可能会的,那么如何处理呢?

主要方式还是开源节流,我们接下来讨论假设节流已经做到了极致,无法进行优化,那么我们只能从开源入手,即引入更多的存储服务器,其中较为经典的就是读写分离/主从分离架构


冷热分离架构

冷热分离架构是针对存储服务器的效率问题的。

二八原则:20%的数据,大概率能支持80%的访问量

我们可以把对读数据时分为两种,第一种是访问的是20%热点数据,那么我们可以让它直接访问缓存服务器,第二种是访问的是80%的数据,那么我们可以让它访问从服务器

注意:缓存服务器就是Redis的功能体现!

根据二八原则,冷热分离架构能大大服务器访问数据的效率


冷热分离架构的弊端 

缓存服务器的介入,又进一步提高了系统的复杂程度,引入了一系列问题

  • 当存储服务器写入时,缓存服务器同步成功,但从服务器同步失败怎么处理?
  • 当存储服务器写入时,缓存服务器同步失败,从服务器同步成功怎么处理?
  • 。。。

垂直分库

垂直分库解决的问题是,当数据库的内容过大时,可以把一个数据库分为多个存储集群,每个存储集群保存一部分数据。

当某个表的内容过大时,也可以对表内部项进一步划分成多个表 

如下图,为垂直分库架构的基本结构:

具体的分库分表如何实现,需要根据具体业务具体分析!总的来说垂直分库解决的是单机存储空间的问题


微服务架构 

在之前的架构体系中,都是由应用服务器独立完成所有的业务逻辑,哪怕分成多个应用服务器以后也还是单机独立完成所有业务。

这会导致这一个应用服务器的代码逻辑越来越复杂!

于是人们就把一个单独的业务逻辑进行进一步划分,也就是把应用服务器分为多个子服务器,每个子服务器完成一小块业务逻辑。

例如一个电商系统的业务逻辑包含用户模块、商品模块、交易模块。当设计了子服务器以后每一个子服务器只需要完成单独的模块即可,如下图:

图中,这些子系统集群就是我们所说的微服务,而这个电商系统就是微服务系统!

不难看出,有了微服务以后,服务器的种类和数量就增加了!


为什么要有微服务架构?

实际上微服务本质上解决的是"人"的问题

对于一个小公司来说,只有两三个开发,那么完全没有必要搞成微服务架构!

但对于一个大公司来说,有着数以百计的开发,那么设计成微服务是合理的

对于大公司来说,由于人太多,那么就需要有配套的管理机制。于是就把人划分组织结构,分成多个组,每个组配备领导进行管理。当划分成多个组以后,就需要进行分工。那么微服务是有利于组和组之间的分工的!

还是以电商系统为例,我们划分三个组:用户组、商品组、交易组

那么对于每一个组来说,只需要专精好它们组的代码即可,有利于代码优化


微服务的劣势 

引入微服务,解决了人的问题,但与此同时也付出了一些代价

系统性能下降:拆出来更多的服务,多个功能之间要更依赖网络通信。网络通信的速度很可能是比硬盘慢的。

系统性能下降的解决方案:要想保证性能不下降太多,只能引入更多的机器,更多的硬件资源。幸运的是,随着硬件技术的发展,现在已经有了万兆网卡,万兆网卡的读写速度大概率是大于磁盘/硬盘的。但万兆网卡非常贵!

系统复杂程度提高,可用性受到影响的解决方案:服务器更多了,出现问题的概率就更大了,这就需要有一系列的手段,来保证系统的可用性(更丰富的监控报警,以及配套的运维人员)


微服务的优势 

微服务最主要的优势就是解决了"人"的问题

使用微服务,可以更方便于功能的复用!

微服务系统可以给不同的服务进行不同的部署,当某个服务模块使用频繁,那么我们可以给该模块配备更多的主机,更多的硬件资源。相反,则可以减少该模块配套的资源 


分布式名词概念 


常见名词 

应用/系统:一个应用,指的就是一个/一组服务器程序

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

分布式: 从物理上引入多个主机/服务器,协同配合完成一系列的工作

集群:从逻辑上引入多个主机/服务器,协同配合完成一系列的工作

注意:在实际工程中,基本上不会过于纠结分布式和集群的区别,一般视它们为等价

主(master)/从(slave):分布式中的一种比较典型的结构。多个服务器结点,其中一个是主,另外的是从。从节点的数据要从主节点这里同步过来

中间件:与业务无关的服务(功能更通用的服务),例如数据库、缓存、消息队列...


可用性

分布式系统的第一要务:可用性

计算分布式系统可用性:系统整体可用的时间 / 总的时间

例如一年365天,分布式系统正常工作360天,则可用性为 360 / 365

可用性越高越好


 性能指标

衡量服务器性能指标:响应时长

响应时长是指从客户端发起请求到收到完整响应的时间间隔。

响应时长越小越好,但不需要过度纠结这个指标,需要根据具体业务具体分析。例如有些业务处理逻辑要花费更多的时间,那么响应时长自然高。有些业务处理逻辑简单,花费时间少,响应时长自然低!

衡量服务器性能指标:吞吐和并发

这两是衡量系统的处理请求的能力,也就是衡量服务器性能的一种方式。

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

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

相关文章

微服务之松耦合

参考:https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html There’s actually two different types of coupling: runtime coupling - influences availability design-time coupling - influences…

pytest+request+yaml+allure搭建低编码调试门槛的接口自动化框架

接口自动化非常简单,大致分为以下几步: 准备入参调用接口拿到2中response,继续组装入参,调用下一个接口重复步骤3校验结果是否符合预期 一个优秀接口自动化框架的特点: 【编码门槛低】,又【能让新手学到…

基于Springboot + vue实现的文档管理系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

Pycharm连接远程解释器

这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径,并设置同步映射(1)配置服务器的系统环境(2)配置服务器的conda环境 4 进入到程序入口(main.py&#…

初学stm32 --- II2C_AT24C02,向EEPROM中读写数据

目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK(Acknowledge) 2. NACK(Not Acknowledge) IO口模拟II2C协议 发送起始信号: 发送停止信号: 检测应答信号: 发送应答信号&#x…

Excel 技巧07 - 如何计算到两个日期之间的工作日数?(★)如何排除节假日计算两个日期之间的工作日数?

本文讲了如何在Excel中计算两个日期之间的工作日数,以及如何排除节假日计算两个日期之间的工作日数。 1,如何计算到两个日期之间的工作日数? 其实就是利用 NETWORKDAYS.INTL 函数 - weekend: 1 - 星期六,星期日 2,如…

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们,技术图文创作很不容易…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》,让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识,顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话,可以看看博主的C语言专栏哟&#xff…

智能物流升级利器——SAIL-RK3576核心板AI边缘计算网关设计方案(一)

近年来,随着物流行业智能化和自动化水平不断提升,数据的实时处理与智能决策成为推动物流运输、仓储管理和配送优化的重要手段。传统的集中式云平台虽然具备强大计算能力,但高延迟和带宽限制往往制约了物流现场的即时响应。为此,我…

HTML拖拽功能(纯html5+JS实现)

1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…

【MySQL】简单解析一条SQL查询语句的执行过程

1. MySQL 的逻辑架构图 MySQL 架构主要分为 Server 层和存储引擎层。Server 层集成了连接器、查询缓存、分析器、优化器和执行器等核心组件&#xff0c;负责提供诸如日期、时间、数学和加密等内置函数&#xff0c;以及实现存储过程、触发器、视图等跨存储引擎的功能。存储引擎层…

如何将json字符串格式化

文章目录 如何对json字符串进行格式化显示hutool方案的示例和不足使用fastjson的方案 如何对json字符串进行格式化显示 将json字符串内容进行格式化的输出显示。本文介绍 hutool的方案和alibaba 的fastjson方案 hutool方案的示例和不足 引入依赖 <dependency><grou…

复杂 C++ 项目堆栈保留以及 eBPF 性能分析

在构建和维护复杂的 C 项目时&#xff0c;性能优化和内存管理是至关重要的。当我们面对性能瓶颈或内存泄露时&#xff0c;可以使用eBPF&#xff08;Extended Berkeley Packet Filter&#xff09;和 BCC&#xff08;BPF Compiler Collection&#xff09;工具来分析。如我们在Red…

unity学习18:unity里的 Debug.Log相关

目录 1 unity里的 Debug.log相关 2 用Debug.DrawLine 和 Debug.DrawRay画线 2.1 画线 1 unity里的 Debug.log相关 除了常用的 Debug.Log&#xff0c;还有另外2个 Debug.Log("Debug.Log"); Debug.LogWarning("Debug.LogWarning"); Debug.LogErro…

IoTDB 常见问题 QA 第三期

关于 IoTDB 的 Q & A IoTDB Q&A 第三期持续更新&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;查询最新值 & null 数据相加方…

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…

Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(上)

概述 Swift 语言是一门现代化、安全、强大且还算性感的语言。在去年 WWDC 24 中苹果正式推出了秃头码农们期待许久的 Swift 6.0&#xff0c;它进一步完善了 Swift 语言的语法和语义&#xff0c;并再接再厉——强化了现代化并发模型的安全性和灵活性。 这里我们不妨用 Swift 来…

C++ STL之容器介绍(vector、list、set、map)

1 STL基本概念 C有两大思想&#xff0c;面向对象和泛型编程。泛型编程指编写代码时不必指定具体的数据类型&#xff0c;而是使用模板来代替实际类型&#xff0c;这样编写的函数或类可以在之后应用于各种数据类型。而STL就是C泛型编程的一个杰出例子。STL&#xff08;Standard …

VUE3 + Ant Design Vue4 开发笔记

异常记录 [Vue warn]: Extraneous non-props attributes (options) were passed to component but could not be automatically inherited because component renders fragment or text root nodes 定位原因解决方法 错误的中文释义&#xff1a;[Vue 警告]&#xff1a;传递给…