NoSQL数据库系统 【前瞻技术】


 

【前瞻技术】NoSQL数据库系统 

  半结构化和非结构化是大数据的重要特征之一,如何将数据组织成合理的结构是大数据管理中的一个重要问题,也是一项重大技术挑战[1]

 

1 NoSQL的产生

 

  出现于1998年的NoSQLCarlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。在2009年,Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace(全球三大云计算中心之一)的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。2009年在亚特兰大举行的no:sql(east)讨论会是一个里程碑,会上对NoSQL最普遍的解释是非关系型的,强调键—值对存储和文档数据库的优点,而不是单纯的关系型数据库。

  NoSQLNot Only SQL的简写,其含义是“不仅是结构化查询”,是不同于传统的关系型数据库的数据库管理系统的统称。NoSQLSQL的最显著的区别是NoSQL不使用SQL作为查询语言,其数据存储不需要固定的表格模式,也避免使用SQLJOIN操作,具有水平可扩展性。NoSQL的实现具有两个特征,使用硬盘或者尽可能把随机存储器当作存储载体。

  关系型数据库中的表存储的都是一些格式化的数据结构,每个元组字段的组成都一样,即使每个元组都需要所有的字段,但从另一个角度来说它是导致关系型数据库性能瓶颈的一个因素。而非关系型数据库以键—值对存储的结构不固定,每一个元组可以有不一样的字段,可以根据需要增加键—值对,这样就不会局限于固定的结构,可以减少时间和空间的开销。

  NoSQL是水平可扩展的数据库。水平扩展性指能够连接多个软硬件的特性,这样可以将多个服务器从逻辑上看成一个实体。NoSQL主要用于大规模的非关系型数据存储,具有模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等特性。除键—值对存储方式外,NoSQL还有文档存储方式、列存储方式、图形存储方式、XML存储方式等。

 

2 NoSQL特点与潜力

 

  CAPBASE和最终一致性是NoSQL数据库存在的3大基石。NoSQL存储满足了数据存储的横向伸缩性的需求。一些开源的NoSQL体系,如Facebook CassandraApacheHBase等都得到了广泛认同。

 

2.1 特点

 

  (1)运行在PC服务器集群上。PC集群非常方便并且成本很低,避免了传统商业数据库共享操作的复杂性和高昂成本。

  (2)突破了性能瓶颈。通过NoSQL架构可以省去将WebJava应用和数据转换成SQL格式的时间,执行速度快。

  (3)没有过多的需求。虽然关系型数据库提供了无可比拟的功能集合,而且在数据完整性上也绝对稳定,但是企业的具体需求可能没有那么复杂。

  (4)支持者源于社区。因为NoSQL项目都是开源的,因此它们缺乏供应商提供的正式支持。与大多数开源项目一样,NoSQL项目不得不从社区中寻求支持。

  (5)弹性扩展。NoSQL数据库从设计之初就是为了利用新节点的优势进行透明扩展,通常在设计时就考虑使用低成本的廉价硬件。多年来,当数据库的负载增加时,技术上多采用“纵向扩展”(安置更大型的服务器来承载增加的负载)而不是 “横向扩展”(在多台主机上分配增加的负载);但随着交易率和可用性需求的增加,数据库也正在迁移到云端或虚拟化环境中,横向扩展更为明显。

  (6)大数据量。为了满足数据量增长的需要,关系数据库的容量日益增加,单一数据库需要管理的数据约束的数量也变得越来越大。通过NoSQL,系统能够处理的数据量远超出了最大型的关系数据库所能处理数据的极限,如Hadoop开源软件处理的数据规模。

  (7)灵活的数据模型。键—值对存储与文档存储的NoSQL数据库允许应用任何结构,即使是定义更加严格的BigTable NoSQL数据库通常也允许创建新的字段。

 

2.2 NoSQL的潜力

 

  NoSQL数据库除了具有灵活的可扩展性和支持大数据量存储外,与关系数据库相比具有如下潜力。

  (1)降低管理的要求。虽然关系数据库在可管理性方面作出了很多改进;但是高端的关系数据库系统维护费用仍然十分昂贵,而且还需要DBA参与高端的关系数据库系统的设计、安装和调优。NoSQL数据库从一开始就是为了降低管理方面的要求而设计的,从理论上来说,自动修复、数据分配和简单的数据模型的确可以降低管理和调优方面的要求。

  (2)经济效率高。NoSQL数据库通常使用廉价的服务器集群来管理数据和事务数量,而关系数据库通常需要依靠昂贵的专用服务器和存储系统来完成这项工作。使用NoSQL可使每GB的成本或每秒处理事务的成本都比使用关系数据库少很多倍,即以花费更低的成本存储和处理更多的数据。

  (3)灵活的数据模型。对于大型的RDBMS来说,变更管理是一件很困难的事情。即使只对一个RDBMS的数据模型作很小的改动,也许还需要停机或降低服务水平。NoSQL数据库在数据模型约束方面更为宽松,其中的键—值对数据库和文档数据库可以让应用程序在一个数据元素中存储任何结构的数据。

 

