01、存储系统
Q:什么是存储系统?
A:一个可以提供读写、控制类接口,能够安全有效的把数据持久化的软件。
存储系统参与方:
- 用户
- 存储介质
- 内存:可能会读到内存做一些修改。
- 网络:分布式存储系统,需要网络传输数据。
存储系统的特点:
- 作为后端软件的底座,性能敏感
- 容易受硬件影响
- 存储系统的代码,既“简单”,又“复杂”。 简单值得是操作存储系统的代码要简单,复杂指的是错误条件要考虑到,多做逻辑判断。
存储器层级结构:
数据怎么从应用到介质
在这个过程中,缓存很重要,因为有些硬件仅支持一个字节一个字节的存储,这时候使用缓存可以节省磁盘IO。
拷贝也应该尽量减少,每次拷贝都会占用CPU时间,如果CPU都用来拷贝,那么这个系统的效率很低。
1.1、RAID 技术
RAID: Redundant Array of Inexpensive Disk
- 单块大容量磁盘的价格 ==>==多个小的磁盘价格
- 单块磁盘的写入性能 ==<==多块磁盘的写入性能
- 单块磁盘的容错能力有限,不够安全。
==RAID 0==:
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘带宽
- 没有额外的容错设计
- 缺点:没有容错
==RAID 1==:主打容错,写入磁盘后会额外复制到另一个磁盘中
- 一块磁盘对应一块额外镜像盘
- 真实利用率 50%
- 容错能力强
==RAID 0 + 1==:
- 结合 RAID 0 和 RAID 1
- 真实空间利用率50%
- 容错,提高磁盘带宽
1.2、数据库
数据库分为:关系型数据库、非关系型数据库。
关系模型:关系就是任意元素组成的若干有序偶对,反映了事物间的关系。
关系型数据库就是存储系统,但是在存储之外,又发展出其他能力:
- 结构化数据友好
- 支持事务
- 支持复杂查询语言
非关系型数据库也是存储系统,但是一般不要求严格的结构化:
- 半结构化数据友好
- 可能支持事务
- 可能支持复杂查询语言
数据库 VS 经典存储- 结构化数据管理
数据库优。
数据库 VS 经典存储- 事务能力
- Atomicity, 事务内的操作要么全做,要么不做。
- Consistency:事务执行前后,数据状态是一致的。假设A账户里面有1000元,B账户里面没有,A向B转账500, 转账后正确的应该是各有500元,这时候数据状态是一样的,反之不一样。
- Isolation:可以隔离多个并发事务。
- Durability:事务一旦提交,数据保证持久性。这个意思是,事务一旦提交成功,就是成功了,不会在若干秒后再说自己失败了。
数据库优。
数据库 VS 经典存储- 复杂查询能力
例如:请查询出名字以xiao开头,且密码提示问题小于10个字的人,并按性别分组统计人数
数据库更好。
02、主流产品剖析
2.1、单机存储
单机存储:单个计算机节点上的存储软件系统,一般不涉及网络交互:
- 本地文件系统
key-value存储
本机文件系统
文件系统的管理单元:文件
文件系统接口:如Ext2/3/4等,都遵循VFS的统一抽象接口。
Linux文件系统的两大数据结构:Index Node & Directory Entry
Index Node: 记录文件元数据,如id,大小,权限,磁盘位置等,inode是一个文件的唯一标识,会被存储到磁盘上,inode的总数在格式化文件系统的时候就固定了。
Directory Entry:记录文件名,inode指针,层级关系。dentry是内存结构,与inode的关系是N:1的(硬链接的实现)。
key-value存储
常见使用方式:put(k,v) & get(k)
常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能。
拳头产品:RocksDB
2.2、分布式存储
定义:在单机存储的基础上实现了==分布式协议==,设计大量的网络交互。
产品:
HDFS:堪称大数据时代的==基石==,多个便宜的硬件组合使用。
- 支持海量存储数据
- 高容错性
- 弱POSIX语义
- 使用普通的
X86服务器,性价比高。
先在NameNode中找到数据节点的实际物理地址,然后再去寻找。
Ceph:开源分布式存储系统里的万金油。
特点:
- 一套系统支持对象接口、块接口、文件接口,但是一切都是对象。
- 数据写入采用主备复制。
- 数据分布模型采用
CRUSH算法。(数据分布:备份数据应该放在哪些服务器上)
2.3、单机关系型数据库
定义:单个计算机节点上的数据库系统,换句话说,事务在单机内执行,也可能通过网络交互实现分布式事务。
商业产品Oracle是主流,开源产品Mysql和PostgreSQL比较好
关系型数据库通用组件:
| 组件 | 用处 |
|---|---|
Query Engine | 负责解析Query,生成查询计划。 |
Txn Manager | 负责事务并发管理。 |
Lock Manager | 负责锁相关的策略 |
Storage Engine | 负责组织内存/磁盘数据结构 |
Replication | 负责主备同步 |
数据结构:
| 位置 | 数据结构 |
|---|---|
| 内存 | B-树,B+树,LRU List |
| 磁盘 | Page,WriteAheadLog (RedoLog 操作日志) |
Redo Log: 我们修改数据库中一条数据时,会现在内存中找到对应节点,然后修改,这时候,要记录本次操作做了什么,记录的文件就是RedoLog
Temp Data:当内存不够用给的时候,用户操作产生的临时数据会存到Temp Data中,放到磁盘,当内存够用了,再从磁盘都进来重组。
2.4、单机非关系型数据库
三大主流产品:MongoDB:文档存储、Redis:key-v、Elasticsearch:文档
ElasticSearch- 面向【文档】存储
- 文档支持序列化成
JSON,支持嵌套 - 存在【index】,index=文档的集合
- 存储和构建索引能力依赖Lucene引擎。
- 实现了大量搜索数据结构 & 算法
- 支持
RESTFULL API,也支持弱SQL
mongoDB- 面向【文档】存储
- 支持序列化成
JSON、BSON,支持嵌套 - 存在【collection】, collection=文档的集合
- 存储和构建索引能力依赖于
wiredTiger引擎 4.0后开始支持事务(多文档、跨分片多文档)- 常用
Client/SDK交互,也可以通过插件转译支持弱SQL - C语言编写
Redis- 数据结构丰富
- C语言实现,超高性能
- 主要基于内存,但是支持
AOF/RDB持久化 - 常用
Redis-cli/多语言SDK交互。
2.5、分布式数据库
.....待补充