NOSQL概述

 

                                                                                        NoSQL数据库

        NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。为了更好的理解NoSQL数据库,下面将SQL数据库与NoSQL数据库对比分析。

      首先是关系型数据库(SQL)和非关系型数据库(NoSQL)的历史。1969年,埃德加•弗兰克•科德(Edgar Frank Codd)发表了划时代的论文,首次提出了关系数据模型的概念。但可惜的是,刊登论文的《IBM Research Report》只是IBM公司的内部刊物,因此论文反响平平。1970年,他再次在刊物《Communication of the ACM》上发表了题为“A Relational Model of Data for Large Shared Data banks”(大型共享数据库的关系模型)的论文,文中首次提出了数据库的关系模型的概念,奠定了关系模型的理论基础。当时的关系型数据库由于硬件性能低劣、处理速度过慢而迟迟没有得到实际应用,而之后随着硬件性能的提升,加上关系模型简单明了,具有坚实的数学理论基础,性能优越等优点,关系数据库很快受到了学术界和学术界和产业界的高度重视和广泛响应,并迅速成为数据库市场的主流。20世纪80年代以来,计算机厂商推出的数据库管理系统几乎都支持关系模型,数据库领域当前的研究工作大都以关系模型为基础。而NoSQL一词最早出现于1998年,Carlo Strozzi在那时开发了一个轻量级、开源且不提供SQL功能的关系数据库。Strozzi所提出的NoSQL与目前业界对NoSQL的定义有很大区别,NoSQL并未按照Strozzi当初所设想的那样发展,而后来Strozzi自己也发现我们真正需要的并不是No SQL,而是No Relational,也就是非关系型数据库技术。经过十年的发展,NoSQL终于在2009年演变为一场真正的技术风潮。此后,伴随Web 2.0时代汹涌而来的大数据(也称为海量数据)让NoSQL更进一步走到台前,其针对超大规模和高并发数据的处理能力得到越来越多企业用户的关注,而像Hadoop这样的在大型互联网企业得到实践验证的产品的出现,让数据的管理者看到了一条更加经济和高效地管理大数据的可行之路。对比两者的发展历史,我们可以发现关系型数据库有着将近30年的发展历程,非关系型数据库则相对较“年轻“,只有短短10年的时间。而非关系型数据库作为一种完全背离关系型数据库的新型数据库在当今大数据的时代下得以进一步的发展和繁荣。

      那么关系型数据库和非关系型数据库的设计理论分别是什么呢?关系数据库将现实世界中的实体以及实体之间的联系都抽象成一张二维表,这样关系数据库就实现了结构的单一化。关系模型把过去混乱的数据存储关系用一种严格的数学模型描述出来,而其查询语言SQL则可以用简单直观的语法,实现丰富复杂的查询及更新功能,把各个实体之间的关系明确地表达出来。同时关系数据库的设计理论将ACID(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))放在首位,其次考虑性能与可扩展性。因此关系数据库具有非常好的通用性,和非常高的性能,它具有以下突出优势:

1、保持数据的一致性(事务处理)  

2、由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处)

3、可以进行JOIN等复杂查询

4、存在很多实际成果和专业技术信息(成熟的技术)

但正是由于关系数据库严格死板的数据模型,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以

克服的问题,例如:

     1High performance -对数据库高并发读写的需求

     2Huge Storage -对海量数据的高效率存储和访问的需求

     3High Scalability && High Availability-对数据库的高可扩展性和高可用性的需求

在上面提到的“三高”需求面前,关系数据库遇到了难以克服的障碍,而对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地,例如:

     1、数据库事务一致性需求

     2、数据库的写实时性和读实时性需求

     3、对复杂的SQL查询,特别是多表关联查询的需求

因此,关系数据库在这些越来越多的应用场景下显得不那么合适了,为了解决这类问题,非关系数据库应运而生。NoSQL是非关系型数据存储的广义定义,它打破了长久以来关系型数据库与ACID理论大一统的局面。NoSQL数据存储不需要固定的表结构,数据与数据之间是相互独立,没有关系的,并且通过key-value方式存储。同时非关系数据库将可扩展性放在首位,而高可用或一致性则放到了第二档。因此,NoSQL在数据存储方面具备庞大的水平扩展性。它具有如下突出优势:

     1、易于数据的分散

     2、处理海量数据

     3、提升性能和增大规模

    4、高可扩展性

    5、高可用性

    6、灵活的数据模型