3 NoSQL的主要类型

 

  基于存储方式的不同,可将NoSQL数据库分为文档式存储、列式存储、键—值式存储、对象式存储、图形式存储和XML存储的NoSQL数据库[2]。表1所示的内容就是各种典型的NoSQL数据库产品,它们之间也有交叉,如Tokyo Cabinet / TyrantTable既可以划为键—值式存储类型,又可以理解为文档型存储类型。

 

存储类型及其所对应的典型NoSQL数据库

 

存储类型

典型的NoSQL数据库产品

文档式存储

MongoDB

BaseX

CouchDB

eXist

Jackrabbit

Lotus Notes

MarkLogic Server

Terrastore

OrientDB

列式存储

Hbase

Cassandra

Hypertable

键—值式存储

Redis

Tokyo Cabinet/ Tyrant

Flae

BigTable

Memcachedb

Keyspace

对象式存储

Db4o

Versant Object Database

iBoxDB

GemStone/S

InterSystems Caché

JADE

Objectivity/DB

ZODB

ObjectStore

图形式存储

Neo4J

FlockDB

AllegroGraph

DEX

XML式存储

Berkeley DB XML

BaseX

 

 

  NoSQL数据库也可以按使用的不同语言类型进行分类,有的NoSQL数据库用C/C++编写,有的用Java编写,还有的用Erlang编写,每种NoSQL数据库都有独到之处,用户可以根据需要选择使用。

 

3.1 文档式存储NoSQL

 

  文档存储式NoSQL数据库又简称文档数据库,其存储的内容为文档型数据,主要解决的问题不是集中于高并发读写操作,而是保证海量数据存储,同时具有良好的查询性能。存储式NoSQL数据库主要面向集合存储:

  (1)文档相当于关系数据库中的一条记录;

  (2)多个文档组成一个集合,集合相当于关系数据库的表;

  (3)多个集合逻辑上组织在一起就是数据库。

  例如,文档数据库(MongoDB)中的一个文档为:

  1. {

  2. "name":"zhang",

  3. "scores": [75, 99, 87.2]

  4. }

 

3.2 键—值存储式NoSQL

 

  键—值存储式NoSQL数据库是最常用的NoSQL数据库,它的数据以键—值的形式存储,虽然它的处理速度非常快,但基本上只能通过键的完全一致查询来获得数据。基于数据保存方式可分为临时式、永久式和混合式3种。临时式方式主要特点是:在内存中保存数据,数据有可能丢失,可以快速保存和读取。永久式方式的主要特点是:在硬盘上保存数据,数据不会丢失,可以快速保存和读取,但速度比临时式慢。混合式集中了前两种方式的优点,先将数据保存在内存中,在满足特定条件后将数据写入硬盘,主要特点是:同时在内存和硬盘上保存数据,可以快速保存和读取数据,保存在硬盘上的数据不会丢失,适于处理数组类型的数据。键—值存储式NoSQL数据库按照键—值对的形式进行组织、索引和存储数据。键—值对存储非常适合不涉及过多数据关系和业务关系的数据,能有效减少读写磁盘的次数,比SQL数据库存储拥有更好的读写性能,因为它不考虑值的存储格式,直接用键值快速查询到所需值。键—值存储式NoSQL数据库的主要特点是具有极高的并发读写性能,如BigTableGoogle设计的分布式数据存储系统,是用来处理海量数据的一种非关系型数据库。

 

3.3 列式存储NoSQL

 

  列式存储NoSQL可以实现按列存储数据,最大的特点是方便存储结构化和半结构化数据,方便数据压缩,对于某一列或某几列的查询有非常大的I/O优势。

  在列式存储中,列簇(Column Family)、超列(Super Column)和列(Column)是重要的概念。列簇和超列在数据库中不占空间,也就是说如果它们没有值,它们只占用0个字节,列簇与传统数据库中的表类似,但和表又不一样,在列簇中的唯一定义是名称和键排序选项。

  (1)列:列是一个由名称、值和时间戳组成,可忽略时间戳,将前两者当作一个键—值对。

  (2)超列:超列是一个字典,它是一个包含其他列的列,但不能包含另一个超列。

  (3)列簇:一个列簇中的所有数据都将保存在相同的文件中,一个列簇可以容纳多个超列或列。

 

3.4 对象式存储NoSQL

 

  对象式存储NoSQL可以通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

 

3.5 图形式存储NoSQL

 

  图形式存储NoSQL是图形关系的最佳存储方式,如果使用传统的关系数据库来解决则带来性能低的问题,而且设计也不方便。如AllegroGraphDEXNeo4JFlockDB等数据库都是NoSQL数据库。

 

3.6 XML式存储NoSQL

 

  XML存储方式的NoSQL能够高效存储XML数据,并支持XML内部查询语法。

 

