【Redis前奏曲】初识分布式

文章目录

  • 一. 简单认识Redis
  • 二. 分布式系统
    • 1. 单机架构
    • 2. 应用服务和数据库服务分离
    • 3. 引入更多的应用服务器节点
    • 4. 数据库读写分离
    • 5. 多主机存储
    • 6. 微服务架构
  • 三.常见名词解释
    • 应用(Application)/系统(System)
    • 模块(Module)/组件(Component)
    • 分布式(Distributed)
    • 集群(Cluster)
    • 主(Master)/从(Slave)
    • 中间件(Middleware)
    • 可用性(Availability)
    • 响应时长(Response Time RT)
    • 吞吐(Throughput) vs并发(Concurrent)

一. 简单认识Redis

在这里插入图片描述
在Redis官网中,是这样介绍Redis的:
The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.
翻译为:
被数百万开发人员用作数据库、缓存、流媒体引擎和消息代理的开源内存数据存储

in-memory data:Redis是在内存中存储数据.
database:Redis可以作为数据库. 我们之前学过MySQL数据库,MySQL最大的问题在于它是在硬盘中存储数据,所以它比较慢.在很多网络产品中对于性能的要求是很高的.而Redis就可以作为数据库使用.由于Redis是在内存中存储数据的,所以它很快.但是与My
SQL相比,Redis的存储空间是有限的.如果我们的业务需要又大的存储空间有需要又快的访问速度,我们可以将MySQL和Redis结合使用.
cache:Redis用来做缓存.
streaming engine:Redis的初心,是用来做一个"消息中间件"的(消息队列).分布式系统下的生产者消费者模型.

Redis是在分布式系统中,发挥着很大的作用.如果只是单机程序,直接通过变量存储的方式,是比使用Redis更优的选择.

由于进程的隔离性.所以进程之间通信要用到网络.Redis就是基于网络,把自己内存中的变量共享给别的进程,甚至别的主机的进程进行使用.

二. 分布式系统

1. 单机架构

单机架构,也就是只有一台服务器,这个服务器负责所有的工作.
在这里插入图片描述
现在计算机硬件,发展速度非常之快.即使只有一台主机,这一台主机的性能也是很高的.可以支持非常高的并发和非常大的数据存储.
但是如果业务进一步增长,用户量和数据量都水涨船高,一台主机难以应付的时候,就需要引入更多的主机,引入更多的硬件资源.

一台主机的硬件资源是有上限的,比如: CPU,内存,硬盘,网络等…
服务器每次收到一个请求,都是需要消耗上述的一些资源.如果同一时刻,处理的请求多了,此时就可能会导致某个硬件资源,不够用了.
无论是哪个方面不够用了,都可能会导致服务器处理请求的时间变长,甚至于处理出错.

如果我们遇到了服务器不够用的场景,那我们应该怎么做呢?

  1. 开源.也就是添加更多的硬件资源
  2. 节流.在软件上优化.比如更改数据结构类型等.对程序员的要求比较高.

我们主要来说一下开源,虽然在一个主机上可以增加硬件资源,但是能够增加的硬件资源是有限的.这取决于主板的扩展能力.如果一台主机扩展到极致了,但是还不够,此时就只能引入多台主机了.同时也需要在软件商做对应的调整和适配. 一旦引入了多台主机,我们的系统就可以称之为"分布式系统"了.

2. 应用服务和数据库服务分离

在这里插入图片描述
上述应用服务器中,可能会包含很多的业务逻辑,可能会吃CPU和内存.
在**存储服务器(数据库服务器)**中,由于需要存储数据,则需要更大的硬盘空间以及更快的数据访问速度.我们可以配置更大硬盘的服务器,或者使用SSD硬盘.(固态硬盘)
调整上述以达到更高的性价比.

3. 引入更多的应用服务器节点

我们上述说到,应用服务器比较吃CPU和内存.如果把CPU或者内存吃没了,应用服务器就承受不住了.此时我们可以引入更多的应用服务器,来解决上述问题.
在这里插入图片描述
由于引入了更多的应用服务器节点,我们就需要一个负载均衡器来给应用服务器分配任务.所以用户的请求,先到达负载均衡器/网关服务器(单独的服务器),由负载均衡器分配任务给应用服务器让应用服务器去执行.