正是由于非关系数据库的设计理论与关系数据库设计理论截然相反,它很好地解决了关系数据库所无法解决的海量数据存储和高并发事务处理需求。

      虽然关系型数据库与非关系型数据库的设计理论不同,但是SQLNoSQL的核心,从数据库的角度看起来没有太大差别,都是把数据通过某种方式存放在磁盘上以便以后访问。可以说,从最早期的网状数据库,到关系型数据库,到现在的NoSQL,其核心理念没有任何变化。都是要用最有效的方式减少I/O,将用户需要的数据,通过某种算法和数据结构有效地存储与访问。但是在上层来看,实现这种目标的方式则有了翻天覆地的变化。而不管是传统关系型数据库,还是NoSQL,性能优化从两个方面入手:

       第一,就是增加CPU的执行效率:这在关系型数据库里面最常见,比如说一个表扫描和一个索引扫描,为什么索引扫描块?可能有人会说索引扫描只要扫描几个数据页就行了,表扫描要搜索全部数据。这只不过是表象,真正的核心思想是,用最少的CPU找到所需要的数据。索引扫描可以在有限的CPU cycle里面就找到我们需要的数据,而表扫描需要扫描无数不需要的数据,最后才定位到若干条有效数据,从CPU的有效性来看差别显而易见

       第二,就是减少IO开销:为什么数据库需要缓存?为什么需要预取?为什么需要异步写?这些无数调优理念的背后只有一个答案,就是减少IO开销。缓存的使用把热数据放入内存,就不需要在访问数据时进行I/O读取了。预取可以把数据在访问前读入内存,也是减少IO的例子。异步写入可以在后台把脏数据刷入磁盘,腾出来的空间可以预读或者缓存更有效的数据。

所以从性能优化角度看,NoSQL与关系型数据库的理念也基本没有区别。

那么到底什么时候使用SQL,什么时候使用NoSQL呢?这是个经验问题了,上面已经介绍了关系数据库和非关系数据库的设计理论,从它们的设计理论我们可以分析它们的应用场景。大数据领域强调的是分布式计算,由于关系数据库定义了一套严格的数据模型,为了维持强一致性需要在实体间进行非常多的数据交互,这样不利于数据的分布式计算,同时当数据量比较大时,关系数据库通过表与表之间的关系查询数据时,其效率是非常低下甚至是难以忍受的,另外,由于关系数据模型只支持结构化数据,因此当有新类型的数据产生时,扩展是极其困难的,所以不利于数据的扩展。因此它只能通过添加更多的硬件和服务节点来扩展性能和负载能力,这种方法虽然简单,但是成本较高而且增加了操作的复杂性;与之相比,非关系数据模型由于数据之间相互独立,数据模型灵活,所以易于数据的扩展与分散,有利于数据的分布式计算,而查询效率由于使用了key-value存储较关系数据库也有了显著提高,因此非关系数据模型可以通过添加许多廉价的PC机来对大数据进行分布式处理,这样处理的费用相对关系数据库而言要少得多,同时处理的复杂度也显著降低。所以在分布式计算和高性能存储的场景下使用NoSQL;当然当数据量并非如此庞大,并且强调一致性要求时,那么关系数据库的优势就体现出来了,这个时候因该选择使用SQL。需要切记的一点是:NoSQL不是为了替代SQL而出现的,它是一种替补方案,而不是解决方案的首选。

       那么非关系数据模型有哪些种类呢?一般来说我们把它分为四类,包括key/value,文档型,宽表,与graph。graph的应用范围相对比较窄,用于描述实体之间的关系。key/value,文档型和宽表,各有各的特点,和传统关系型数据库比起来也拥有各自的典型应用场景。

       key/value,redis就是一个非常典型的keyvalue内存式数据库,它的用途主要就是在高性能访问的时候。但是一般来说key/value 数据库因为数据模型简单,所以更多时候被看做是一个键值存储引擎,而不是拥有强大计算能力的数据库引擎。因此key/value数据库在简单的高性能数据模型的场景下很实用,但是当业务逻辑越来越复杂的时候就会凸显其劣势了。

       宽表是google bigtable引领的潮流,本质就是把数据切成多个块(也叫做column family),存放在不同的地方。应用程序的典型用法,是根据某种条件找到记录后,只在里面搜索有限数量个字段,这样的话宽表能够有效地利用切分的数据块,尽可能减少I/O。宽表一般被用于拥有大量字段的场景,比如每条记录拥有成千上万的字段,用这种方式能够有效地减少I/O。不过大部分的应用可能都到不了这种规模。

       最后,文档型数据库一般来说被认为是最接近传统关系型数据库的NoSQL。这也要归功于MongoDB所引领的潮流。文档型数据库的核心是数据嵌套,将原本一些星形模式(Star Schema)的数据嵌套在同一条记录中以减少表之间关联的需求。这种设计可以从某种程度上大大简化传统数据库复杂的关联问题,同时由于摆脱了关系模型里面的强一致性限制,文档型数据库还可以做到水平扩张与高可用。

    所以相比其他几种NoSQL,文档型数据库的应用范围要广泛许多。

    由于NoSQL开发者的不懈努力。长期统治数据库市场的三大主流数据库厂商分别用自己的方式表达着对这一技术方向的认可。在此前的数年,NoSQL数据库一直处于在边缘地带进行实验性部署的状态,但传统的关系型数据库厂商一直对其保持关注,有些还早早地进行了相关的技术储备。

                             甲骨文:

  2011年10月,甲骨文发布了Oracle NoSQL数据库,同时甲骨文将为Oracle NoSQL数据库用户提供企业级技术支持。Oracle NoSQL数据库秉承了甲骨文数据库坚固、实用的开发风格。2006年,甲骨文收购了开源BerkeleyDB的开发商Sleepycat。Oracle NoSQL数据库以BerkeleyDB为核心,拥有很多严谨的功能性设计。

  大数据管理方面,甲骨文与Apache Hadoop软件及服务提供商Cloudera合作,在其集成系统Oracle大数据机中提供Hadoop系列软件。另外,甲骨文还提供Oracle数据集成Hadoop应用适配器、Oracle Hadoop装载器、Oracle Direct Connector,这些工具降低了Hadoop的应用复杂度,还支持从Oracle数据库直接访问Hadoop分布式文件系统上的数据。

                              IBM:

  在2011年10月举办的IBM Information OnDemand大会上,IBM副总裁兼数据库系统CTO Curt Cotner表示IBM将在2012年年内推出内置NoSQL的DB2旗舰级数据库管理系统。新的IBM NoSQL数据库可供DB2和Informix用户使用,将成为现有堆栈的一部分,用户无需支付额外的费用。

  2011年5月,IBM先期推出了企业级Hadoop解决方案InfoSphere BigInsights。BigInsights能够在常用、低成本的硬件上运行,并行支持线性可伸缩性,它可以用户支持半结构化或结构化的信息,允许跨信息类型动态添加结构和管理,同时还具备高级文本分析功能。目前,BigInsights提供企业版和基础版两个版本。

                              微软:

