架构设计-高性能(一、存储高性能)

news2024/10/11 2:27:12

1.简介

        数据存储的性能是系统高性能的两大组成部分之一。目前市场的数据存储技术是五花八门,并且目前针对在大数据环境下针对不同的需求和场景提出了更多不同类型的数据库。本文主要讲解分类中的关系型数据库和NoSql数据库的高性能。

2.关系型数据库

        虽然存储技术在疯狂的迭代,但是传统关系型数据库基于器ACID的特性和强大的sql查询依然在数据存储界占据核心地位。但是随着大数据的发展,单个数据库服务很多时候很难满足具有庞大数据存储的业务需求,所以必须考虑数据库集群的方式来提升性能。高性能数据库集群的方式主要有两种:

  • 读写分离:本质为将访问压力分散到集群的多个节点。
  • 分库分表:既可以分散访问压力,又可以分散存储压力,但是架构相对更加复杂。

2.1.读写分离

        读写分离的原理是将数据库读写操作分散到不同的节点上。这里采用的是主从集群。从机是提供读数据功能的节点。

 

读写分离的实现逻辑比较简单,在实际应用中主要应对的是数据复制延迟带来的复杂性。

解决主从复制延迟的方案:

  1. 写操作后的读操作指定发送给数据库主服务器
  2. 读从机失败后再读一次主机
  3. 关键业务读写操作都指向主机,非关键业务采用读写分离

其各种方案都有其各自的优缺点且也只是只能解决一部分问题,需根据业务需求实际问题实际考虑。

2.2.分库分表

        读写分离只能缓解数据的读写压力,不能解决大量数据的存储压力。常见的分散存储的方法有“分库”和“分表”两大类。

2.2.1.分库

        指按照业务模块将数据分散到不同的数据库服务器。这样就能一定程度分散存储和访问的压力,但是也会带来一系类的问题:

  • join问题:不在一个库的表无法使用sql的join操作
  • 事务问题:在同一数据库中的表可以在同一事务修改,分库后无法通过事务统一修改。虽然有的数据库厂家提供了分布式事务的解决方案(如Mysql的XA),但是性能很低
  • 成本问题:分库需要增加服务器,所以会带来成本相关的问题。

所以,初始业务不建议一开始就进行分库操作,当用户发展到一定的程度,业务需要时在进行考虑。

2.2.2.分表

        当同一表的数据达到百万千万甚至更高时,单表数据就会达到性能瓶颈,此时就需要对单表数据进行拆分,单表的拆分分为垂直拆分水平拆分两种方式。

        单表拆分后的表是否要分散到不同的库需要根据实际情况来定,并非强制要求一定要分散到不通的库。因为拆分成多表后新的表即使在同一库也能带来很大的性能提升,如性能可以满足就不需要分散到不同的库,且分散到不同的库也会带来很多复杂性的问题。

  • 垂直拆分:

        也叫列拆分,适合将表中不常用且占用大量空间的列切分出去。其复杂度主要在表操作的数量要增加

  • 水平拆分:

        也叫行拆分,适合表行数特别大的表<千万级以上>。其复杂性主要体现在怎么拆分聚合类的操作上。

【路由问题】

水平分表后某条数据具体属于那个切分后的子表,称为数据路由问题。常见的解决方案有:

路由方式具体方案复杂性缺点
范围路由选取有序的列(如整形,时间戳等)作为路由的条件,不同分段分散到不同的数据库表中分段大小的选取缺点是分布不均匀
Hash路由选取某个或某些列的值做Hash运算,按照Hash的结果分散到不同的数据库表中初始表数量的选取缺点为扩充新的表很麻烦
路由表用一张独立的表记录路由信息需多查一次如路由表过大,同样有性能瓶颈

【join问题】

如需进行join操作,需要在业务代码或数据库中间件中进行多次join查询,然后将结果合并。

【聚合问题】

聚合类操作也需要每个子表分别进行,然后对结果进行合并。

【排序问题】

排序操作无法在数据库中完成,只能由业务代码或者数据库中间件分别查询每个子表的 数据饭后汇总排序。

2.3.实现方案

        读写分离需要将读/写操作区分开,然后访问不同的数据库节点;分库分表是根据不同的数据访问来确定访问的数据库节点,都是同一种机制,即不同的sql到不同的数据库节点执行。常见的方式有程序代码封装中间件封装

2.3.1.程序代码封装

        指在代码中抽象一个数据访问层来实现读写分离、分库分表

特点:

  • 实现简单,且可以根据业务做较多的定制化功能。
  • 每种编程语言需自己实现无法通用
  • 如发生主从切换,可能需要所有系统修改配置并重启

开源的方案有,淘宝的TDDL等

2.3.2.中间件封装

指独立一套系统出来,实现读写分离和分库分表操作。在业务服务器看来,中间件就是一个数据库服务器。

 特点:

  • 能支持多种编程语言
  • 需支持完整的sql语法和数据库服务器协议
  • 数据库主从切换对业务服务器无感知,数据库中间件可以探测数据库服务器的主从状态
  • 成熟的中间件有:Mysql Router、Atlas等

