这是我参与「第五届青训营 」伴学笔记创作活动的第15天
前言
本文介绍了存储结构和数据库,从历史发展、主流产品剖析到未来的发展方向等进行了详细介绍。本文主要是进行总结和科普,具体的实操还是需要大家下面自己查找资料。
1.一个案例
数据产生->数据流动->数据持久化(校验合法性、修改内存、写入存储介质)
- 产生的问题:数据丢失、多人修改、编程语言、结构化数据等
2.存储系统
需要从硬件反推软件
1.定义
一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件
要素:用户、存储介质、内存、网络
2.特点
- 性能敏感
- 存储系统软件架构,易受硬件影响
- 代码既简单又复杂
3.层级结构
4.数据流程
我们发现,缓存很重要,拷贝应减少,需要有抽象统一的接入层
5.分类
- 块存储:存储软件栈里的底层系统,接口过于朴素
- 文件存储:日常使用最广泛的存储系统,接口十分友好,实现五花八门
- 对象存储:公有云上的王牌产品,immutable语义加持
- key-value存储:形式最灵活,存在大量的开源/黑盒产品
6.RAID
Redundant Array of Inexpensive Disks ,廉价磁盘冗余阵列
-
背景
- 单块大容量磁盘的价格 > 多块小容量磁盘
- 单块磁盘的写入性能 < 多块磁盘的并发写入性能
- 单块磁盘的容错能力有限,不够安全
-
分类
- RAID 0 :多块磁盘简单组合,数据条带化存储,但无容错设计
- RAID 1 : 一块磁盘对应一个镜像盘,容错能力强,但空间利用率为50%
- RAID 0+1 :上面两者的结合,容错能力强,写入带宽好
3.数据库
1.分类
特殊的存储系统
- 关系型数据库
- 非关系型数据库
ps:
- 关系 = 集合 = 任意元素组成的若干有序偶对,即反应了事物间的关系
- 关系代数 = 对关系作运算的抽象查询语言
- SQL = 一种DSL = 方便人类阅读的关系代数表达形式
2.关系型数据库
- 结构化数据友好
- 支持事务
- 支持复杂查询语言sql
3.非关系型数据库
一般不要求严格的结构化
- 半结构化数据友好
- 可能支持事务
- 可能支持复杂查询语言
4.与经典存储对比
- 结构化数据管理
- 关系型数据库是以表达式管理
- 经典存储是自行定义管理结构,面向bytes
- 事务能力
- 关系型数据库支持事务(ACID,之前文章讲述过事务的特点:原子性、一致性、独立性、持久性)
- 查询能力
- 数据库代码灵活、简洁
- 一般存储系统代码僵化、复杂
5.数据库使用方式
SQL常见操作: Insert、Update、Select、Delete、Where子句、GroupBy、OrderBy等
4.主流产品分析
1.单机存储
单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
分为两种存储方式:本地文件系统和key-value存储
本地文件系统
- 管理单元:文件
- 文件系统接口:VFS统一抽象接口
- Linux文件系统的两大数据结构
- Index Node :记录文件元数据,inode是文件唯一标识
- Directory Entry :记录文件名、inode指针、层级关系等,dentry是内存结构
key-value存储
- 常见使用方式:put(k,v)、get(k)
- 常见数据结构:LSM-Tree,追求写入性能
- 产品:RocksDB
2.分布式存储
分布式存储是在单机存储基础上实现了分布式协议,涉及大量网络交互
有两种存储方式:HDFS和Ceph
HDFS
- 大数据时代基石
- 背景: 高级硬件贵,数据存量大,要求超高吞吐
- 特点
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 性价比高,用普通x86服务器
- 框架
Ceph
-
开源分布式存储系统里的万金油
-
核心特点
- 支持对象接口、块接口、文件接口,但一切皆文件
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH算法(HASH+权重+随机抽签)
-
架构
3.单机数据库
单个计算机节点上的数据库系统
有两种存储方式:关系型数据库和非关系型数据库
关系型数据库
-
产品:商业产品Oracle,开源产品MySQL和PostgreSQL
-
通用组件
- Query Engine —— 负责解析query,生成查询计划
- Txn Manager —— 负责事务并发管理
- Lock Manager —— 负责锁相关的策略
- Storage Engine —— 负责组织内存/磁盘数据结构
- Replication--负责主备同步
- 关键内存数据结构:B-Tree、B+-Tree、LRU List等
- 关键磁盘数据结构: WriteAheadLog (RedoLog) 、 Page
-
框架:先在Page中存储数据,随后到内存中的缓存,之后数据转移到硬盘中
非关系型数据库
-
产品:MongoDB、 Redis、 Elasticsearch
-
特点:交互方式各不相同;数据结构多;尝试支持SQL和事务
-
Elasticsearch
- 面向文档存储
- 文档可序列化JSON,支持嵌套
- index = 文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构 & 算法
- 支持RESTFUL API,也支持弱SQL交互
- 模糊搜索,并能自动搜索出关联程度
-
MongoDB
- 面向「文档」存储
- 文档可序列化成JSON/BSON,支持嵌套
- collection = 文档的集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开始支持事务
- 常用client/SDK交互,可通过插件转译支持弱SQL
-
Redis
- 数据结构丰富(hash表、set、zset、list)
- C语言实现,超高性能
- 主要基于内存,但支持AOF/RDB持久化
- 常用redis-cli/多语言SDK交互
-
问题:容量、弹性、性价比
4.分布式数据库
- 容量问题:容量受硬件限制
- 弹性问题:扩缩容不灵活
- 性价比问题:容量与cpu利用率不平衡
以上问题都可以通过将将存储节点池化来解决
更多特点:
- 多写
- 内存弹性
- 分布式事务优化
5.新技术发展
1.分类
整体分为三个方向,如下
- 软件架构变更: Bypass OS kernel
- AI增强:智能存储格式转换
- 新硬件:存储介质、计算单元、网络硬件更新
2.SPDK
- Kernel Space-> User Space :避免syscall带来的性能损耗,直接从用户态访问磁盘
- 中断 -> 轮询 :提高IO性能,减少CS
- 无锁数据结构 :采用Lock-free queue,降低并发时同步开销
3.AI增强
采用AI决策,实现行列混存
4.高性能硬件
- RDMA网络:减少拷贝和CPU开销
- Persistenrt Menony:IO时延约在百纳秒量级
- 可编程交换机:交换机层对网络包做计算逻辑
- CPU、GPU、DPU: CPU更多核,GPU更强大算力和显存空间,DPU异构计算
小结
本文讲述了存储结构和数据库的基本知识,梳理下来让我更加理解存储方面的原理。这里只是一些理论讲解,具体的操作和语法还是需要自己去学习的,但是在这梳理之后,感觉语言并不是最重要的。毕竟,语法千千万,有思路,有思考,有收获才是最重要的!
参考
- 字节跳动带你认识存储&数据库教程