存储与数据库——1.认识存储与数据库

前言

本文是参考字节跳动存储与数据库课程而编写的笔记文


存储

经典案例介绍数据的产生

有一天,李华要在QQ要在Hello Talk(一款可以与外国人交流锻炼语言能力的app)与老外交流.他注册的用户名为lihua,密码为123456,最后按下注册按钮,如此,数据便产生了,并且以极快的速度向app的后台服务器传输

我们可以把这个过程剖析过来看看:
李华的注册操作产生了一条结构化的用户注册数据→数据产生→数据飞速传输到后端服务器→数据在数据库中存储持久化保存下来(若不存储到数据库,你此前的操作都是白干,信息不会被记录)

这里面存储系统也参与了工作,这里就先不展开叙述了(懒)

若数据已到达数据库,它会做哪些事情呢?

  1. 首先,数据库会对数据进行校验,比如校验用户名是否重复,密码是否符合要求等
  2. 数据库会修改内存,用高效的数据结构组织数据并进行运算,来准备后续的持久化
  3. 数据库会将数据写入硬件,且对硬件的寿命及性能不会产生较大影响

存储系统概览

啥是存储系统!?w(゚Д゚)w

存储系统是一个提供读写、控制类接口,能够安全、高效的访问存储设备将数据持久化的软件

存储系统有啥特点~_~

  1. 存储系统作为后端软件的底座,性能敏感,需要保证高吞吐和低时延
  2. 存储系统是软件架构,容易受硬件的影响(硬件发生变革,存储系统要做出改变来适应硬件的变化)
  3. 存储系统的代码必须简洁,但要应对复杂的业务逻辑(说白了就是你要用简单的代码来应对多种复杂的情况)

存储器层级结构

这是一张层级结构概览图

容量从上往下依次增大
访问速度从上往下依次减小

在中间层其实有一个兼顾存储容量和访问速度的东西叫Persistent Memory,它是介于CPU和内存之间的一个高速缓存,它的访问速度比内存快,但是容量比内存小

数据怎么从应用到存储介质

数据链路图

注:缓存很重要,它直接贯穿整个存储体系(可以帮助我们以硬件友好的方式来跟硬件打交道);
拷贝很昂贵(太消耗cpu了),应尽量减少;
硬件设备需要有抽象统一的接入层(否则如果硬件变化了,软件还得重写,很麻烦)

RAID技术

出现背景:

  • 单块大容量磁盘的价格>多块小容量磁盘

  • 单块磁盘的写入功能<多块磁盘的并发写入性能

  • 单块磁盘的容错能力有限,不够安全

所以,RAID技术做到了高性能/高性价比/高可靠性(很牛)

RAID 0:

  • 多块磁盘的简单组合
  • 数据条带化存储,提高磁盘带宽
  • 没有额外的存储设计

RAID 1:

  • 一块磁盘对应一块额外镜像盘
  • 真是空间利用率仅有50%
  • 容错能力强

RAID 0+1(比如说先用RAID 0两两组合成若干个单元,再用RAID 1将这些单元两两组合):

  • 结合了RAID 0和RAID 1的优点
  • 真实利用率仅50%
  • 容错能力强,写入带宽好

数据库

数据库的分类及特点

关系=集合=任意元素组成的若干有序偶对,反应了事物间的关系
关系代数=对关系作运算的抽象查询语言(雀食抽象)
SQL=一种DSL=方便人类阅读的关系代数表达形式

关系型数据库:就是存储系统(对,它就是),但是在存储之外,又发展出其他能力(结构化数据友好、支持事务、支持复杂查询语言)

非关系型数据库:也是存储系统,但是一般不要求严格的结构化(半结构化数据友好、可能支持事务、可能支持复杂查询语言)

PS:此处描述的可能有点抽象。。。具体后面会学到

数据库 vs 经典存储

存储方式 数据管理 事务能力 复杂查询能力
数据库 结构化管理 优越 灵活简洁
经典存储 半结构化管理 一般 僵化复杂

