这是我参与「第五届青训营 」笔记创作活动的第11天
一个系统需要有存储,才是有状态的。我们平时在开发时,选用的存储系统都理所当然地选择数据库,但却没有考虑过使用其它形式存储系统的可能性。数据库自然是首选,但为什么要选择数据库,是我们要考虑的问题。
存储系统-系统概览
存储系统,是提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。
系统特点:
- 性能敏感
- 容易受硬件影响
- 代码即“简单”又“复杂”
存储器层级结构:大家学计组的时候都有了解过,大致上就是越慢,越大,越便宜,反之亦然。
- 缓存很重要,贯穿整个存储体系
- 拷贝很昂贵,应尽量减少
- 硬件设备五花八门,需要抽象统一的接入层
RAID技术
单机存储系统如何做到高性能/高性价比/高可靠性? R(edundant) A(rray) of I(nexpensive) D(isks)
RAID 0
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘带宽
- 没有额外容错设计
RAID 1
- 一块磁盘对应一块额外镜像盘
- 真实空间利用率仅50%
- 容错能力强
RAID 0 + 1
- 结合两者
- 真实空间利用率仅50%
- 容错能力强,写入带宽好
数据库和存储系统
数据库:
- 关系型数据库
- 非关系型数据库
关系型数据库是存储系统,但是在存储之外,又发展出其他能力(结构化数据友好,支持事务,支持复杂查询语言)
非关系型数据库也是存储系统,但一般不要求严格的结构化(半结构化数据友好,可能支持事务,可能支持复杂查询语言)
数据库支持事务,优于经典存储。
事务以我的了解,主要的功能是保证一致性和可恢复性。详细可见这篇笔记:[[事务管理]]
主流存储产品
本地文件系统
Linux经典哲学:一切皆文件 Linux两大数据结构:Index Node & Directory Entry
key-value存储
常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能。
分布式存储
在单机存储基础上实现了分布式协议,涉及大量网络交互
因此网络和分布式应该是后端从业者比较重要的两门课了。
HDFS:堪称大数据时代的基石
Ceph:
- 一套系统支持对象接口、块接口、文件接口,但是一切皆对象
- 数据写入采用主被复制
- 数据分布模型采用CRUSH算法(HASH+权重+随机抽签)
单机数据库
事务可以单机执行,也可以通过网络实现分布式事务。
存储与数据库的新技术
- 软件架构变更
- Bypass OS kernel
- AI增强
- 智能存储格式转换
- 新硬件革命
- 存储介质变更
- 计算单元变更
- 网络硬件变更
SPDK
Storage Performance Development Kit
- Kernel Space -> User Space
- 中断->轮询
- 无锁数据结构
课后
可以实现一个(分布式)key-value存储系统。(这不比大项目难?)