15 带你认识存储的本质 - 状态 | 青训营笔记

106 阅读9分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第16天

资料: juejin.cn/post/719769…

课程1: juejin.cn/course/byte…

课程2: juejin.cn/course/byte…

课程3: juejin.cn/course/byte…

讲师: 马浩翔

PPT: bytedance.feishu.cn/file/boxcnC…

01 经典案例

一条数据从产生, 到数据流动, 最后持久化的全生命周期

见PPT

 问题:
 数据库怎么保证数据不丢?
 数据库怎么处理多人同时修改的问题?
 为什么用数据库, 除了数据库还能存到别的存储系统?
 数据库只能处理结构化数据吗?
 有哪些操作数据库的方式, 要用什么编程语言?

02 存储 & 数据库简介

什么是存储系统, 什么是数据库系统

2.1 存储系统

1 定义

 存储系统: 一个提供了读写, 控制类接口, 能够安全有效地把数据持久化的软件, 就可以称为存储系统

2 特点

 作为后端软件的底座, 性能敏感
 存储系统代码,"简单""复杂": 性能要求高, 因此代码要简单. 要考虑多种异常情况, 故代码会复杂
 存储系统软件架构, 容易受硬件影响

3 存储器层级结构

Computer Memory Hierarchy

 塔尖: 性能高, 容量小
 塔底: 性能低, 容量大
     
 各层代表:
 processor register 处理器寄存器
 processor cache 处理器缓存
 random access memory 随机存取存储器
 flash/USB memory
 hard drivers 硬盘驱动器(简称, 硬盘)
 tape backup 磁带备份

4 数据怎样从应用到存储介质

缓存: 很重要, 贯穿整个存储体系

拷贝: 很昂贵, 应该尽量减少

5 RAID技术

Q: 单机存储系统怎么做到高性能/高性价比/高可靠性?
A: Redundant Array of Inexpensive Disks

RAID出现的背景:
	单块大容量磁盘的价格 > 多块小容量磁盘
	单块磁盘的写入性能 < 多块磁盘的并发写入性能
	单块磁盘的容错能力有限, 不够安全

Redundant: 多余的

 RAID 0
     多块磁盘简单组合
     数据条带化存储, 提高磁盘带宽
     没有额外的容错设计
 RAID 1
     一块磁盘对应一块额外镜像盘
     真实空间利用率仅50%
     容错能力强
 RAID 0+1
     结合了RAID 0和RAID 1
     真实空间利用率仅50%
     容错能力强, 数据条带化存储, 写入带宽好

2.2 数据库

难道数据库和存储系统不一样吗?

关系(Relation)是什么?⭐

Edgar.F.Codd于1970年提出[关系模型]

关系=集合=任意元素组成的若干偶对的集合

关系代数=对关系作运算的抽象查询语言(如交, 并, 笛卡尔积)

SQL=一种DSL=方便人类阅读的关系代数表达形式

DSL: Domain Specific Language 领域专用语言. 区别于GPL

GPL: General Purpose Language 通用编程语言

也有GPL: Generalized Programming Language 通用程序设计语言, 但感觉这个GPL和DSL不是一对, 上面那个才是

关系型数据库特点

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

非关系型数据库特点

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

数据库 vs 经典存储

1 结构化数据管理
    数据库: 以表形式管理(关系型数据库)
	经典存储: 写入文件, 自行定义管理结构
2 事务能力
	数据库可以支持事务(ACID: Atomicity原子性, Consistency一致性, Isolation隔离性, Durability持久性)
3 复杂查询能力
	数据库: 灵活, 简洁
	经典存储: 僵化, 复杂

03 主流产品剖析

接下来不要把存储和数据库搞混⭐

3.1 单机存储

单机存储: 单个计算机节点上的存储软件系统, 一般不涉及网络交互

1 本地文件系统

Linux理念: 一切皆文件

文件系统的管理单元: 文件
文件系统接口: 如Ext2/3/4, sysfs, rootfs等, 都遵循VFS的统一抽象接口

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

基于inode和dentry发展出很多强大的文件系统