事务的ACID中:
A:事务的操作要么全做,要么不做
C:事务执行前后,数据状态是一样的
I:可以隔离多个并发事务,避免影响
D:事务一旦提交成功,数据保证持久性

(反正记住一个原则,数据库肯定比经典存储优势多得多)


主流产品剖析

单机存储

概览OwO

单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互。一般分为:本地存储系统 key-value存储

接下来我们先介绍一下单机本地文件系统

Linux系统(应该没有人不知道吧)就是一个典型的本地文件系统,正如Linux经典哲学所说:一切皆文件

文件系统的管理单元就是文件

文件系统接口:文件系统很多种,比如说rootfs,sysfs,Ext2/3/4等等,但这些都遵循VFS(虚拟文件系统,是Linux内核的子系统之一)的统一抽象接口

Linux文件系统的两大数据结构:Index Node & Directory Entry

Index Node Directory Entry
记录文件元数据,如id、大小、权限、磁盘位置等 记录文件名、inode指针,层级关系(parent)等
inode是一个文件的唯一标识,会被存储到磁盘上 dentry是内存结构,与inode的关系是N:1(hardlink的实现)
inode的总数在 格式化文件系统时就固定了

key-value存储

世间一切皆key-value——key是你的身份证,value是你的内涵( ̄︶ ̄*))

常见使用方式:put(k,v)&get(k)

常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能

拳头产品:RocksDB

![这是一张原理示意图](/assets/post_img/存储与数据库/屏幕截图 2024-11-20 233625.png)

(左边是内存,右边是磁盘)

