【redis初阶】浅谈分布式系统

目录

一、常见概念

1.1 基本概念

2.2 评价指标(Metric)

二、架构演进

2.1 单机架构

2.2 应用数据分离架构

2.3 应用服务集群架构

2.4 读写分离/主从分离架构

2.5 引入缓存 ⸺ 冷热分离架构

2.6 数据库分库分表

2.7 业务拆分 ⸺ 引入微服务


redis学习🥳

一、常见概念

在正式引入架构演进之前,为避免读者对架构中的概念完全不了解导致低效沟通,优先对其中一些比

较重要的概念做前置介绍:

1.1 基本概念

应用(Application)/ 系统(System)

为了完成一整套服务的一个程序或者一组相互配合的程序群。生活例子类比:为了完成一项任务,而

搭建的由一个人或者一群相互配的人组成的团队。

模块(Module)/ 组件(Component)

当应用较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于理

解。生活例子类比:军队中为了进行某据点的攻克,将人员分为突击小组、爆破小组、掩护小组、通

信小组等。

分布式(Distributed)

系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与数据

库分别工作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。生活例子类比:为

了更好的满足现实需要,一个在同一个办公场地的工作小组被分散到多个城市的不同工作场地中进行

远程配合工作完成目标。跨主机之间的模块之间的通信基本要借助网络支撑完成。

集群(Cluster)

被部署于多台服务器上的、为了实现特定目标的一个/组特定的组件,整个整体被称为集群。比如多个

MySQL 工作在不同服务器上,共同提供数据库服务目标,可以被称为一组数据库集群。生活例子类

比:为了解决军队攻克防守坚固的大城市的作战目标,指挥部将大批炮兵部队集中起来形成一个炮兵

打击集群。

分布式 vs 集群。通常不用太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即工作

在不同服务器上并且通过网络通信配合完成任务;而集群更在意逻辑形态,即是否为了完成特定服务

目标。

主(Master)/ 从(Slave)

集群中,通常有一个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。比如

MySQL 集群中,只有其中一台服务器上数据库允许进行数据的写入(增/删/改),其他数据库的数据

修改全部要从这台数据库同步而来,则把那台数据库称为主库,其他数据库称为从库。

中间件(Middleware)

一类提供不同应用程序用于相互通信的软件,即处于不同技术、工具和数据库之间的桥梁。生活例子

类比:一家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变大,成立一个采购部,由采购

部专职于采买业务,称为厨房和菜市场之间的桥梁。

2.2 评价指标(Metric)

可用性(Availability)

考察单位时间段内,系统可以正常提供服务的概率/期望。例如:年化系统可用性 = 系统正常提供服务

时长 / 一年总时长。这里暗含着一个指标,即如何评价系统提供无法是否正常,我们就不深入了。平时

我们常说的 4 个 9 即系统可以提供99.99% 的可用性,5 个 9 是 99.999% 的可用性,以此类推。我

们平时只是用高可用(High Availability HA)这个非量化目标简要表达我们系统的追求。

响应时长(Response Time RT)

指用户完成输入到系统给出用户反应的时长。例如点外卖业务的响应时长= 拿到外卖的时刻 - 完成点单

的时刻。通常我们需要衡量的是最长响应时长、平均响应时长和中位数响应时长。这个指标原则上是

越小越好,但很多情况下由于实现的限制,需要根据实际情况具体判断

吞吐(Throughput)vs 并发(Concurrent)

吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指系统同一时刻支持的请求最高量。

例如一条辆车道高速公路,一分钟可以通过 20 辆车,则并发是 2,一分钟的吞吐量是 20。实践中,

并发量往往无法直接获取,很多时候都是用极短的时间段(比如 1 秒)的吞吐量做代替。我们平时用

高并发(Hight Concurrnet)这个非量化目标简要表达系统的追求。

二、架构演进

2.1 单机架构

初期,我们需要利用我们精干的技术团队,快速将业务系统投入市场进行检验,并且可以迅速响应变

化要求。但好在前期用户访问量很少,没有对我们的性能、安全等提出很高的要求,而且系统架构简

单,无需专业的运维团队,所以选择单机架构是合适的。

用户在浏览器中输入www.bit.com,首先经过 DNS 服务将域名解析成 IP 地址 10.102.41.1,随后浏览器访问该 IP 对应的应用服务。

