存储系统
一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统
存储器层级结构(硬件)
塔尖容量小且访问速度快,塔底容量更大但是访问速度慢
Persistent Memory(持久内存):结合了存储介质的非易失性和内存的高速访问特点。
数据怎么从应用到存储介质(软件)
- 存储链路上 缓存 很重要,贯穿整个存储体系。硬件存储介质访问方式可能并不方便,缓存使得访问方式更为友好
- 拷贝 很昂贵,应该尽量减少。存储链路上可能会经历多次数据拷贝
- 硬件设备五花八门,需要有抽象统一的接入层
例子:用户数据从持久化到单机储存
RAID技术
Redunbant Array of Inexpensive Disks
RAID 0
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘带宽
- 没有额外的容错设计
RAID 1
- 一块磁盘对应一块额外镜像磁盘
- 真实空间利用率50%
- 容错能力强但并没有性能上的提升
RAID 0+1
- 结合以上两者的特点
- 真实空间利用率仅50%
- 容错能力强,写入带宽好
数据库
关系型数据库和非关系型数据库
- 关系=集合=任意元素组成的若干有序偶对应反应了事物间的关系
- 关系代数=对关系做运算的抽象查询语言
- SQL=一种DSL=方便人类阅读的关系代数表达形式
关系型数据库是一种存储系统,同时具有以下功能:
- 结构化数据友好
- 支持事务(ACID)
- 支持复杂查询语言
非关系型数据库也是一种存储系统,但是一般不要求严格的结构化
- 半结构化数据友好
- 可能支持事务(ACID)
- 可能支持复杂查询语言
对比:结构化数据管理
一条用户注册数据写入关系型数据库可能以表形式管理。非关系型数据库没有预定义的模式,数据可以自行定义管理结构存储,如文档、键值对、图形等。
对比:事务能力
事务具有:
- Atomicity,事务内操作要么全做,要么不做
- Consistency,事务执行前后,数据状态是一致的
- Isolation,可以隔离多个并发事务,避免影响
- Durability,事务一旦提交成功,数据保证持久性
经典存储相比数据库需要更多的代码逻辑来实现较好的事务能力
主流产品剖析
单机存储
单个计算机节点上的存储软件系统,一般不涉及网络交互,例如本地文件系统,key-value存储
本地文件系统 - 以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实现)
key-value存储
常见使用方式:put(k, v) & get(k) 常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能
拳头产品:RocksDB
顺序写入key-value,左边内存数据结构MemTable中满了后将MemTable中的内容储存到Immutable MemTable,一段时间后写入Disk。Disk中Level 0中装满后在下刷到Level 1
分布式存储
在单机存储基础上实现了分布式协议,涉及大量网络交互,例如分布式文件系统、分布式对象存储
HDFS
特点:
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 使用普遍x86服务器,性价比高
Ceph
- 一套系统支持对象接口、块接口、文件接口,一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH分布算法(HASH + 权重 + 随机抽签)
单机数据库
单机数据库 = 单个计算机节点上的数据库系统,事务在单机内进行,也可能通过网络交互实现分布式业务
单机关系型数据库Oracle, MySQL, PostgreSQL
内存中数据基本为树状,当用户更改数据时即为更新Page,同时记录操作日志(Redo Log)。
磁盘中有三类文件Page File, Redo Log Files, Others(例如临时数据)
MySQL
关系型数据库通用组件:
- Query Engine —— 负责解析query,生成查询计划
- Txn Manager —— 负责事务并发管理
- Lock Manager —— 负责锁相关策略
- Storage Engine —— 负责组织内存/磁盘数据结构
- Replication —— 负责主备同步
PostgreSQL
- 关键内存数据结构:B-Tree, B+-Tree, LRU List等
- 关键磁盘数据结构:WriteAheadLog(RedoLog), Page
单机非关系型数据库MongoDB, Redis, Elasticsearch
Elasticsearch
- 面向文档存储
- 文档可序列化成JSON,支持嵌套
- 存在index,index = 文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构&算法
- 支持RESTFUL API,也支持弱SQL交互
mongoDB
- 面向文本存储
- 文档可序列化成JSON/BSON,支持嵌套
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0之后开始支持事务(多文档、跨分片多文档等)
- 常用client/SDK交互,可通过插件转译支持弱SQL
Redis
- 数据结构丰富(hash表, set, zset, list)
- C语言实现,超高性能
- 主要基于内存,但支持AOF/RDB持久化
- 常用redis-cil/多语言SDK交互