认识存储与数据库 & 主流存储产品剖析
带你认识存储&数据库
认识存储与数据库
01 经典案例
- 一条数据从产生,到数据流动,最后持久化的全生命周期。
1.1 数据的流动
以用户注册为例:用户在应用上进行注册后,一条用户注册数据就会被传输到应用的后端服务器。但是如果仅仅将用户注册的信息保存在服务器的内存中,不仅会占用服务器的内存,还有可能造成数据丢失。因此,服务器还要将用户的数据传输到数据库进行保存,以实现数据存储的持久化。
1.2 数据的持久化
- 数据库在进行数据的持久化时,会进行以下一些操作:
- 校验数据的合法性:判断数据是否合法,例如数据是否重复
- 修改内存:用高效的数据结构组织数据
- 写入存储介质:以寿命 & 性能友好的方式写入硬件,在对数据进行存储时,还应该考虑硬件的友好性,毕竟最后数据是存储在硬件中的
02 存储&数据库简介
2.1 存储系统
2.1.1 系统概览
什么是存储系统?
-> 一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。
2.1.2 系统特点
- 作为后端软件的底座,性能敏感。
- 存储系统代码,既“简单”又“复杂”:
- “简单” 在于存储系统要求高性能,所以存储系统在 I/O 路径上的代码不能写的很复杂,不能有很多分支。
- “复杂” 在于在非 I/O 路径上、在错误处理路径上,要考虑周全出错的情况,所以代码会写得比较复杂。
- 存储系统软件架构,容易受硬件影响。
2.1.3 存储器层级结构
存储器的层级结构即为《计算机组成原理》课程中有关存储器的层级结构,如下图所示:
2.1.4 RAID技术
- RAID:
Redundant Array of Inexpensive Disks
,磁盘阵列。- RAID 0:多块磁盘简单组合;数据条带化存储,提高磁盘带宽;没有额外的容错设计。
- RAID 1:目的在于提高容错,一块磁盘对应一块额外镜像盘,真实空间利用率仅为 50%(剩下 50% 用于备份),容错能力强。
- RAID 0+1:结合了 RAID 0 和RAID 1,真实空间利用率仅 50%,容错能力强,写入带宽好。
2.2 数据库
- 虽然存储系统和数据库的最终目的都是用于存储数据,但是它们不是同一个东西。
- 数据库分为关系型数据库和非关系型数据库。
2.2.1 概览
关系 = 集合 = 任意元素组成的若干有序偶对,反映了事物间的关系。
关系代数 = 对关系作运算的抽象查询语言:交、并、笛卡尔积。
2.2.2 关系型数据库特点
- 关系型数据库是存储系统,但是在存储之外,又发展出其他能力:
- 结构化数据友好
- 支持事务 ACID
- 支持复杂查询语言,如
SQL
2.2.3 非关系型数据库特点
- 非关系型数据库也是存储系统,但是一般不要求严格的结构化:
- 半结构化数据友好
- 可能支持事务 ACID
- 可能支持复杂查询语言,如
SQL
2.3 数据库 vs 经典存储
2.3.1 结构化数据管理
以用户的注册数据为例:
- 对关系型数据库来说,用户的注册数据会以表形式管理。
- 对经典存储来说,我们就要写入文件,自行定义管理结构,较为复杂。
2.3.2 事务能力
- 关系型数据库支持事务 ACID:
- Atomicity,事务内的操作要么全做,要么不做;
- Consistency,事务执行前后,数据状态是一致的;
- lsolation,可以隔离多个并发事务,避免影响;
- Durability,事务一旦提交成功,数据保证持久性。
2.3.3 复杂查询能力
相比于经典存储,关系型数据库可以用
SQL
方便快捷地进行复杂查询,而经典存储可能还要进行一系列的分支、循环等操作才能完成查询要求。例如:请查询出名字以 xiao 开头,且密码提示问题小于10个字的人,并按性别分组统计人数。
用 SQL 语句进行查询时,用
Select gender, count(*) from user where user_name like 'xiao%' and len(password_hint) < 10 group by gender;
即可;而用经典存储时,则需要复杂的代码操作:
1
2
3
4
5
6
7
8
9
10for each data {
if (user_name... && password_hint...) {
mark in list
}
}
for each in marked_list {
if (gender == ...){
...
}
}
主流存储产品剖析
03 主流产品剖析
3.1 单机存储
- 单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互。
3.1.1 本地文件系统
文件系统的管理单元 : 文件。
文件系统接口 : 文件系统繁多,如
Ext2/3/4
、sysfs
、rootfs
等,但都遵循VFS
的统一抽象接口。- 背后逻辑在于:虽然有各种各样的硬件,但是为了上层应用使用的方便,这些硬件都应该有统一的接口规则,这样上层应用就不需要关心不同硬件的使用细节,而只需要会使用统一的接口即可。
Linux
文件系统的两大数据结构 :Index Node
&Directory Entry