2 key-value存储

一切皆key-value - 本节课讲师

常见使用方式: put(k, v) & get(k)
常见数据结构: LSM-Tree, 某种程度上牺牲读性能, 追求写入性能
产品: RocksDB

3.2 分布式存储

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

1 分布式文件系统 - HDFS

HDFS: Hadoop Distributed File System, 堪称大数据时代的基石

背景: 专用的高级硬件很贵, 同时数据存量很大, 要求超高吞吐

HDFS核心特点:
支持海量数据存储
高容错性
弱POSIX语义
使用普通x86服务器, 性价比高

POSIX: Portable Operating System Interface 可移植操作系统接口

弱POSIX语义意味着有些单机文件系统的功能它是做不到的

2 分布式存储 - Ceph

Ceph: 开源分布式存储系统里的万金油

对分布式感兴趣可以去读源码

Ceph的核心特点:
一套系统支持对象接口, 快接口, 文件接口
一切皆对象
输入写入采用主备复制模型
数据分布模型采用CRUSH算法

3.3 单机关系型数据库

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

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

关系型数据库

​ 商业产品Oracle称王, 开源产品MySQL & PostgreSQL称霸

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

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

3.4 单机非关系型数据库

MongoDB, Redis, Elasticsearch三足鼎立

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

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

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

Elasticsearch
面向文档存储
文档可序列化为JSON, 支持嵌套
存在index, index即文档的集合
存储和构建索引能力依赖Lucene引擎
实现了大量搜索数据结构&算法
支持RESTFUL API, 也支持弱SQL交互

和RDBMS相比, ES天然能做模糊搜索, 还能自动算出关联程度, 不需要额外配置

MongoDB
面向文档存储
文档可序列化成JSON, 支持嵌套
存在collection, collection即文档的集合
存储和构建索引能力依赖wiredTiger引擎
4.0后开始支持事务(多文档, 跨分片多文档等)
常用client/SDK交互, 可通过插件转译支持弱SQL

Redis
数据结构丰富(hash表, set, zset, list)
C语言实现, 超高性能
主要基于内存, 但支持AOF/RDB持久化
常用redis-cli/多语言SDK交互

3.5 分布式数据库

容量, 弹性, 性价比问题: 单点受硬件限制
解决: 存储节点池化, 动态扩缩容

More To Do:
单写 -> 多写
磁盘弹性 -> 内存弹性
分布式事务优化

04 新技术演进

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

1 SPDK

Bypass OS kernel已经成为一种趋势

SPDK: Storage Performance Development Kit

Kernel Space -> User Space
避免syscall带来性能损耗, 直接从用户态访问磁盘
中断 -> 轮询
磁盘性能提高后, 中断次数随之上升, 不利于IO性能
SPDK poller可以绑定特定的CPU核不断轮询, 减少中断, 提高性能
无锁数据结构
使用Lock-free queue, 降低并并发时的同步开销

2 AI & Storage

行存, 列存
↓ AI决策
行列混存

3 高性能硬件

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

2 Persistent Memory
在MVMe 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

DPU: Data Processing Unit 数据处理器

总结

存储系统
    块存储: 存储软件栈里的底层系统, 接口过于朴素
	文件存储: 日常使用最广泛的存储系统, 接口十分友好, 实现五花八门
	对象存储: 公有云上的王牌产品, immutable语义加持
	key-value存储: 形式最灵活, 存在大量的开源/黑盒产品
数据库系统
    关系型数据库: 基于关系和关系代数构建的, 一般支持事务和SQL访问, 使用体验友好的存储产品
	非关系型数据库: 结构灵活, 针对不同场景有不同的针对性产品
分布式架构
    数据分布策略: 决定了数据怎样分布到集群里的多个物理节点, 是否均匀, 是否能做到高性能
	数据复制协议: 影响IO路径的性能, 机器故障场景的处理方式
	分布式事务算法: 多个数据库节点协同保障一个事务的ACID特性的算法, 通常基于2pc的思想设计

在存储&数据库领域, 硬件反推软件变革非常常见