存储与数据库——1.认识存储与数据库
存储与数据库——1.认识存储与数据库
前言
本文是参考字节跳动存储与数据库课程而编写的笔记文
存储
经典案例介绍数据的产生
有一天,李华要在QQ要在Hello Talk(一款可以与外国人交流锻炼语言能力的app)与老外交流.他注册的用户名为lihua,密码为123456,最后按下注册按钮,如此,数据便产生了,并且以极快的速度向app的后台服务器传输
我们可以把这个过程剖析过来看看:
李华的注册操作产生了一条结构化的用户注册数据→数据产生→数据飞速传输到后端服务器→数据在数据库中存储持久化保存下来(若不存储到数据库,你此前的操作都是白干,信息不会被记录)
这里面存储系统也参与了工作,这里就先不展开叙述了(懒)
若数据已到达数据库,它会做哪些事情呢?
- 首先,数据库会对数据进行校验,比如校验用户名是否重复,密码是否符合要求等
- 数据库会修改内存,用高效的数据结构组织数据并进行运算,来准备后续的持久化
- 数据库会将数据写入硬件,且对硬件的寿命及性能不会产生较大影响
存储系统概览
啥是存储系统!?w(゚Д゚)w
存储系统是一个提供读写、控制类接口,能够安全、高效的访问存储设备将数据持久化的软件
存储系统有啥特点~_~
- 存储系统作为后端软件的底座,性能敏感,需要保证高吞吐和低时延
- 存储系统是软件架构,容易受硬件的影响(硬件发生变革,存储系统要做出改变来适应硬件的变化)
- 存储系统的代码必须简洁,但要应对复杂的业务逻辑(说白了就是你要用简单的代码来应对多种复杂的情况)
存储器层级结构
容量从上往下依次增大
访问速度从上往下依次减小
在中间层其实有一个兼顾存储容量和访问速度的东西叫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

(左边是内存,右边是磁盘)
左边内存里黄色的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架构图(具象一下基本原理)

Management Node就是分布式系统的管控面
-
Ceph
Ceph可是开源分布式存储系统里面的【万金油】
- 而Ceph的核心特点便是:
一套系统支持对象接口、块接口、文件接口,但是一切皆对象 - 数据写入采用主备复制模型
- 数据分布模型(没错,又是平分,这次是数据)采用CRUSH算法(HASH+权重+随机抽签)

单机数据库
概览
单机数据库 = 单个计算机节点上的数据库系统
事务在单机内执行,也可以通过网络交互实现分布式事务
关系型数据库
商业产品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

非关系型数据库
MongoDB、Redis、Elasticsearch三足鼎立
关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同
非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活
不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事务”

Elasticsearch使用案例

跟RDBMS相比,ES天然能做【模糊搜索】,还能自动算出关联程度
从单机到分布式数据库
单机数据库遇到了哪些问题 & 挑战,需要我们引入分布式架构来解决??
答案是容量,弹性和性价比
解决容量问题

解决弹性问题

其它要做的
除了解决容量以及弹性问题之外,还有一些问题等着我们去优化解决:
-
单写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~~