零、数据分类
1、非结构化数据:文本,图片,音频,视频等。这类数据一般称为Blob(Binary Large Object, 二进制大对象)。
2、结构化数据:可用表结构表示,具有相应的模式(Schema:如属性,数据类型和数据间的联系),模式和内容分开,需预先定义。一般存储在关系型数据库中。
3、半结构化数据:介于结构化和非结构化数据直接。具有自描述性,模式和内容混在一起,如HTML。
一、分布式存储系统
1、分布式文件系统:存储文本,图片,音视频等非结构化数据。如google的GFS/colossus和开源的hdfs。
2、分布式键值系统:存储简单的半结构化数据。NoSql的分布式扩展,只提供基于key的增删改查(CRUD)功能。如Amazon的Dynamo。
3、分布式表格系统:存储复杂的半结构化数据。相较于分布式kv系统,他还支持基于key的范围查找。但相对于关系型数据库,他不支持复杂的操作,如多表关联,嵌套查询。典型的系统如google的bigtable和开源的hbase。
4、分布式数据库:存储结构化数据。分布式的关系型数据库。提供SQL关系查询语言。如:google的spanner和开源的hive。
二、单机存储引擎
存储系统提供的基本功能包括:增删改查(CRUD)。不同的存储方案根据业务不同侧重点不同,导致存储系统的性能和功能具有一定的差异。
目前主要的单机存储引擎有:
1、哈希存储:hash的CRUD是最快的。但缺点是不支持顺序扫描。bitcask是一个基于hash表结构的存储系统。他将写操作(包括删除标识)追加到文件尾。并定期合并新老文件&记录。
2、B树:笔者曾经思考过既支持随机读取又支持范围查找的系统。个人结论是B树就是为此而生。查找时间复杂度为logd(n)(d为每个节点的出度)。Mysql的InnoDB的引擎和OS的文件系统使用的就是B+树。(为什么选择使用B树的变种B+树,读者有兴趣可以去探究下。提示:磁盘读取)
3、LSM树(Log Structured Merge Tree):由B+数改进而来。其思想为:将增量写操作保存在内存中,超过阈值时刷入磁盘,从而减少随机写磁盘操作。读操作则需要合并磁盘数据和内存中的写操作。通过Memtable/SSTable实现,实现细节在此不做深入探究。比较适合写操作较多的业务场景。HBase中的列簇的数据存储方式采用的即是LSM树。
三、分布式系统的数据分布
上面讲的仅仅是单机的存储引擎,在分布式系统上,最基本的一个问题就是如何对数据分片。主要有两种数据分布方式:
1、哈希分布:比较适用于键值系统。和单机的hash存储一样,缺点是不支持顺序扫描。哈希的选取比较重要:
a) 若随机散列,可能同个用户的多条记录落在不同的节点中,同时操作一个用户的多条记录将比较困难。
b) 按用户散列时,当用户数据分布不均时,可能导致数据倾斜。单节点压力将会较大。
而传统的哈希算法还有一个较严重的问题是:当有节点失效或者需要新增节点时(非成倍增加),所有的节点数据都要重新分布,造成大量的数据迁移。解决这个问题的方法是采用大家耳熟能详的"一致性哈希"。具体笔者下一节进行细节描述。
2、顺序分布:适用于分布式表格系统/分布式关系数据库。优点不言而喻:支持范围扫描。类似于B+树,总控服务器负责数据的分布,维护着类似B+树的一套索引结构,根(root)表维护着元(meta)数据表的位置信息, 元(meta)数据表维护着用户(user)的真实数据表的位置信息。user表随着增删的操作,需要根据表的大小变化进行拆分和合并操作,并将表的变化操作记录于元(meta)数据表。
--------------------------END----------------------------------