这是我参与「第五届青训营 」伴学笔记创作活动的第16天
讲师: 马浩翔
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的思想设计
在存储&数据库领域, 硬件反推软件变革非常常见