相关软件

Web 服务器软件:Tomcat、Netty、Nginx、Apache 等

数据库软件:MySQL、Oracle、PostgreSQL、SQL Server 等

简单来说:就是将一个项目的应用以及数据库服务部署在一台主机上,并且这台主机完全可以满足用户请求;

2.2 应用数据分离架构

随着系统的上线,我们不出意外地获得了成功。市场上出现了一批忠实于我们的用户,使得系统的访

问量逐步上升,逐渐逼近了硬件资源的极限,同时团队也在此期间积累了对业务流程的一批经验。面对当前的性能压力,我们需要未雨绸缪去进行系统重构、架构挑战,以提升系统的承载能力。但由于

预算仍然很紧张,我们选择了将应用和数据分离的做法,可以最小代价的提升系统的承载能力。

和之前架构的主要区别在于将数据库服务独立部署在同一个数据中心的其他服务器上,应用服务通过

网络访问数据。

简单来说:就是将一个项目的应用以及数据库服务分别部署在不同的主机上,并且被部署的主机根据部署的应用配置不同的资源,比如:部署应用服务的主机cpu性能好,部署数据库服务的主机存储容量多;

2.3 应用服务集群架构

我们的系统受到了用户的欢迎,并且出现了爆款,单台应用服务器已经无法满足需求了。我们的单机

应用服务器首先遇到了瓶颈,摆在我们技术团队面前的有两种方案,大家针对方案的优劣展示了热烈

的讨论:

  • 垂直扩展/纵向扩展 Scale Up。通过购买性能更优、价格更高的应用服务器来应对更多的流量。这种方案的优势在于完全不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增长关系是非线性的,意味着选择性能 2 倍的硬件可能需要花费超过 4 倍的价格,其次硬件性能提升是有明显上限的。
  • 水平扩展/横向扩展 Scale Out。通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。这种方案的优势在于成本相对较低,并且提升的上限空间也很大。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验。

经过团队的学习、调研和讨论,最终选择了水平扩展的方案,来解决该问题,但这需要引入一个新的

组件 ⸺ 负载均衡:为了解决用户流量向哪台应用服务器分发的问题,需要一个专门的系统组件做流

量分发。实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中。同时流量调

度算法也有很多种,这里简单介绍几种较为常见的:

  • Round-Robin 轮询算法。即非常公平地将请求依次分给不同的应用服务器。
  • Weight-Round-Robin 轮询算法。为不同的服务器(比如性能不同)赋予不同的权(weight),能者多劳。
  • 一致哈希散列算法。通过计算用户的特征值(比如 IP 地址)得到哈希值,根据哈希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。也就是我们平时遇到的专项客户经理服务。

相关软件

负载均衡软件:Nginx、HAProxy、LVS、F5 等

2.4 读写分离/主从分离架构

上一节提到,我们把用户的请求通过负载均衡分发到不同的应用服务器之后,可以并行处理了,并且

可以随着业务的增长,可以动态扩张服务器的数量来缓解压力。但是现在的架构里,无论扩展多少台

服务器,这些请求最终都会从数据库读写数据,到一定程度之后,数据的压力称为系统承载能力的瓶

颈点。我们可以像扩展应用服务器一样扩展数据库服务器么?答案是否定的,因为数据库服务有其特

殊性:如果将数据分散到各台服务器之后,数据的一致性将无法得到保障。所谓数据的一致性,此处

是指:针对同一个系统,无论何时何地,我们都应该看到一个始终维持统一的数据。想象一下,银行

管理的账户金额,如果收到一笔转账之后,一份数据库的数据修改了,但另外的数据库没有修改,则

用户得到的存款金额将是错误的。

我们采用的解决办法是这样的,保留一个主要的数据库作为写入数据库,其他的数据库作为从属数据

库。从库的所有数据全部来自主库的数据,经过同步后,从库可以维护着与主库一致的数据。然后为

了分担数据库的压力,我们可以将写数据请求全部交给主库处理,但读请求分散到各个从库中。由于

大部分的系统中,读写请求都是不成比例的,例如 100 次读 1 次写,所以只要将读请求由各个从库分

担之后,数据库的压力就没有那么大了。当然这个过程不是无代价的,主库到从库的数据同步其实是