在2011年10月举行的SQL PASS峰会上,微软宣布与从雅虎分拆出来的Hortonworks合作,在Hadoop上搭建Windows Server以及Windows Azure平台。双方计划通过合战略合作将Hadoop集成到微软的产品集中。根据当时计划表,微软计划在2012年3月30日提供运行于Windows Azure的最终版本,同时微软还计划推出运行于Windows Sever之上的Hadoop预览版,并将在2012年6月29日发布最终版本。

 

       最后,出于了解NoSQL产品的目的,我在这里列举一些当前NoSQL数据库重点产品。

                                   Cassandra

  混合型的非关系型数据库,类似于GoogleBigTableCassandra最初由Facebook开发,后来转变为开源项目。当时Facebook需要一个更快、、更廉价的方式处理数以亿计状态更新的数据库系统,为此他们启动这一项目,并最终将其移植到了Apache上。

                             HBase

  全称为Hadoop Database,是一款高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用它可以在廉价的PC服务器上搭建大规模结构化存储集群。HBaseGoogle BigTable的开源实现,采用Jave语言编写。

                             MongoDB

  介于关系型数据库和NoSQL数据库之间的开源产品,是NoSQL数据库中功能最为丰富、最像关系型数据库的产品。作为一款基于分布式文件存储的数据库,MongoDBC++语言编写,最大的特点是能够支持的查询语言非常强大,还支持对数据建立索引。

                             CouchDB

  CouchDB的核心由Erlang编写,是面向文档存储的数据库系统。其最大的变化在于查询。其最大的特点是它是一个面向Web应用新一代存储系统,存储半结构化的数据,数据存储方式类似于luceneindex文件格式。

                            DynamoDB

       互联网巨头亚马逊在20121月发布的专为互联网规模应用设计的NoSQL数据库。它凝聚了亚马逊在NoSQL数据库和云服务领域开发DynamoSimpleDB的经验。DynamoDB是完全托管的数据库,它将数据保存在固态硬盘,并进行跨分区的同步复制,以保证其高可靠性和数据持久性。

你可能感兴趣的:(数据库)