【redis】数据量庞大时的应对策略

文章目录

  • 为什么数据量多了主机会崩
  • 分布式系统
  • 应用数据分离架构
  • 应用服务集群架构
    • 负载均衡器
    • 数据库读写分离
  • 引入缓存
    • 冷热分离架构
  • 分库
  • 分表
  • 微服务
    • 是什么
    • 代价
    • 优势

为什么数据量多了主机会崩

一台主机的硬件资源是有上限的,包括但不限于一下几种:

  • CPU
  • 内存
  • 硬盘
  • 网络

  • 服务器每次收到一个请求,都是需要消耗上述的一些资源的~~
    如果同一时刻处理的请求多了,此时就可能会导致某个硬件资源不够用了,无论是那个方面不够用了,都可能会导致服务器处理请求的时间变长,甚至于处理出错

如果我们真的遇到了这样的服务器不够用的场景,我们可以:

  1. 开源
  • 简单粗暴,直接增加更多的硬件资源(什么不够补什么)
  • 不过一个主机上面能增加的硬件资源也是有限的,取决于主板的扩展能力
  1. 节流(软件上优化)
  • 针对程序进行优化,优化代码(各凭本事)
  • 通过性能测试,找到是哪个环节出现了瓶颈,再对症下药
  • 操作起来很难!对程序员的水平要求比较高

分布式系统

当一台主机扩展到极限了,但是还不够,就只能引入多台主机了

但不是说买来的新的机器直接就可以解决问题,也需要软件上做出对应的调整和适配。当引入多台主机了,我们的系统就可以称为“分布式系统”了

引入分布式系统万不得已的,系统的复杂程度会大大大提高(指数增长),这样出现 bug 的概率就越高、加班的概率就越大、丢失年终奖的概率也随之提高

应用数据分离架构

|516

  • 之前应用服务和数据库服务部署在一个服务器上,意味着这一份硬件资源要给两人用
  • 现在各用各的,还可以针对两种服务器的特点,配置不同的主机
    • 应用服务器,里面可能包含很多的业务逻辑,可能会很吃 CPU 和内存。就给其配置 CPU 配置高、内存大的主机
    • 存储服务器,最主要的就是需要更大的硬盘空间、更快的数据访问速度。就给其配置更大硬盘的服务器,甚至还可以上 SSD 硬盘(固态硬盘)

分离了之后,能一定程度上的解决硬件资源不够用的问题。但是如果随着请求量进一步增加、数据量进一步增加,我们就需要进一步地增加硬件资源、调整服务器的结构

应用服务集群架构

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


应用服务器可能会比较迟 CPU 和内存。如果把 CPU 和内存吃没了,此时应用服务器就顶不住了

此时引入更多的应用服务器,就可以有效解决上述问题

  • 相当于是有了更多的 CPU 和硬件资源 image.png|394

负载均衡器

  • 用户的请求先到“负载均衡器/网关服务器”(单独的服务器)这里,然后由其对这个请求进行分发
    • 现在我们有多个应用服务器了(图中是俩,实际上可能是多个),每个应用服务器都是能单独完成整个业务逻辑的,
    • 此时引入多个应用服务器之后,就可以让每个应用服务器承担整体请求中的一部分
    • 负载均衡器就像公司的一个组的领导一样,要负责管理,负责把任务分配给每个组员

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

[!quote] 负载均衡器

  • 负载均衡器就像公司的一个组的领导一样,要负责管理,负责把任务分配给每个组员
  • 其内部有很多的“负载均衡”具体的算法

此时应用服务器的压力变小了,但“负载均衡器”不是一人承担了所有请求吗?他不会崩吗?

  • 负载均衡器对于请求量的承担能力要远远超过应用服务器
    • 负载均衡器是领导,他的职责是分配工作
    • 应用服务器是组员,他的职责是执行任务
  • 执行一个任务所花的时间远远超出分配一个工作所花的时间,所以负载均衡器消耗的硬件资源是很少的

当请求量大到负载均衡器也扛不住的时候,只需要引入更多的负载均衡器(引入多个机房)就可以了