负载均衡器是有很多具体算法的,假设有1w个用户请求,有2个应用服务器.,此时按照负载均衡的方式,就可以让每个应用服务器承担5k的访问量.

有小伙伴会问:用户的所有请求都需要负载均衡器来分配任务,那不是它承担了所有的请求?它能承担的住吗?
负载均衡器,对于请求量的承担能力,是要远超过应用服务器的.(相当于负载均衡器是一个领导,负责分配任务,而应用服务器是组员,要去完成任务的.)但是也有可能请求量大到负载均衡器也承担不住了,此时我们就可以引入多个负载均衡器.(引入多个机房)

经过上述讨论,增加应用服务器,确实能够处理更高的请求量,但是随之存储服务器,要承担的请求量也就更多了.此时,我们可以:

  1. 开源(引入更多机器)
  2. 节流(门槛高,更复杂)

4. 数据库读写分离

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

数据库有一个天然的问题,响应速度慢.于是我们可以把数据区分"冷热",热点数据放到缓存中,缓存的访问速度比数据库要快很多.
在这里插入图片描述计算机的二八原则中:20%的数据能够支持80%的访问量,所以我们可以将20%的数据放在缓存中以提高查询的效率.

5. 多主机存储

引入分布式系统,不光能够去应对更高的请求量(并发量),同时也要能应对更大的数据量.
有可能会出现,一台服务器已经存储不下数据了,此时就需要多台主机来存储.
在这里插入图片描述
针对数据库进行进一步的拆分,分库分表.
本来一个数据库服务器,这个数据库服务器上有多个数据库,现在就可以引入多个数据库服务器,每个数据库服务器存储一个或者一部分数据库.(分库)
如果一个表特别大,大到一台主机也存不下,就可以针对表进行拆分(分表)

6. 微服务架构

之前应用服务器,一个服务器中做了很多的业务,这就可能导致一个服务器的代码变得越来越复杂.为了方便于代码的维护,就可以将这样一个复杂的服务器,拆分成更多的,功能更单一,更小的服务器.(微服务)
在这里插入图片描述
由于引入了更多的服务器,导致服务器的种类和数量就增加了,那么应用服务器就复杂了,就需要更多的人去维护了.

总的来说,微服务的优缺点如下:

优点:

  1. 高度可扩展性:微服务架构将应用程序拆分成多个小型服务,每个服务都可以独立部署和扩展,从而提高了整体系统的可扩展性。
  2. 独立性:每个微服务都是独立的部分,由团队负责开发、测试和部署,这种独立性可以提高团队的效率和生产力。
  3. 灵活性:由于微服务之间是松耦合的,可以更容易地添加或删除服务,从而实现更快速的迭代和创新。
  4. 技术异构性:微服务架构允许使用不同的编程语言和技术来构建不同的服务,从而提高了灵活性和适应性。
  5. 可维护性:由于每个微服务都是独立的,可以更轻松地进行维护和升级,而不会影响整个系统。

缺点:

  1. 复杂性:微服务架构需要管理多个服务之间的通信和数据传输,这样就增加了系统的复杂性和技术难度。
  2. 分布式系统的挑战:微服务架构需要处理分布式系统的挑战,如服务发现、负载均衡、故障恢复等,这需要额外的开发和管理工作。
  3. 测试的挑战:由于每个微服务都是独立的,测试也需要进行单独的测试,增加了测试的复杂性和成本。
  4. 部署的挑战:微服务架构需要管理多个服务的部署和版本控制,这需要额外的管理和自动化工作。
  5. 性能问题:由于微服务之间需要通过网络进行通信和数据传输,可能会出现性能问题,需要进行优化和调整。

三.常见名词解释

应用(Application)/系统(System)

一个应用,就是一个/组服务器程序

模块(Module)/组件(Component)

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

分布式(Distributed)

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

集群(Cluster)

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

主(Master)/从(Slave)

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

中间件(Middleware)

和业务无关的服务(功能更通用的服务)
比如:数据库,缓存,消息队列…

可用性(Availability)

系统整体可用的时间/总的时间
比如一年中有360天服务器可以正常工作.则360 / 365 =>可用性

响应时长(Response Time RT)

衡量服务器的性能
和具体服务器要做的业务密切相关
越小越好

吞吐(Throughput) vs并发(Concurrent)

衡量系统的处理请求的能力.衡量性能的一种方式

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

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