左边内存里黄色的MemTable满了以后就会被刷到下面灰色的Immutable MemTable(不可变),之后过一段时间或者条件触发,它就会把这个东西的顺序写入到磁盘中的SSTable(有序的key-value集合)里面,当Level 0装满以后,数据就会被下刷到Level 1,再满就会被下刷到Level 2,最终如果要读取一个最新版本的key-value数据,它可能就需要合并多层的0,1,2或者更多层的里面的key-value数据来得到一个最新版本,它才能服务用户的get请求(好复杂

分布式存储

概览UwU

分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互

  • HDFS

HDFS堪称大数据时代的基石

在HDFS诞生之前,市面的专用高级硬件很贵,同时数据存量很大,要求超高的吞吐,所以HDFS应运而生

HDFS的特点正是解决了这几点:

  • 支持海量存储
  • 高容错性
  • 弱POSIX语义
  • 使用普遍x86服务器,性价比高

其实HDFS的原理可以理解为多个低配硬件协作存储,既保证了存储又降低了成本,性价比很高

下面是一个HDFS架构图(具象一下基本原理)

![111](/assets/post_img/存储与数据库/屏幕截图 2024-11-21 221145.png)

Management Node就是分布式系统的管控面

  • Ceph

Ceph可是开源分布式存储系统里面的【万金油】

  • 而Ceph的核心特点便是:
    一套系统支持对象接口、块接口、文件接口,但是一切皆对象
  • 数据写入采用主备复制模型
  • 数据分布模型(没错,又是平分,这次是数据)采用CRUSH算法(HASH+权重+随机抽签)

![111](/assets/post_img/存储与数据库/屏幕截图 2024-11-23 001047.png)


单机数据库

概览

单机数据库 = 单个计算机节点上的数据库系统

事务在单机内执行,也可以通过网络交互实现分布式事务

关系型数据库

商业产品Pracle称王,开源产品 MySQL&PostgreSQL

MySQL(小海豚logo)

关系型数据库的通用组件:

  • Query Engine——负责解析query,生成查询计划
  • Txn Manager——负责事务并发管理
  • Lock Manager——负责锁相关的策略
  • Storage Engine——负责组织内存/磁盘数据结构
  • Replicatioin——负责主备同步

PostgreSQL(大象logo)

  • 关键内存数据结构:B-Tree、B±Tree、LRU List等
  • 关键磁盘数据结构:WriteAheadLog (RedoLog)、Page

![111](/assets/post_img/存储与数据库/屏幕截图 2024-11-24 221748.png)

非关系型数据库

MongoDB、Redis、Elasticsearch三足鼎立

关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同

非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活

不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事务”

![](/assets/post_img/存储与数据库/屏幕截图 2024-11-24 224218.png)

Elasticsearch使用案例

![111](/assets/post_img/存储与数据库/屏幕截图 2024-11-24 225124.png)

跟RDBMS相比,ES天然能做【模糊搜索】,还能自动算出关联程度


从单机到分布式数据库

单机数据库遇到了哪些问题 & 挑战,需要我们引入分布式架构来解决??

答案是容量,弹性和性价比

解决容量问题

![111](/assets/post_img/存储与数据库/屏幕截图 2024-11-24 225837.png)

解决弹性问题

![111](/assets/post_img/存储与数据库/屏幕截图 2024-11-24 230005.png)

其它要做的

除了解决容量以及弹性问题之外,还有一些问题等着我们去优化解决:

  • 单写vs多写

  • 从磁盘弹性到内存弹性

  • 分布式事务优化


新技术演进

概览

新技术 例子
软件架构变更 Bypass OS kernel
AI增强 智能存储格式转换
新硬件革命 存储介质变更,计算单元变更,网络硬件变更

SPDK

Bypass OS kernel已经成为一种趋势

SPDK(Storage Performance Development Kit)带来的三个优势:

Kernel Space → User Space

  • 避免syscall带来的性能损耗,直接从用户态访问磁盘

中断 → 轮询

  • 磁盘性能提高后,中断次数随之上升,不利于IO性能
  • SPDK poller可以绑定特定的cpu核不断轮询,减少cs,提高性能

无锁数据结构

  • 使用Lock-tree queue,降低并发时的同步开销

AI & Storage

AI领域相关技术,如Machine Learning在很多领域:如推荐、风控、视觉领域证明了有效性

在Storage领域,AI能给我们带来什么呢?

逻辑上看到的数据组织格式有行存和列存(表里面有多个行和列),但是在经过AI决策之后,可以实现行列混存,更好适应动态性比较强的业务

高性能硬件

1.RDMA网络

  • 传统的网络协议栈,需要基于多层网络协议处理数据包,存在用户态 & 内核态的切换,足够通用但性能不是最佳
  • RDMA是kernel bypass的流派,不经过传统的网络协议栈,可以把用户态虚拟内存映射给网卡,减少拷贝开销,减少cpu开销

2.Persistent Memory

在NVMe SSD和Main Memory间有一种全新的存储产品:Persistent Memory

  • IO时延介于SSD和Memory之间,约百纳秒量级
  • 可以用作易失性内存(Memory mode),也可以用作持久化介质(app-direct)

3.可编程交换机

P4 Switch,配有编译器、计算单元、DRAM,可以在交换机层对网络包做计算逻辑,在数据库场景下,可以实现缓存一致性协议等

4.CPU/GPU/DPU

  • CPU:从multi-core走向many-core

  • GPU:强大的算力 & 越来越大的量存空间

  • DPU:异构计算,减轻CPU的workload


总结

存储系统

  • 块存储:存储软件栈里的底层系统,接口过于朴素
  • 文件存储:日常使用最广泛的存储系统,接口十分友好,实现五花八门
  • 对象存储: 共有云上的王牌产品,immutable语义加持
  • key-value存储:形式最灵活,存在大量的开源/黑盒产品

数据库系统

  • 关系型数据库:基于关系和关系代数构建,一般支持事务和SQL访问,使用体验友好的存储产品
  • 非关系型数据库:结构灵活,访问方式灵活,针对不同场景有不同的针对性产品

分布式架构

  • 数据分布策略:决定了数据怎么分布到集群里的多个物理节点,是否均匀,是否能做到高性能
  • 数据复制协议:影响IO路径的性能、机器故障场景的处理方式
  • 分布式事务算法:多个数据库节点协同保障一个事务的ACID特性的算法,通常基于2pc的思想设计

THE END~~