4 NoSQL系列发展现状

 

  计算机体系结构在数据存储方面要求应用架构具备庞大的水平扩展性,这是分布式系统的一个重要标志。分布式系统设计遵循CAP定理,在一致性、可用性和分区容错性3个核心需求不可全得,关系数据库主要满足一致性和可用性两个核心需求,特别是要求强一致性,主要是通过数据库锁或JTA/JDBC事务实现,对于这种苛刻的一致性要求,很难实现分区容错性;而NoSQL数据库主要满足可用性和分区容错性两个核心需求,在一致性方面采用了最终一致性,这是一种弱一致性。下面列举几种NoSQL 数据库。

 

4.1 Cassandra

 

  Cassandra是一个云计算方面理想的数据库。它集成了Solr等流行工具,现已成为一个完全成熟的大型数据存储工具。Cassandra是一个混合型非关系型数据库,类似于GoogleBigTableCassandra是由多个数据库节点共同构成的一个分布式网络服务系统。对Cassandra的一个写操作将被复制到其他节点上去,而对Cassandra的读操作也将被路由到某个节点上面去读取。

 

4.2 Lucene/Solr

 

  Lucene/Solr是一个开放源代码的全文检索引擎工具包。它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,采用了与其他NoSQL数据存储相似的模型。如果查询并不是仅仅局限于精确匹配,而是寻找出那些出现在块中的字或者字段,那么Lucene/Solr是最好的查询手段。

 

4.3 Riak

 

  Riak是由技术公司Basho开发的一个类似Dynamo的分布式键—值对系统,具有分布式、水平扩展性、高容错性等特点。在Riak中,Map/Reduce函数只能使用JavaScript或者Erlang来编写。该系统还为类似于Solr的搜索提供全文索引,同时还提供一个控制面板,可以查看集群信息。

 

4.4 CouchDB

 

  CouchDB是用Erlang开发的面向文档的数据库系统,其数据存储方式类似Luceneindex文件格式。CouchDB是一个面向Web应用的新一代存储系统。作为一个分布式的数据库,CouchDB可以把存储系统分布到多台物理节点上,并且很好地协调和同步节点之间的数据读写一致性。CouchDB支持REST API,可以让用户使用JavaScript来操作CouchDB数据库。

 

4.5 Neo4J

 

  Neo4J存储的是对象之间的关系,或者说这种结构就是数学中的图。Neo4J是一个面向网络的数据库,即它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络上,而不是存储在表中,当然也可以把Neo4J看作是一个高性能的图引擎,该引擎具有健壮的数据库的所有特性。Neo4J包括很多有关搜索和分析的关系算法,利用这些图的遍历算法,可以减少指针查询的开销。

 

4.6 HBase

 

  HBase(Hadoop Database)数据库是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,可在廉价PC Server上构建大规模结构化存储集群。HBase是开源软件,与Google BigTable类似,BigTable利用GFS作为其文件存储系统,而HBase利用HDFS作为其文件存储系统;Google运行MapReduce来处理BigTable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据。

 

4.7 BigTable/ Accumulo/ Hypertable

 

  BigTable是非关系型数据库,是一个稀疏的、分布式的、持久化存储的多维度排序映射。BigTable能可靠处理PB级的数据,并且能够部署到上千台机器上。BigTable具有适用性广泛、可扩展、高性能和高可用性。

 

4.8 DynamoDB

 

  DynamoDB是亚马逊的键—值对模式的存储平台,可用性和扩展性都很好,读写访问中99.9%的响应时间都在300 ms内。DynamoDBNoSQL解决方案也是使用键—值对存储的模式,并通过服务器把所有的数据存储在SSD上的3个不同的区域。如果有更高的传输需求,DynamoDB也可以在后台添加更多的服务器。

 

 

 

  大数据的出现促进了NoSQL数据库技术的发展,进一步开拓了NoSQL数据库产品的应用。NoSQL数据库为大数据的存储、传输与处理创造了生态环境。NoSQL数据库需要分布式计算环境,而在分布系统的构建中,对于3个核心需求,CAP定理限制了横向扩展的伸缩性,但是采用最终一致性的BASE模型为NoSQL数据库产品的应用创造了必备条件。丰富的存储方式为NoSQL数据库存储和管理非结构化的大数据提供了可行的基础和支持。NoSQL数据库现已出现100余种,随着需求的增大和时间的推移,NoSQL数据库系统将逐渐走向成熟并广泛应用。

 

参考文献:

[1] 李国杰大数据研究的科学价值[J]. 中国计算机学会通讯, 2012, 8(9): 8-15.

[2] 陆嘉恒大数据挑战与NoSQL数据库技术[J]. 北京电子工业出版社, 2013.

 

基金项目:北京市教育委员会共建项目(京教函[2008]411号);北京市高教学会“十二五”高等教育研究规划课题(京高学会[2011]28号)。

 

专栏作家:陈明,男,中国石油大学教授,博士生导师,特聘教授,研究方向为分布式并行计算、计算智能、软件工程、大数据计算等,[email protected]。(潘世东转载于颜帅教授微信)