ARID磁盘阵列
Q : 单机存储系统怎么做到高性能/高性价比/高可靠性
A : R(edundant) A(array) I(nexpensive) D(isks)
ARID的使用背景
- 单块大容量磁盘的价格 > 多块小容量磁盘
- 单块磁盘的写入性能 < 多块磁盘的并发写入功能
- 单块磁盘的容错能力有限,不够安全
常见ARID方案
- RAID 0
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘带宽
- 没有额外的容错设计
例如一条1G的数据1被拆成两条512M数据,分别写道磁盘1和磁盘2上,然后磁盘1和磁盘2的第一个512M共同组成数据1
- RAID 1
- 一块磁盘对应着一块额外的磁盘
- 真实空间利用率仅50%
- 容错能力强
RAID 1和RAID 0是两个极端,把一条数据copy一份放在两个磁盘上
- RAID 0 + 1
- 结合了 RAID 0 和 RAID 1
- 真实空间利用率只有50%
- 容错能力强,写入宽带好
例如说,现在有四块磁盘,可以把它两两组成一个 RAID 0,然后再把组成的单元用 RAID 1 组成起来或者组成 RAID 1,然后再用 RAID 0 组成起来,虽然空间利用率还是只有50%,但是还用上了 RAID 1 的条带化写入,并发存储,写入带宽能翻几倍。
数据库
关系 = 集合 = 任意元素组成的若干有序偶对反应了事物间的关系
关系代数 = 对关系作运算的抽象查询语言(交、并、笛卡尔积……)
SQL = 一种DSL(领域特定语言)
单机数据库
单机数据库 = 单个计算机节点上的数据库系统
事物在单机内执行,也可能通过网络交互实现分布式事物


关系型数据库
关系型数据库是存储系统,但是在存储之外,有发展出其他功能
- 结构化数据友好
- 支持事务(ACID(原子性,一致性、隔离性,持久性))
- 支持复杂查询语言

非关系型数据库
非关系型数据库也是存储系统,但是一般不要求严格的结构化
关系型数据库一般直接使用 SQL 交互,而非关系型数据库交互方式各不相同
非关系型数据库的数据结构千奇吧百怪,没有关系约束后,schema相对灵活
单机存储系统
单机存储系统 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
本地文件系统
Linux经典哲学:一切皆文件
- 文件系统管理单元:文件
- 文件系统接口:如Ext2/3/4,sysfs,rootfs等,但都遵循VFS的统一抽象接口
- Liunx文件系统的两大数据结构:Index Node & Directory Entry

Key-value存储
- 常见使用方式:put(k, v) & get(k)
- 常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写性能
分布式存储系统
分布式存储系统 = 在单机存储基础上实现了分布式协议,涉及大量网络交互
可以解决容量、弹性、性价比问题:
单机数据库通过本地文件系统提供的文件接口,在底层的存储介质读/写文件,这有个很明显的问题,就是存储是有限的,所以我们现在普遍使用的是池化的技术,把存储能力做成了一个存储池,存储池由物理或者虚拟机组成,存储池与数据库是用网络进行交互,这样,数据库就不需要看本身的存储能力够不够,只要存储池在达到预值后自动添加存储节点,把数据的写入分配到新加入的存储节点即可
解决弹性问题
HDFS
堪称大数据时代的基石
核心特点:
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 使用普通x86服务器,性价比高

Ceph
开源分布式存储系统里的==万金油
核心特点:
- 一套系统支持对象接口、块接口、文件接口,但是一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用CURSH算法