- 经典案例
- 数据的产生
过程:用户提供数据 -> 后端服务器 -> 数据库(数据持久化) -> 其它系统(略) - 数据持久化 校验数据的合法性 -> 修改内存(用高效的数据结构组织数据) -> 写入存储介质
- 存储 & 数据库简介
- 存储系统
- 是什么
一个提供了读写、控制接口,能够安全有效的把数据持久化的软件 - 特点
- 作为后端软件的底座,性能敏感(频繁的输出输入需要高性能)
- 存储系统代码既“简单”又“复杂”(代码不能写太复杂,搞得性能差;异常错误处理上得考虑全面)
- 存储系统软件架构,容易受硬件影响(软件顺应硬件)
- 存储器层级结构
- 金字塔(读取速度快慢和容量大小相反)
- 速度和容量大概相兼容:persistent memory
- 数据怎么从应用到存储介质
- 缓存很重要,贯穿整个存储体系(硬件读取数据和软件输出的数据速度不一致,以友好的方式进行交互)
- 拷贝很昂贵,应该尽量减少(拷贝需要用到cpu)
- 硬件设备五花八门,需要有抽象统一的接入层(让软件与硬件适配性更好)
- RAID技术
- 背景需求
- 价格
- 性能
- 容错能力、安全性
- 型号
- RAID 0:把一个用户数据并发写入多个磁盘,性能较好,但没有容错
- RAID 1:也是多个磁盘的组合,但并不是为了性能,而是为了容错。 一块磁盘对应一块额外镜像盘;故真实空间利用率仅为50%;容错能力强
- RAID 0+1: 结合了RAID 0和RAID 1;真实空间利用率仅为50%;容错能力强,写入带宽好
- 背景需求
- 是什么
- 什么是数据库系统
- 关系
- 关系 = 集合 = 任意关系组成的若干有序偶对
- 反映事物间的关系
- 关系代数 = 对关系做运算的抽象查询语言(交、并、笛卡尔积...)
- 关系型
关系型数据库是存储系统,但在存储之外,又发展出其他能力- 结构化数据友好
- 支持事务(ACID)
- 支持复杂查询语言
- 非关系型
非关系型数据库也是存储系统,但是一般不要求严格的结构化- 半结构化数据友好
- 可能支持事务(ACID)
- 可能支持复杂查询语言
- 数据库 vs 经典存储
- 结构化数据管理
- 结构化数据
- 结构化数据,简单来说就是数据库,也可称作行数据,它是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。
- 结构化数据的一般特点:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的,存储在数据库中;能够用数据或统一的结构加以表示,如数字、符号;能够用二维表结构来逻辑表达实现,包含属性和元组
- 比较
- 事物能力ACID
- Atomicity: 事物内的操作要么全做,要么不做
- Consistency:事物执行前后,数据状态是一致的
- Isolation:可以隔离多个并发事物,避免影响
- Durability:事物一旦提交成功,数据保证持久性
- 复杂查询能力
- 如sql
- 关系
- 主流产品剖析
- 单机存储
- 单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
- 本地文件系统
- Linux中的经典哲学:一切皆文件
- 文件系统的管理单元:文件
- 文件系统接口:文件系统繁多,如Ext2/3/4,sysfs,rootfs等,但都遵循VFS的统一接口
- Linux文件系统的两大数据结构:Index Node & Directory Entry
- Index Node
- 记录文件元数据,如id、大小、权限、磁盘位置等
- inode是一个文件的唯一标识,会被存储到磁盘上
- inode的总数在格式化文件系统时就固定了
- Directory Entry
- 记录文件名、inode指针、层级关系(parent)等
- dentry是内存结构,与inode的关系是N:1(hardlink的实现)
- Index Node
- key-value存储
- 世间一切皆key-value
- 常见使用方法:put(k,v) & get(k)
- 常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能
- 拳头产品(类似代表作的意思):RocksDB
- 单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
- 分布式存储
- 分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互
- HDFS:堪称大数据时代的基石
- 背景 专用的高级硬件很贵,同时数据存量很大,要求超高吞吐
- 核心特点
- 支持海量数据存储
- 高容错性(便宜错多,所以要有高容错性)
- 若POSIX语义
- 使用普通x86服务器,性价比高
- Ceph:开源分布式存储系统里的万金油
- 一套系统支持对象接口、块接口、文件接口,但是一切皆而对象
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH算法 (HASH+权重+随机抽签)
- 单机数据库
单机数据库 = 单个计算机节点上的数据库系统
事务在单机内执行,也可能通过网络交互实现分布式事务- 单机关系型数据库 商业产品:Oracle 开源产品:MySQL & PostgreSQL
- 单机非关系型数据库 代表:MongoDB、Redis、Elastisearch
- 关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同
- 非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活
- 不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事物”(内卷)
- Elastisearch
- 面向文档存储
- 文档可序列化为JSON,支持嵌套
- 存在【index】,index = 文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构 & 算法
- 支持RESTFUL API,也支持弱SQL交互
- 跟RDBMS相比,ES天然能做模糊搜索,还能自动算出关联程度
- MongoDB
- 面向文档存储
- 文档可序列化为JSON/BSON,支持嵌套
- 存在【collection】,collection = 文档的集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开始支持事物(多文档、跨分片多文档等)
- 支持client/SDK交互,可通过插件转译支持弱SQL
- Redis
- 数据结构丰富(hasg表、set、zset、list)
- C语言表现,超高性能
- 主要基于内存,但支持AOF/ROB持久化
- 常用redis-cli多语言SDK交互
- 分布式数据库
单机问题:- 容量问题
单点容量有限,受硬件限制
改进:存储节点池化,动态扩缩容 - 弹性问题
- 性价比问题
- 容量问题
- 新技术演进
- 概览
- 软件架构变更
- AI增强
- 新硬件革命(存储介质变更、计算单元变更、网络硬件变更)
- SPDK
- Kernel Space -> User Space
- 中断 -> 轮询
- 无锁数据结构
- AI & Storage
- 存储格式的转换(行存、列存、行列混存)
- 高性能硬件
- RDMA网络
- Persistent Memory
- 可编程交换机
- CPU/GPU/DPU
- 总结
在存储 & 数据库领域,硬件反推软件变革十分常见
在学习本次课程之前,我一直以为存储系统和数据库是两个彼此毫无关联的东西,听完课程后才发现这两者也是有相同之处的。
用我自己的理解,我把他们两个这样来表示‘数据库 > 存储系统’,因为数据库除了是一个存储系统,还有着其他功能。
此外,也对Redis有了比较高的兴趣,不仅仅是许多oj要求有Redis能力。原来MySQL是关系型数据库,而Redis是非关系型数据库,所以我想去学习了解一下它们有什么不同,这样也更能理解关系型数据库和非关系型数据库的区别。