根据存储数据类型的不同以及I/O读写速度的差异,分布式存储系统具有结构化存储系统、非结构化存储系统、半结构化存储系统和内存缓存系统4种类型。
1.结构化存储系统
结构化数据是一种用户定义的数据类型,它包含了一系列的属性,每个属性都有一个数据类型,在关系数据库(又称关系型数据库)中通常用一个二维表结构来表达实现的数据。结构化存储的典型例子就是事务处理系统或者关系数据库(RDBMS)。例如,Oracle、SQL Server或MySQL等就是典型的关系数据库。传统的结构化存储系统强调的是结构化数据之间的关系、数据的强一致性、随机访问等特性。正是由于这些特性,结构化存储系统的可扩展性通常都不太好,在一定程度上限制了结构化存储在大数据环境下的应用。当系统规模大到单一节点的数据库无法支撑时,通常需要对数据库进行切分。
数据库切分有垂直切分与水平切分之别。垂直切分是按照功能切分数据库,将不同功能的数据存储在不同的数据库中。这样,一个大数据库就被切分成了多个小数据库,从而实现数据库的扩展。水平切分是按照数据行进行切分,即将表中的某些行切分到一个数据库中,而另外的某些行被切分到其他数据库中。为了能够比较容易地判断各行数据切分到了哪个数据库,切分总是需要按照某种特定的规则进行,如按照某个数字字段的范围、某个时间类型字段的范围切分,或者按照某个字段的Hash值切分。垂直扩展与水平扩展各有优缺点,一般一个大型系统会将水平扩展与垂直扩展结合使用。
2.非结构化存储系统
相对于结构化数据而言,不方便使用数据库二维逻辑表来表现的数据即称为非结构化数据。非结构化数据的字段长度不等,并且每个字段的记录又可以由可重复或不可重复的子字段构成,没有规律可循,如办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频等数据。非结构化存储的特点是具有高可扩展性。与结构化存储系统相比,虽然分布式文件系统的可扩展性好,吞吐量非常高,但无法支持随机访问,通常只能进行文件追加操作。这种限制使得非结构化存储系统难以应对低延迟、实时性较强的应用。
3.半结构化存储系统
半结构化数据是介于完全结构化数据(如关系数据库、面向对象数据库中的数据)和完全无结构的数据(如声音、图像文件等)之间的数据。HTML文档就属于半结构化数据,它一般是自描述的,数据的结构和内容混在一起,没有明显的区分。半结构化数据没有严格的模式(Schema)定义,不适合用传统的关系数据库进行存储。结构化数据即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现。结构化数据的模式和内容是分开的,数据模式需要预先定义。
为解决结构化、非构化存储系统存在的问题,提出了半结构化存储。适合半结构化数据存储的存储系统称作“NoSQL”数据库,如NoSQL、Key-Value Store、Protobuf、Thrift等都属于半结构化存储系统。其中,NoSQL的发展应用尤为强劲。NoSQL被称作下一代的数据库,是具有非关系型、分布式、轻量级、支持水平扩展等特点,且一般不保证遵循ACID原则的数据储存系统。NoSQL系统既有分布式文件系统所具有的可扩展性,又有结构化存储系统的随机访问能力。该系统在设计时通常选择简单键值(K-V)进行存储,抛弃了传统RDBMS中的复杂SQL查询以及ACID事务。比较典型的NoSQL系统是Bigtable、HBase、Dynamo、Cassandra等非关系数据库。
4.内存缓存系统
随着业务的并发度越来越高,存储系统对低延迟的要求也越来越高。基于内存的存储系统将数据存储在内存中,从而获得读写的高性能,其中比较有名的系统是Memcached和Redis。Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。Redis采用内存中(in-memory)存储数据集的方式,支持数据的持久化,可以每隔一段时间将数据集转存到磁盘上。另外,还有一些偏向于内存计算的系统,如分布式共享内存(DSM)、RamCloud、Tachyon等。其中RamCloud是由斯坦福大学提出的完全使用内存(DRAM)的一种存储系统,它的所有数据都保存到内存中。