相关文章

【HR非技术问题面试篇】你怎么看待加班?

你对加班怎么看待? 😊老油条经典回答系列 😊老油条经典回答系列 这种问题,怎么回答都可以,我觉得重要的实时表达你自己。如果你就不想加班,也没必要勉强说自己爱加班,结果入职之后干的不开心。 不过&…

操作系统 全整理

第一章 第二章 进程控制 原语 进程创建 进程终止 进程阻塞和唤醒 进程切换 进程通信 共享数据空间 略过 消息传递 以格式化的消息通过发送、接收消息原语来进行数据交换 管道通信 什么是线程? 线程的实现方式 线程模型是由 线程的状态与转换 进程调度 高级调…

引领企业人工智慧转型的 5 个可行策略

人工智能的最新进展引发了企业AI转型,其规模、速度和不确定性程度都是巨大的。那些敢于大胆行动、走在时代前沿的企业,将能够抓住人工智能在几乎每个行业中带来的巨大增长和价值创造机会。这样做需要他们的领导人掌握人工智能作为二十一世纪通用技术的深…

网易有道词典不能截屏翻译,不能联网解决办法

对应版本: win10系统,联想拯救者笔记本,网易有道词典8.10.2.0。 网易有道词典免费下载链接:https://download.csdn.net/download/qq_42755734/88684985 修改代理: youdao.com 0 取消勾选---不更新 效果&#xff1a…

八. 实战:CUDA-BEVFusion部署分析-环境搭建

目录 前言0. 简述1. CUDA-BEVFusion浅析2. CUDA-BEVFusion环境配置2.1 简述2.2 源码下载2.3 模型数据下载2.4 基础软件安装2.5 protobuf安装2.5.1 apt 方式安装2.5.2 源码方式安装 2.6 编译运行2.6.1 配置 environment.sh2.6.2 利用TensorRT构建模型2.6.3 编译运行程序 2.7 拓展…

【SpringBoot】常用注解

RequestBody:自动将请求体中的 json 数据转换为实体类对象。 这个例子凑巧传入的json属性键名和User键名一致,可以直接使用User实体类对象,如果键名不一致则需要用一个Map 类接收参数: PutMapping("/update")public R…

我在 VSCode 插件里接入了 ChatGPT,解决了Bug无法定位的难题

作为一名软件开发者,我时常面临着代码中Bug的定位和解决问题。这个过程往往既费时又充满挑战。然而,最近我在我的VSCode插件中接入了ChatGPT,这个决定彻底改变了我处理Bug的方式。 Bug:开发者的噩梦 在开发过程中,遇…

HarmonyOS 组件通用属性之通用事件 文档参数讲解(点击事件)

我们组件中 会有很多通用的信息和方法 那么 首先 我们看通用事件 通用事件中 最常用的就是我们的点击事件 比如说 我们之前常写的 组件.onClick(()>{//事件逻辑 })但是 我们之前 都没有用它接参数 我们可以这样 Button("跳转").onClick((ewat: ClickEvent)>…

Gitee触发Jenkins403讨逆猴子-解决方案

Jenkins报:403 No valid crumb was included in the request 具体解决方案如下: 执行如下脚本内容: hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION true成功后: Gitee再次测试&#xff1a…

统信系统常见问题解决方法

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 背景说明 本文所说的问题,是基于浪潮统信UOS的环境存在的问题。 一、WPS新建文档默认保存格式不对 解决办法: 1.编辑/opt/apps/cn.wps.wps-office-pro/files/kingsoft/wps-office/…

ArkTS基本概念装饰器

目录 ArkTS基本概念 装饰器汇总 ArkTS基本概念 ArkTS是HarmonyOS的主力应用开发语言。 它在TypeScript(简称TS)的基础上,匹配ArkUI框架,扩展了声明式UI、状态管理等相应的能力,让开发者以更简洁、更自然的方式开发跨…

Idea如何从磁盘中应用 下载好的插件流程,安装zip压缩包。

1、将下载的插件文件(通常是一个ZIP文件)复制到IntelliJ IDEA的“plugins”文件夹中。 IDEA版本 2、重启IntelliJ IDEA。 3、在设置窗口中,选择左侧的“Plugins”。 4、选择之前复制到“plugins”文件夹中的插件文件,点击“OK”按…