如上面讨论,增加应用服务器,确实能够处理更高的请求量,但是随之存储服务器要承担的请求量也就更多了,此时仍是两个办法:

  1. 开源,引入更多的机器,数据库读写分离
  2. 节流,门槛高

数据库读写分离

image.png|520

  • 在这个图里可以看到,存储服务器变成两台了(实际上可能有更多台)
  • 主数据库(master),只负责
  • 从数据库(slave),只负责。是主数据库的“跟班”,这个数据库中的数据要从主数据库中进行同步
  • 应用服务器需要,就从“从数据库”中去读。需要,就从“主数据库”中去写

这样就把每一台机器的压力降低了。在实际的应用场景中,读的频率是比写要高的

主服务器一般是一个,从服务器可以有多个(一主多从),同时从数据库通过负载均衡的方式,让应用服务器进行访问

引入缓存

冷热分离架构

数据库天然有个问题——响应速度比较慢。所以将数据区分“冷热”,热点数据放到缓存中,缓存的访问速度往往要比数据库要快很多

image.png|608

  • 缓存中只是放一小部分热点数据(会频繁被访问到的数据)
  • 数据库里面存储的仍然是全量数据,只是相比之下热点数据会被放在缓存
  • 二八原则,20% 的数据能支持 80% 的访问量,更极端的情况能到一九

后续应用服务器在读取数据的时候,就可以先读缓存,如果这个数据在缓存中存在,就不需要读数据库中的数据了;如果不存在,就再去读数据库。由于二八原则,所以大部分的访问都可以直接在缓存中找到答案

  • 这样数据库的压力又进一步降低了
  • 同时缓存读的又快,又节约了时间
  • 此时就相当与缓存服务器在帮助数据库服务器负重前行

分库

引入分布式系统有两个方面:

  1. 应对更高的请求量(并发量)
  2. 应对更大的数据量

虽然一个服务器存储的数据量可以达到几十个 TB,但是仍然会存在一台主机存不下数据的情况。当出现这样的情况时,我们就需要多台主机来存储

image.png|468

  • 针对数据库进行进一步拆分==>分库分表,本来一个数据库服务器,这个数据库服务器上有多个数据库(指的是逻辑上的数据集合,create database 创建的那个东西)
  • 现在就可以引入多个数据库服务器,每个数据库服务器存储一个或者一部分数据库
    • 将不同的表分到不同的机器上

分表

如果某个表非常大,大到一台主机存不下,也可以针对表进行拆分

  • 将一张表拆成五张表,用五个服务器去存储,每个服务器都存储原表中的一部分
  • 这样的话我们引入的存储空间就更多了

具体分库分表如何实践,还是要结合实际的业务场景来开展

微服务

是什么

上面已经演化出了一个比较复杂的分布式系统,可以处理更多的请求,同时可以存储更多的数据。但是这样的演化远远不是终点。在实际工作中还会对应用服务器做进一步的拆分

  • 当应用服务器中要做的功能太多、太复杂,就需要将应用服务器拆成更多的部分
  • 每一部分只负责其中的一小部分功能
    image.png
    之前应用服务器,一个服务器里面做了很多的业务,这就可能会导致这一个服务器的代码变得越来越复杂。为了更方便于代码的维护,就可以把这样的一个复杂的服务器,拆分成更多单一的,但是更小的服务器==>微服务
  • 服务器的种类和数量就增加了
  • 每组服务器都有各自的存储集群和缓存模块

注意:微服务本质上是在解决“人”的问题
当应用服务器复杂了,势必就需要更多的人来维护,当人变多了,就需要配套的管理,把这些人组织好

  • 划分组织结构,分成多个组
  • 每个组分配领导进行管理
  • 分成多个组就需要进分工

代价

引入微服务,解决了人的问题,但是付出的代价:

  1. 整个系统的性能会下降

原本用户、商品、交易这些模块都是直接在进程内相互调用的。而现在需要通过网络,进行跨主机通信

  • 网络通信比进程内调用慢太多太多了
  • 访问最快的是 CPU、其次内存、才到硬盘,硬盘本身就比内存慢很多了