数据库中间件的复杂度相对较高,所以一般情况下建议采用程序语言封装的方式或者使用成熟的开源数据库中间件。

 3.NoSql

        Nosql的出现时为了解决关系型数据库在某些方面的不足,但是器根本是以牺牲ACID特性中的某个或某几个来实现的。常见的Nosql分为:

类型特性代表
K-V存储解决关系型数据库无法存储数据结构的问题Redis
文档数据库解决关系型数据库强schema约束的问题MongoDB
列式数据库解决关系型数据库大数据场景下的I/O问题HBase
全文检索引擎解决关系型数据库的全文检索性能问题Elasticsearch

4.缓存

        为了弥补存储系统在复杂业务下的不足如读多写少等,其基本原理就是将可能重复使用的数据放到内存中,一次生成,多次使用,避免每次使用都去访问存储系统。

4.1.缓存穿透

指缓存没有发生作用,业务系统虽然去缓存查询数据,但缓存中没有数据,业务系统需要再次去查询存储系统。一般有两种情况:

  • 存储数据不存在

        如果查询存储系统的数据没找到,则直接设置一个默认值并存入缓存,装第二次读取缓存时  就会获取默认值而不会继续访问存储系统。

  • 缓存数据生成耗费大量的时间或资源

 目前么有太好的解决方案

4.2.缓存雪崩

        指当缓存失效后引起系统性能急剧下降的情况。在高并发下多个线程同时去访问存储系统并生成缓存,对存储系统造成巨大的性能压力从而拖慢整个系统,甚至于造成数据库宏机,从而引起一系类连锁反应,造成整个系统崩溃。常见的解决方案有:

  • 更新锁:岁缓存更新操作进行枷锁保护,分布式系统需使用分布式锁,如ZooKeeper。
  • 后台更新:后台线程来更新缓存而不是业务线程,缓存本身有效期为永久,后台线程定时更新缓存。

4.3.缓存热点

描述:

        大部分业务或所有业务,请求命中统一缓存,对此缓存所在的缓存服务器造成的压力。

 解决:

        缓存热点的解决方案就是复制多份热点缓存,将请求分散到多个缓存服务器上,减轻缓存热点导致的单台缓存服务器压力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ClickHouse(二):ClickHouse特性

​目录 1. 完备的DBMS功能 2. 列式存储 3. 数据压缩 4. 向量化执行引擎 5. 关系模型与标准SQL查询 ​​​​​​​6. 多样化的表引擎 ​​​​​​​7. 多线程与分布式 ​​​​​​​8. 多主架构 ​​​​​​​9. 交互式查询 ​​​​​​​10. 数据分片与分布式查询…

03 shell 编程

变量 语言型 编译型语言 解释型语言 shell脚本语言是解释型语言shell脚本的本质&#xff1a;shell命令的有序集合 shell 编程的基本过程 基本过程分为三步&#xff1a; step1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本文件; step2. 赋予shell文件执行…

Flutter 状态组件 InheritedWidget

Flutter 状态组件 InheritedWidget 视频 前言 今天会讲下 inheritedWidget 组件&#xff0c;InheritedWidget 是 Flutter 中非常重要和强大的一种 Widget&#xff0c;它可以使 Widget 树中的祖先 Widget 共享数据给它们的后代 Widget&#xff0c;从而简化了状态管理和数据传递…

Spark(36):Structured Streaming 编程模型

目录 0. 相关文章链接 1. 的核心思想 2. 基本概念 2.1. 输入表 2.2. 结果表 2.3. 输出 2.4. 快速入门代码的再次说明 3. 处理事件-时间和延迟数据(Handling Event-time and Late Data) 4. 容错语义 0. 相关文章链接 Spark文章汇总 1. 的核心思想 Structured Streami…

4、非线性数据结构

上一节课我们讲了线性数据结构&#xff0c;这一节我们说下非线性数据结构。 非线性数据结构&#xff0c;从字面意思来看&#xff0c;就是指不是线性的结构。线性结构的特点是只有一个前驱和一个后继。 那么非线性结构的特点就是有多个前驱或后继了。 如果只存在一个没有前驱的…

第一次编程测试(分频器)

一&#xff0c;分频器 定义 分频器&#xff08;Divider&#xff09;是一种电子电路或设备&#xff0c;用于将输入信号的频率降低到较低的频率。它常用于数字系统、通信系统和计时应用中。原理 整数分频器使用计数器来实现频率的降低。计数器根据输入信号的边沿触发进行计数&am…

STM32MP157驱动开发——按键驱动(中断)

文章目录 编写使用中断的按键驱动程序编程思路设备树相关驱动代码相关 代码修改设备树文件gpio_key_drv.cMakefile编译测试 编写使用中断的按键驱动程序 对于使用中断的按键驱动&#xff0c;内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以&#xff0c;需要做的…

