特性
- 可拓展
- 低成本
- 高性能
- 易于使用
挑战
数据的持久化,数据的一致性
数据分类
- 非结构化数据:文本,音视频等
- 结构化数据:一般存储在关系数据库中的数据
- 半结构化数据:有数据也有结构,html文档
分布式存储
1.分布式文件系统
用于存储 Blob 对象(非结构化数据,这类数据以对象形式存储,对象之间没有关联),Haystack,TFS,也可以作为分布式表格系统的底层存储。
存储对象:
- Blob 对象
- 定长块
- 大文件
2.分布式键值系统
用于存储关系简单的半结构化数据,只提供基于主键的CRUD(create/read/update/delete) 功能
与传统的哈希表比较类似,但是他可以将数据分布到集群中的多个存储节点。一般用作缓存,算法使用一致性哈希。
分布式表格系统
用于存储关系较复杂的办结构化数据。不仅支持简单的CRUD操作,而且要支持扫描某个主键范围。
主要针对单张表格的操作,不支持复杂操作。由主键标识一行。
同一个表格的多个数据行也不要求包含相同类型的列,适合半结构化数据。
分布式数据库
用于存储结构化数据。由单机关系数据库拓展而来。采用二维表格组织数据,提供SQL查询语句,支持多表,事务等等
缺点:拓展性,高并发性能
问:为啥二维表格的存储形式就是不可拓展的呐?
单机存储系统
单机存储引擎
-
哈希存储引擎(不支持顺序扫描,对应 KV 存储系统)
-
B 树存储引擎(会支持顺序扫描,对应关系数据库存储系统)
-
LSM 树存储引擎(通过批量转储技术规避磁盘随机写入问题,广泛应用,如:Google Bigtable,Google LevelDB,以及facebook 的 Cassandra)
哈希存储引擎(不支持顺序扫描,Bitcask)
仅支持追加操作,只追加不允许修改老的数据,当旧的文件达到一个限制时,就会产生一个新的文件,老的文件只读不写。
在任意时刻,都是只有一个文件可写,用于数据追加,称为活跃数据文件。
- 数据结构
每一项数据记录为:
内存中采用基于哈希表的索引数据结构,主要是为了通过主键快速定位 value 的位置。
哈希表的每一项包含三个定位数据的信息:file_id,value_pos,value_sz。
2. 快速恢复
索引文件,就是将索引关系保存在一个文件中。然后断电后就可以直接加载这个文件即可。
B 树存储引擎(会支持顺序扫描,对应关系数据库存储系统)
同 B 树索引
LSM 树存储引擎(通过批量转储技术规避磁盘随机写入问题,广泛应用,如:Google Bigtable,Google LevelDB,以及facebook 的 Cassandra)
将对于数据的修改保存在内存中,当达到大小限制时批量写入磁盘。
读取的时候合并磁盘中的历史数据和内存中最近的修改操作。有效规避磁盘随机写入问题。
- 存储结构
当 MemTable 达到一个上限时,就将旧的 MemTable 冻结为不可变,创建新的 MemTable接受新的数据。之后,将不可变的Memtable 排序转储到磁盘,形成新的 SSTable文件。
SSTable 中的文件是按照记录的主键排序的。
LevelDB 只支持随机读取单条记录
,所以查询时的顺序就是:新的Memtable->旧的Memtable->从新到老去读取磁盘中的SSTable文件。
- 合并
会将这个层级与上一个层级的 SSTable 文件进行一个合并,如果没有保存价值,就会直接抛弃。否则,写入新的文件中。
数据模型
1.
分布式系统
基本概念
1. 异常
- 异常类型
- (1) 服务器宕机
宕机的原因不再多说,需要面临的问题就是:服务器重启会导致丢失内存信息,如何持久化?如何通过持久化介质恢复内存信息,从而恢复服务器的之前的状态。
- (1) 服务器宕机