由时间成本的,但这个问题我们暂时不做进一步探讨。

应用中需要对读写请求做分离处理,所以可以利用一些数据库中间件,将请求分离的职责托管出去。

相关软件

MyCat、TDDL、Amoeba、Cobar 等类似数据库中间件等

2.5 引入缓存 ⸺ 冷热分离架构

随着访问量继续增加,发现业务中一些数据的读取频率远大于其他数据的读取频率。我们把这部分数

据称为热点数据,与之相对应的是冷数据。针对热数据,为了提升其读取的响应时间,可以增加本地

缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的 html 页面等。通过缓存能把绝大多

数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用memcached作为本

地缓存,使用 Redis 作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集

中失效等问题。

相关软件:

Memcached、Redis 等缓存软件

2.6 数据库分库分表

随着业务的数据量增大,大量的数据存储在同一个库中已经显得有些力不从心了,所以可以按照业

务,将数据分别存储。比如针对评论数据,可以按照商品ID进行hash,路由到对应的表中存储;针对

支付记录,可以按小时创建表,每个小时表继续拆分为小表,使用用户ID或记录编号来路由数据。只

要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过

水平扩展的方式来提高性能。其中前面提到的Mycat也支持在大表拆分为小表情况下的访问控制。这种

做法显著的增加了数据库运维的难度,对DBA的要求较高。数据库设计到这种结构时,已经可以称为

分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来

实现的,如分库分表的管理和请求分发,由Mycat实现,SQL的解析由单机的数据库实现,读写分离可

能由网关和消息队列来实现,查询结果的汇总可能由数据库接口层来实现等等,这种架构其实是MPP

(大规模并行处理)架构的一类实现。

相关软件

Greenplum、TiDB、Postgresql XC、HAWQ等,商用的如南大通用的GBase、睿帆科技的雪球DB、

华为的LibrA 等

2.7 业务拆分 ⸺ 引入微服务

随着人员增加,业务发展,我们将业务分给不同的开发团队去维护,每个团队独立实现自己的微服

务,然后互相之间对数据的直接访问进行隔离,可以利用 Gateway、消息总线等技术,实现相互之

间的调用关联。甚至可以把一些类似用户管理、安全管理、数据采集等业务提成公共服务。

redis学习打卡🥳

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

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

相关文章

【Linux】文件 文件描述符fd

🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 🌻个人主页:路飞雪吖~ 一、C文件接口 🌟写文件 🌠小贴士: 🌠stdin && stdout && stderr Linux下…

uni-app如何引入echarts

在uni-app官网的官网插件中找echarts 打开图片对应的echarts&#xff0c;点击下载并导入插件 如果是vue3使用const echarts require(../../uni_modules/lime-echart/static/echarts.min);引入echarts <template><view><view style"width:750rpx; height:…

ue5 GAS 从零开始00

技能属性GAS 技能 属性 创建一个项目c 插件搜索 gameplay 保证这里勾选上 把这三个弄上去 “GameplayAbilities”,“GameplayTags”,“GameplayTasks” 这样就加载了三个模块 一定要先关ue 先关掉ue 生成 如果没编过&#xff0c;你就检查模块名字是不是没写对 一定要…

基于SpirngBoot的家电销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Redis之秒杀活动

目录 全局唯一ID&#xff1a; 为什么 count 不可能为 null&#xff1f; 为什么返回值是 timestamp << COUNT_BITS | count&#xff1f; 整体的逻辑 (1) 生成时间戳 (2) 生成序列号 (3) 拼接时间戳和序列号 超卖问题&#xff1a; 基于版本号的乐观锁 CAS思想 …

Linux环境(Ubuntu)上搭建MQTT服务器(EMQX )网络环境部署

支持的 Ubuntu 版本&#xff1a;Ubuntu 22.04(本人使用)、Ubuntu 20.04、Ubuntu 1 下面开始环境搭建&#xff1a; &#xff08;1&#xff09;从github在线地址克隆压缩包&#xff0c;然后进行压缩&#xff08;不好用&#xff09;&#xff0c;在对环境进行依赖包的下载 &…

JavaSE(十五)——认识进程与多线程入门