拆出更多的服务,多个功能之间要更依赖网络通信,而网络通信的速度可能比硬盘还要慢,这样系统的性能就会下降很多

  • 想要保证性能不下降太多,只能引入更多的机器,更多的硬件资源(充钱,大厂不差钱)

幸运的是,由于硬件技术的发展,网卡现在有“万兆网卡”,读写速度已经能超过硬盘读写了,这样才导致微服务的通信操作不至于“太慢”

  • 不过就一个字——
  • 万兆网卡还需要配上万兆路由器、万兆交换机,甚至是能支持万兆带宽的网线…
    所以,这些就不是一些中小公司折腾的起的,还是只有一些大厂能玩得转
  1. 系统复杂程度提高,可用性受到影响

服务器更多了,出现问题的概率就更大了,这就需要一系列的手段,来保证系统的可用性

  • 更丰富的监控报警机制
  • 配套的运维人员

优势

  1. 解决了人的问题

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

比如电商系统里面的用户模块,可能在很多模块中多需要用到,那我们就将其单独提取出来,给其他模块来调用


  1. 可以给不同的服务进行不同的部署

有的模块对于请求量/数据量处理的不是很多,我们就给它少部署一点机器;有些重点的、负载量大的模块,我们就可以配置更好的机器

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

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

相关文章

【Postgresql】地理空间数据的存储与查询,查询效率优化策略,数据类型与查询速度的影响

注:使用postgresql数据库会用到PostGIS 扩展。 一、安装PostGIS 扩展 在 PostgreSQL 中遇到错误 “type geography does not exist” 通常意味着你的 PostgreSQL 数据库还没有安装 PostGIS 扩展,或者 PostGIS 扩展没有被正确地安装在你的数据库中。geo…

我司使用了两年的高效日志打印工具,非常牛逼!

