(本文作者为我的同事吴德文,特此致谢。)

NoSQL并不是Not SQL!NoSQL是Not Only SQL的缩写,指的是非关系型的数据库。它不一定遵循传统数据库的一些基本要求,比如SQL标准、ACID属性、表结构等。相比传统数据库,把NoSQL称为分布式数据管理系统更贴切,其数据存储被处理更灵活、更高效,而重点被放在了分布式数据管理上。

一、互联网对数据库提出了严峻要求

随着Web2.0网站的兴起,传统的关系型数据库在应付超大规模和高并发的SNS类型的纯动态内容上,暴露出很多难以克服的根本性问题。这使得非关系型数据库迅速成为热门的新领域,并得到了非常迅猛的发展。

以大量和动态内容为特征的互联网应用,对数据库提出了严峻的要求:

1、高并发读写的性能需求(High performance)

Web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实,对于普通的BBS网站,已经存在对高并发写请求的需求。

2、高容量和效率的存储需求(Huge Storage)

对于大型SNS网站,每天用户产生海量的用户动态,关系数据库是无法处理的。以Friendfeed为例,它一个月的用户动态高达到2.5亿条,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下、根本无法忍受的。

3、高扩展性和高可用性需求(High Scalability & High Availability)

在基于Web的架构中,数据库是最难进行横向扩展的。当一个应用系统的用户量和访问量与日俱增的时候,数据库却无法像Web服务器和应用服务器那样,可以简单地通过添加更多的硬件和服务器节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?

关系数据库到底有哪些缺陷呢?总结起来,它们在处理Web 2.0数据上存在以下两大主要瓶颈:

A. 数据结构化,数据的横向扩展能力底下

  • 受业务规则影响,需求变动导致分库分表的维护复杂。
  • 系统数据访问层代码需要修改。
  • Slave实时性的保障,对于实时性很高的场合可能需要做一些处理。
  • 高可用性问题:Master就是致命薄弱点,容易产生单点故障。所有的数据处理都是由Master来进行分配处理,若Master出现故障,导致整个系统崩溃。
  • MMM集群可以解决Master-Slave中的单个Master读写的致命缺陷,但是其扩展性差,一次只能一个Master可以写入,只能解决有限数据量下的可用性。

MMM

B. 数据的高效率存储和访问的需求满足能力低

  • 存储记录数量有限,横向可可扩展能力有限,纵向数据可承受能力也是有限的。
  • 对大数据的查询,SQL查询效率极低,在数据量达到一定的程度,查询时间会成指数级别增长。

二、常见NoSQL数据库及其优势

由于传统关系型数据库的致命缺陷,催生催熟了NoSQL数据库。按照数据模型保存性质,可将当前NoSQL分为四种:

  1. 键值存储(Key-value stores):保存keys+BLOB (二进制大对象,Binary Large OBjects)
  2. 面向表(Table-oriented):主要有Google的BigTable和Cassandra。
  3. 面向文本(Document-oriented):文本是一种类似XML的文档,MongoDB 和CouchDB采用这种方式。
  4. 面向图(Graph-oriented):如开源的Neo4J。

常见NoSQL数据库及其存储结构与适用场景如下表。

NoSQLDB

NoSQL数据库具有以下优势。

1.易扩展

无论哪种NoSQL数据库,其共同特点是去掉或减弱关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间,在架构的层面上带来了可扩展的能力。甚至,多种NoSQL之间进行整合也完全可能。

2.灵活的数据模型

NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。

3.高可用

NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。

4.大数据量,高性能

NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。

三、NoSQL在大数据中的应用

以下分享几个NoSQL数据库的应用实例。

1.NoSQL在Hadoop中运用

在大数据处理系统的架构中,当前首选的就是由Apache基金会所开发Hadoop。Hadoop实现了一个分布式文件系统HDFS(Hadoop Distributed File System),具有高容错性的特点,并且设计用来部署在低廉的硬件上。同时,HDFS提供高很高吞吐率来访问应用程序的数据,天生适合那些有着超大数据集(large data set)的大数据应用。

下图为Hadoop的基本构架。从中可以看出,它拥有的超强大数据处理能力,一方面来自自身的算法设计,另一方面就是来源于它的架构原理。在架构图中可以清楚地看到NoSQL在大数据读取和处理中的作用与优势。值得一提的是,Hadoop中使用的是Hbase这种NoSQL数据库,具有实时、分布式、高维等特性。

Hadoop

2.NoSQL在SAE中的运用

新浪云计算平台(Sina App Engine, SAE)是新浪研发中心于2009年8月开始内部开发,并在2009年11月3日正式推出第一个Alpha版本的国内首个公有云计算平台,并成为新浪云计算战略的核心组成部分。

下图是NoSQL数据库在SAE中的应用,其中KVDB在分布式key/value存储服务上起着重要的作用。

SAE

3.NoSQL在淘宝数据架构中的运用

淘宝每天能承受巨大的实时交易与交互数据,与其后台的架构设计关系密切。

在淘宝的数据处理架构中,使用Hadoop作为数据处理工具,采用NoSQl作为数据存储介质,从而充分利用NoSQL在大数据处理中的优势。下图为淘宝的数据架构图。

Taobao