文章目录 认识进程进程的概念进程的特性进程的状态进程的优先级进程的描述进程的调度 并发与并行认识线程线程的概念Java中线程的表示认识Thread类线程的创建 线程的控制和管理线程启动-start()线程休眠-sleep()线程中断-interrupt()线程插队-join()线程让步-yield() 线程的状态…

EasyCVR视频汇聚平台如何配置webrtc播放地址?

EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持多协议接入&#xff0c;能将接入到视频流转码为多格式进行分发&#xff0c;包括RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、W…

【免费开源】积木JimuBI大屏集成ruoyiVue

JimuBI介绍 JimuBI 是一个JAVA语言的低代码数据可视化大屏BI产品&#xff0c;将大屏、仪表盘、移动面板、图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 这是JeecgBoot团队出品的另外一款报表产品&#xff0c;积木报表已经成为业内报表首先&#x…

mysql binlog 日志分析查找

文章目录 前言一、分析 binlog 内容二、编写脚本结果总结 前言 高效快捷分析 mysql binlog 日志文件。 mysql binlog 文件很大 怎么快速通过关键字查找内容 一、分析 binlog 内容 通过 mysqlbinlog 命令可以看到 binlog 解析之后的大概样子 二、编写脚本 编写脚本 search_…

如何在谷歌浏览器中使用安全沙箱

谷歌浏览器的沙箱机制是一种重要的安全功能&#xff0c;可以有效隔离浏览会话中的每个标签页和插件&#xff0c;以防止恶意软件攻击用户系统。本文将详细介绍如何在谷歌浏览器中启用和使用沙箱功能。 一、什么是谷歌浏览器沙箱&#xff1f; 谷歌浏览器的沙箱是一种安全机制&am…

【C++】C++11(二)

目录 九、可变参数模板十、lambda表达式10.1 C98中的一个例子10.2 lambda表达式10.3 lambda表达式语法10.3.1 lambda表达式各部分说明10.3.2 捕获列表说明 10.4 函数对象与lambda表达式 十一、包装器11.1 function包装器11.2 bind 十二、线程库12.1 线程12.1.1 thread类的简单介…

《零基础Go语言算法实战》【题目 1-16】字符串的遍历与比较

《零基础Go语言算法实战》 【题目 1-16】字符串的遍历与比较 给出两个字符串&#xff0c;请编写程序以确定能否将其中一个字符串重新排列后变成另一个字符串&#xff0c; 并规定大小写是不同的字符&#xff0c;空格也作为字符考虑。保证两个字符串的长度小于或等于 5000。 …

Type-C单口便携显示器-LDR6021

Type-C单口便携显示器是一种新兴的显示设备&#xff0c;它凭借其便携性、高性能和广泛的应用场景等优势&#xff0c;正在成为市场的新宠。以下是Type-C单口便携显示器的具体运用方式&#xff1a; 一、连接与传输 1. **设备连接**&#xff1a;Type-C单口便携显示器通过Type-C接…

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…

玩转 JMeter:Random Order Controller让测试“乱”出花样

嘿&#xff0c;各位性能测试的小伙伴们&#xff01;今天咱要来唠唠 JMeter 里超级有趣又超实用的 Random Order Controller&#xff08;随机顺序控制器&#xff09;&#xff0c;它就像是性能测试这场大戏里的“魔术棒”&#xff0c;轻轻一挥&#xff0c;就能让测试场景变得千变…

L1G5000 XTuner 微调个人小助手认知

使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知 1 环境配置与数据准备步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境步骤 1. 安装 XTuner 修改提供的数据步骤 0. 创建一个新的文件夹用于存储微调数据步骤 1. 创建修改脚本步骤 2. 执行脚本步骤 3. 查看数据…

UE5 使用内置组件进行网格切割

UE引擎非常强大&#xff0c;直接内置了网格切割功能并封装为蓝图节点&#xff0c;这项功能在UE4中就存在&#xff0c;并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型&#xff0c;需要配置一些参数。以UE5…

springmvc执行分析

步骤分析 1.浏览器客户端携带请求路径&#xff0c;本案例中是“/hello”&#xff0c;通过 web.xml 中的前端控制器配置&#xff0c;发送请求到前端控制器(DispatcherServlet)&#xff0c;并加载 SpringMVC.xml 配置文件&#xff0c;将 HelloController 加载进IOC容器当中&…

LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型&#xff0c;包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型&#xff0c;支持…