❛‿˂̵✧ THU数据结构(上)(2023spring) 完成啦(⑅˃◡˂⑅)

实际上来讲&#xff0c;是课程截止到今天晚上( ◔︎ ‸◔︎) 总结一下&#xff0c;放假十来天&#xff0c;边敲边听。后期有些地方应该再复习复习。 接下来的关于数据结构的目标 〇 把&#xff08;上&#xff09;中没敲完的结构敲完 〇 ZJU的配套题目写完 〇 学习&#xff…

linux系统GHOST备份方案

linux系统GHOST备份方案 Windows系统备份可以用ghost工具软件完成&#xff0c;Linux系统不能完全依赖于ghost工具&#xff0c;一则是ghost本身是有版权的软件&#xff0c;二则ghost只支持ext2、ext3文件系统的Linux分区&#xff0c;不支持reiserfs、xfs等比较高级的文件系统&a…

9.python设计模式【外观模式】

内容&#xff1a;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一个子系统更加容易使用。 角色&#xff1a; 外观&#xff08;facade&#xff09;子类系统&#xff08;subsystem classes&#xff09; UML图 举…

拉密

拉密&#xff0c;又称以色列麻将。 游戏人数为2-4人。 和扑克牌一样&#xff0c;一套是52张&#xff0c;4个花色&#xff0c;每个花色1到13。 拉密数字牌由106张塑料牌组成&#xff0c;包含2套牌和2张万能牌。 一张是可以指定成暖色任意牌&#xff0c;一张可以指定成冷色任意…

草稿#systemverilog# 说说《队列》 那些事儿

最近不断使用到systemverilog 语言编程中的队列语法。今天抽时间,尽肯能全的整理一下队列的相关用法,一是加固基础打牢,而是在代码编写过程中,提高代码水平。 队列是一种复合数据结构,可以用来存储多个数据的容器,但同时又拥有自己的优势特性。正如绿皮书所言,队列的引…

1-2 AUTOSAR分层架构

目录 一、简介 二、基础软件层 BSW 2.1 微控制器抽象层 2.2 ECU抽象层 2.3 复杂的驱动程序 2.4 服务层 三、运行时环境 RTE 四、应用软件层 SWC 一、简介 AUTOSAR架构在最高的抽象级别上区分了三个软件层&#xff1a; 应用程序层&#xff08;APPL&#xff09;运行时环…

macOS Monterey 12.6.8 (21G725) Boot ISO 原版可引导镜像

macOS Monterey 12.6.8 (21G725) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Lin…

我的个人项目

项目介绍&#xff1a; 项目主要是使用vue3开发&#xff0c;利用前端技术&#xff0c;实现一些功能和游戏&#xff0c;并不是真正意义上的项目 功能概况介绍&#xff1a; 1. 记账&#xff08;app端页面记录日常消费和收入&#xff09; 2. 常用网站的管理 3. 文本内容检索 4. …

iptables安全技术和防火墙

防火墙&#xff1a;隔离功能 位置&#xff1a;部署在网络边缘或主机边缘&#xff0c;在工作中&#xff0c;防火墙的主要作用是决定哪些数据可以被外网访问以及哪些数据可以进入内网访问&#xff0c;主要在网络层工作 其他类型的安全技术&#xff1a;1、入侵检测系统 2、入侵…

vue2生命周期图

生命周期全过程如下&#x1f447;详解 一:生命周期之创建阶段 1.创建一个Vue实例【new Vue()】 2.初始化Vue实例,第一次初始化,初始化Vue当中的事件和生命周期方法【Init Events Lifecycle】 ☆☆☆调用生命周期方法当中的beforCreate,调用这个方法的时候有一个特点,就是在调…

自动化运维工具--saltstack部署及使用

目录 一、saltstack简介 1、介绍 2、Salt的核心功能 3、saltstack通信机制 二、saltstack部署 1、部署环境 2、配置yum源 3、安装master与minion 4、连接认证master和minion 三、salt运行 1、执行格式 2、实操演示 一、saltstack简介 1、介绍 saltstack是一个配置管…

[护网杯 2018]easy_tornado1

进入环境后有三个路径链接 访问/flag提示会说flag在/fllllllllllag里 值得注意的是访问后网页url发生的变化&#xff0c;这里居然有两个参数 替换掉filename的值后页面url再次发生变化&#xff0c;网页只有一个msg传参的数据 访问welcome.txt&#xff0c;只是回显了一个render…

一个灵活、现代的Android应用架构

一个灵活、现代的Android应用架构 学习Android架构的原则&#xff1a;学习原则&#xff0c;不要盲目遵循规则。 本文旨在通过示例演示实际应用&#xff1a;通过示范Android架构来进行教学。最重要的是&#xff0c;这意味着展示出如何做出各种架构决策。在某些情况下&#xff0…