3.1.2 key-value存储
- 所谓的
Key-Value
就是每次存储一个数据时,是根据Key
进行索引存储的,Value
是对应该Key
的值。 - 常见使用方式:
put(k, v)
、get(k)
- 常见数据结构:
LSM-Tree
,某种程度上牺牲读性能,追求写入性能。
3.2 分布式存储
- 分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互。
3.2.1 分布式文件系统HDFS
HDFS
核心特点:- 支持海量数据存储
- 高容错性
- 弱 POSIX 语义
- 使用普通 x86 服务器,性价比高
3.2.2 Ceph
Ceph
核心特点:- 一套系统支持对象接口、块接口、文件接口,但是一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用 CRUSH 算法
3.3 单机关系型数据库
- 单机数据库 = 单个计算机节点上的数据库系统
- 事务在单机内执行,也可能通过网络交互实现分布式事务
- 在关系型数据库中,常见产品有
Oracle
、MySQL
、PostgreSQL
,其中Oracle
是商用的,后两者是开源的。
3.3.1 关系型数据库的通用组件
- Query Engine:负责解析 query,生成查询计划
- Txn Manager:负责事务并发管理
- Lock Manager:负责锁相关的策略
- Storage Engine:负责组织内存/磁盘数据结构
- Replication:负责主备同步
3.3.2 关系型数据库结构解析
如图所示,在关系型数据库中,内存部分的数据是以树的形式来组织的,每一个节点都代表一页Page;除了树之外,还有大量的
Temp data
,用于存储临时的数据。在硬盘中,有三类文件:
Page Files
:对应于内存树中的Page;Redo Log Files
:记录了事务执行过程中的Redo Log
;Others
:可以用来存储临时数据文件。
3.4 单机非关系型数据库
在非关系型数据库中,常见产品有
MongoDB
、Redis
、Elasticsearch
。关系型数据库一般直接使用 SQL 交互,而非关系型数据库交互方式各不相同。
非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活。
不管是否关系型数据库,大家都在尝试支持 SQL(子集)和 “事务”。
3.4.1 Elasticsearch
- 面向「文档」存储
- 文档可序列化成
JSON
,支持嵌套 - 存在「index」,index = 文档的集合
- 存储和构建索引能力依赖 Lucene 引攀
- 实现了大量搜索数据结构 & 算法
- 支持
RESTFUL API
,也支持弱SQL
交互
3.4.2 MongoDB
- 面向「文档」存储
- 文档可序列化成
JSON/BSON
,支持嵌套 - 存在「collection」,collection = 文档的集合
- 存储和构建索引能力依赖 wiredTiger 引擎
- 4.0 后开始支持事务(多文档、跨分片多文档等)
- 常用
client/SDK
交互,可通过插件转译支持弱SQL
3.4.3 Redis
- 数据结构丰富(hash表、set、Zset、Iist)
- C语言实现,超高性能
- 主要基于内存,但支持 AOF/RDB 特久化
- 常用
redis-di
/多语言 SDK 交互
3.5 分布式数据库
鉴于单机数据库遇到的如下问题:
- 容量:单点容量有限,受硬件限制;
- 弹性:用户的需求在弹性变化;
- 性价比:单机的硬件参数是固定的,可能会有资源浪费;
我们开始采用分布式数据库(池化技术)。