为了更方便地排查问题,电商交易系统的日志中需要记录用户id和订单id等字段。然而,每次打印日志都需要手动设置用户id,这一过程非常繁琐,需要想个办法优化下。 log.warn("user:{}, orderId:{} 订单提单成功",userId, or…

linux服务器之top命令详解

top:系统资源管理器 top命令类似于windows的任务管理器,可以查看内存、cpu、进程等信息(动态查看系统资源信息)在linux系统中常用top命令查看资源性能分析工具 一、参数释义: 第一行 系统时间和平均负载 top:名称22:12:46&#…

Spring Boot 部署方案!打包 + Shell 脚本详解

本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作; profiles指定不同环境的配置 maven-assembly-plugin打发布压缩包 分享shenniu_publish.sh程序启动工具 linux上使用shenniu_p…

一文梳理RAG(检索增强生成)的现状与挑战

一 RAG简介 大模型相较于过去的语言模型具备更加强大的能力,但在实际应用中,例如在准确性、知识更新速度和答案透明度方面,仍存在不少问题,比如典型的幻觉现象。因此,检索增强生成 (Retrieval-Augmented Generation, …

哪种超声波清洗机效果好?较好的超声波眼镜清洗机品牌推荐

作为一名拥有20年戴镜经验的眼镜爱好者,我深深体会到眼镜清洁的挑战:微小缝隙里的污垢难以触及,频繁的脏污让我苦于找不到清洁时机,而用力不当的擦拭方法更是可能对眼镜特别是镜片造成伤害,这确实让人感到苦恼&#xf…

Java专栏介绍

专栏导读 在当今这个技术飞速发展的时代,Java作为一门成熟且广泛应用的编程语言,一直是软件开发领域的中坚力量。本“Java技术”专栏旨在帮助读者深入理解Java编程语言的精髓,掌握其核心概念与高级特性,并通过实战案例提升编程技…

字符编码转换

文章目录 1. 背景2. 解决方案3. 编码转换实现3.1 shell实现3.2 python实现3.3 开源工具实现 4. 常见中文字符编码介绍4.1 字符编码解决什么问题4.2 常见的中文字符编码4.3 常见中文字符编码关系4.4 unicide字符集与utf-8 1. 背景 在团队合作开发中,经常发现组员的代…

Redis安装步骤——离线安装与在线安装详解

Linux环境下Redis的离线安装与在线安装详细步骤 环境信息一、离线安装1、安装环境2、下载redis安装包3、上传到服务器并解压4、编译redis5、安装redis6、配置redis(基础配置)7、启动redis8、本机访问redis9、远程访问redis 二、在线安装1、更新yum源2、安…

k8s 高级调度

搞懂Kubernetes调度 K8S调度器Kube-schduler的主要作用是将新创建的Pod调度到集群中的合适节点上运行。kube-scheduler的调度算法非常灵活,可以根据不同的需求进行自定义配置,比如资源限制、亲和性和反亲和性等。 kube-scheduler的工作原理如下&#x…

基于SpringBoot+Vue+MySQL的宿舍维修管理系统

系统展示 前台界面 管理员界面 维修员界面 学生界面 系统背景 在当今高校后勤管理的日益精细化与智能化背景下,宿舍维修管理系统作为提升校园生活品质、优化资源配置的关键环节,其重要性日益凸显。随着学生规模的扩大及住宿条件的不断提升,宿…

Qt/C++ 个人开源项目#串口助手(源码与发布链接)

一、项目概述 该串口助手工具基于Qt/C开发,专为简化串口通信调试与开发而设计,适合新手快速上手。工具具有直观的用户界面和丰富的功能,旨在帮助用户与串口设备建立可靠通信,便于调试、数据传输和分析。 二、主要功能 波特率&a…

【Hadoop|MapReduce篇】MapReduce概述

1. MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2. Map…

视频汇聚平台LntonAIServer视频质量诊断功能--偏色检测与噪声检测

随着视频监控技术的不断进步,视频质量成为了决定监控系统性能的关键因素之一。LntonAIServer新增的视频质量诊断功能,特别是偏色检测和噪声检测,进一步强化了视频监控系统的可靠性和实用性。下面我们将详细介绍这两项功能的技术细节、应用场景…

2158. 直播获奖(live)

代码 #include<bits/stdc.h> using namespace std; int main() {int n,w,a[100000],cnt[601]{0},i,j,s;cin>>n>>w;for(i0;i<n;i){scanf("%d",&a[i]);cnt[a[i]];int x(i1)*w/100;if(!x) x1;for(j600,s0;j>0;j--){scnt[j];if(s>x){cou…

linux编译器——gcc/g++

1.gcc linux上先要安装&#xff0c; sudo yum install gcc gcc --version 可以查看当前的版本 &#xff0c;我们默认安装的是4.8.5的版本&#xff0c;比较低&#xff0c; gcc test.c -stdc99 可以使他支持更高版本的c标准 -o 可以殖指明生成文件的名字&#xff0c;可以自己…

重启顺风车的背后,是高德难掩的“野心”

以史鉴今&#xff0c;我们往往可以从今天的事情中&#xff0c;看到古人的智慧&#xff0c;也看到时代的进步。就如西汉后期文学家恒宽曾说的&#xff0c;“明者因时而变&#xff0c;知者随事而制”。 图源来自高德官方 近日&#xff0c;高德就展现了这样的智慧。在网约车市场陷…

电子电气架构---私有总线通信和诊断规则

电子电气架构—私有总线通信和诊断规则 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…

ROS 工具箱系统要求

ROS 工具箱系统要求 要为 ROS 或 ROS 2 生成自定义消息&#xff0c;或从 MATLAB 或 Simulink 软件中部署 ROS 或 ROS 2 节点&#xff0c;您必须构建必要的 ROS 或 ROS 2 软件包。要构建这些软件包&#xff0c;您必须具备 Python 软件、CMake 软件以及适用于您的平台的 C 编译器…

文件操作与隐写

一、文件类型的识别 1、文件头完好情况&#xff1a; &#xff08;1&#xff09;file命令 使用file命令识别&#xff1a;识别出file.doc为jpg类型 &#xff08;2&#xff09;winhex 通过winhex工具查看文件头类型&#xff0c;根据文件头部内容去判断文件的类型 eg:JPG类型 &a…