NoSQL
即反SQL运动,是一项全新的数据库革命运动,早期就有人提出,发展到2010年已愈发成熟。随着互联网web2.0网站的兴起,非关系型的数据库现在成
了一个极其热门的新领域,
非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不
从心,暴露了很多难以克服的问题,例如:
1、High performance - 对数据库高并发读写的需求
web2.0
网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到
每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网
站,往往也存在对高并发写请求的需求,例如像JavaEye网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需
求。
2、Huge Storage - 对海量数据的高效率存储和访问的需求
类
似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到
了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登
录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。
3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
在
基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web
server和app
server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展
是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?
在上面提到的“三高”需求面前,关系数据库遇到了难以克服的障碍,而对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地,例如:
1、数据库事务一致性需求
很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负 担。
2、数据库的写实时性和读实时性需求
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比方说发一条消息之 后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。
3、对复杂的SQL查询,特别是多表关联查询的需求
任
何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品设计角
度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
因
此,关系数据库在这些越来越多的应用场景下显得不那么合适了,为了解决这类问题的非关系数据库应运而生,现在这两年,各种各样非关系数据库,特别是键值
数据库(Key-Value Store DB)风起云涌,多得让人眼花缭乱。前不久国外刚刚举办了NoSQL
Conference,各路NoSQL数据库纷纷亮相,加上未亮相但是名声在外的,起码有超过10个开源的NoSQLDB,例如:
Redis,Tokyo
Cabinet,Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable,
Riak,Tin, Flare, Lightcloud, KiokuDB,Scalaris, Kai, ThruDB
, ......
这些NoSQL数据库,有的是用C/C++编写的,有的是用Java编写的,还有的是用Erlang编写的,每个都有自己的独到之处,看都看不过来了,这 些NoSQL数据库大致可以分为以下的三类:
一、满足极高读写性能需求的Kye-Value数据库:Redis,Tokyo Cabinet, Flare
高性能Key-Value数据库的主要特点就是具有极高的并发读写性能,Redis,Tokyo Cabinet, Flare,这3个Key-Value DB都是用C编写的,他们的性能都相当出色,但出了出色的性能,他们还有自己独特的功能:
1、Redis
Redis
是一个很新的项目,刚刚发布了1.0版本。Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统
统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过
10万次读写操作,是我知道的性能最快的Key-Value DB。
Redis
的出色之处不仅仅是性能,Redis最大的魅力是支持保存List链表和Set集合的数据结构,而且还支持对List进行各种操作,例如从
List两端push和pop数据,取List区间,排序等等,对Set支持各种集合的并集交集操作,此外单个value的最大限制是1GB,不像
memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性
能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一
个功能加强版的memcached来用。
Redis
的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,并且它没有原生的可扩展机制,不具有scale(可扩展)能力,要
依赖客户端来实现分布式读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。目前使用Redis的网站有
github,Engine Yard。
2、Tokyo Cabinet和Tokoy Tyrant
TC
和TT的开发者是日本人Mikio
Hirabayashi,主要被用在日本最大的SNS网站mixi.jp上,TC发展的时间最早,现在已经是一个非常成熟的项目,也是Kye-Value
数据库领域最大的热点,现在被广泛的应用在很多很多网站上。TC是一个高性能的存储引擎,而TT提供了多线程高并发服务器,性能也非常出色,每秒可以处理
4-5万次读写操作。
TC
除了支持Key-Value存储之外,还支持保存Hashtable数据类型,因此很像一个简单的数据库表,并且还支持基于column的条件查询,
分页查询和排序功能,基本上相当于支持单表的基础查询功能了,所以可以简单的替代关系数据库的很多操作,这也是TC受到大家欢迎的主要原因之一,有一个
Ruby的项目miyazakiresistance将TT的hashtable的操作封装成和ActiveRecord一样的操作,用起来非常爽。
TC/TT
在mixi的实际应用当中,存储了2000万条以上的数据,同时支撑了上万个并发连接,是一个久经考验的项目。TC在保证了极高的并发读写性能
的同时,具有可靠的数据持久化机制,同时还支持类似关系数据库表结构的hashtable以及简单的条件,分页和排序操作,是一个很棒的NoSQL数据
库。
TC主要的缺点是没有scale的能力,如果单机无法满足要求,只能通过主从复制的方式扩展,另外有人提到TC的性能会随着数据量的增加而下降,当数据量 上亿条以后,性能会有比较明显的下降。
这个是Tim Yang做的一个Memcached,Redis和Tokyo Tyrant的简单的性能评测,仅供参考
3、Flare
TC
是日本第一大SNS网站mixi开发的,而Flare是日本第二大SNS网站green.jp开发的,有意思吧。Flare简单的说就是给TC添加了
scale功能。他替换掉了TT部分,自己另外给TC写了网络服务器,Flare的主要特点就是支持scale能力,他在网络服务端之前添加了一个
node
server,来管理后端的多个服务器节点,因此可以动态添加数据库服务节点,删除服务器节点,也支持failover。如果你的使用场景必须要让TC可
以scale,那么可以考虑flare。
flare唯一的缺点就是他只支持memcached协议,因此当你使用flare的时候,就不能使用TC的table数据结构了,只能使用TC的 key-value数据结构存储。
二、满足海量存储需求和访问的面向文档的数据库:MongoDB,CouchDB
面向文档的非关系数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能。MongoDB是用C++开发的,而 CouchDB则是Erlang开发的:
1、MongoDB
MongoDB
是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似
json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几
乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
Mongo
主要解决的是海量数据的访问效率问题,根据官方的文档,当数据量达到50GB以上的时候,Mongo的数据库访问速度是MySQL的10倍以
上。Mongo的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万-1.5次读写请求。
因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储,但我也看到有些评论认 为GridFS性能不佳,这一点还是有待亲自做点测试来验证了。
最
后由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎,很多项目都考虑用MongoDB来替代MySQL来实现不是
特别复杂的Web应用,比方说why we migrated from MySQL to
MongoDB就是一个真实的从MySQL迁移到MongoDB的案例,由于数据量实在太大,所以迁移到了Mongo上面,数据查询的速度得到了非常显著
的提升。
MongoDB也有一个ruby的项目MongoMapper,是模仿Merb的DataMapper编写的MongoDB的接口,使用起来非常简单,几 乎和DataMapper一模一样,功能非常强大易用。
2、CouchDB
CouchDB
现在是一个非常有名气的项目,似乎不用多介绍了。但是我却对CouchDB没有什么兴趣,主要是因为CouchDB仅仅提供了基于HTTP
REST的接口,因此CouchDB单纯从并发读写性能来说,是非常糟糕的,这让我立刻抛弃了对CouchDB的兴趣。
三、满足高可扩展性和可用性的面向分布式计算的数据库:Cassandra,Voldemort
面
向scale能力的数据库其实主要解决的问题领域和上述两类数据库还不太一样,它首先必须是一个分布式的数据库系统,由分布在不同节点上面的数据库共同
构成一个数据库服务系统,并且根据这种分布式架构来提供online的,具有弹性的可扩展能力,例如可以不停机的添加更多数据节点,删除数据节点等等。因
此像Cassandra常常被看成是一个开源版本的Google
BigTable的替代品。Cassandra和Voldemort都是用Java开发的:
1、Cassandra
Cassandra
项目是Facebook在2008年开源出来的,随后Facebook自己使用Cassandra的另外一个不开源的分支,而开源出来
的Cassandra主要被Amazon的Dynamite团队来维护,并且Cassandra被认为是Dynamite2.0版本。目前除了
Facebook之外,twitter和digg.com都在使用Cassandra。
Cassandra
的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra的一个写操作,会被复制到
其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在
群集里面添加节点就可以了。我看到有文章说Facebook的Cassandra群集有超过100台服务器构成的数据库群集。
Cassandra
也支持比较丰富的数据结构和功能强大的查询语言,和MongoDB比较类似,查询功能比MongoDB稍弱一些,twitter的平台
架构部门领导Evan
Weaver写了一篇文章介绍Cassandra:http://blog.evanweaver.com/articles/2009/07/06
/up-and-running-with-cassandra/,有非常详细的介绍。
Cassandra
以单个节点来衡量,其节点的并发读写性能不是特别好,有文章说评测下来Cassandra每秒大约不到1万次读写请求,我也看到一些对
这个问题进行质疑的评论,但是评价Cassandra单个节点的性能是没有意义的,真实的分布式数据库访问系统必然是n多个节点构成的系统,其并发性能取
决于整个系统的节点数量,路由效率,而不仅仅是单节点的并发负载能力。
2、Voldemort
Voldemort
是个和Cassandra类似的面向解决scale问题的分布式数据库系统,Cassandra来自于Facebook这个SNS网
站,而Voldemort则来自于Linkedin这个SNS网站。说起来SNS网站为我们贡献了n多的NoSQL数据库,例如
Cassandar,Voldemort,Tokyo
Cabinet,Flare等等。Voldemort的资料不是很多,因此我没有特别仔细去钻研,Voldemort官方给出Voldemort的并发读
写性能也很不错,每秒超过了1.5万次读写。
从
Facebook开发Cassandra,Linkedin开发Voldemort,我们也可以大致看出国外大型SNS网站对于分布式数据库,特别是对
数据库的scale能力方面的需求是多么殷切。前面提到,web应用的架构当中,web层和app层相对来说都很容易横向扩展,唯有数据库是单点的,极难
scale,现在Facebook和Linkedin在非关系型数据库的分布式方面探索了一条很好的方向,这也是为什么现在Cassandra这么热门的
主要原因。
分享到:
相关推荐
《数据库--NoSQL精粹》是一本专注于NoSQL数据库领域的电子书,旨在深入探讨这个非关系型数据库模型的精髓和应用。NoSQL,全称"Not Only SQL",它并不是拒绝SQL,而是指一类不采用传统关系型数据库模型,而是适应大...
《大数据技术基础》课程的第五章重点探讨了NoSQL数据库,并通过上机练习来深化学生对关系数据库和NoSQL数据库的理解。在这个环节中,学生将有机会实际操作四种不同类型的数据存储系统:MySQL(关系型数据库)、Redis...
NoSQL,意为“非关系型数据库”,是近年来随着大数据和分布式计算的发展而崛起的一种新型数据库类型。与传统的关系型数据库不同,NoSQL数据库更注重水平扩展,能够处理大规模数据并提供高可用性和灵活性。 【标签】...
NoSQL数据库原理主要探讨了非关系型数据库与传统的关系型数据库在设计和操作上的差异。在第二章中,重点讲解了NoSQL数据库的基本原理,包括它如何打破关系模型的常规特征,以及它对完整性约束和事务机制的不同处理...
1. NoSQL的含义:NoSQL(Not Only SQL)并不是指完全不使用SQL,而是指非关系型、非结构化的数据库系统,它支持大规模数据存储和高并发访问。 2. NoSQL的四大类型:键值存储、列族存储、文档数据库和图形数据库。...
1. 分布式存储:NoSQL数据库支持水平扩展,即通过增加服务器数量来提升存储和处理能力,而非像关系型数据库那样通过增加单台服务器的硬件资源。 2. 面向文档:许多NoSQL数据库采用键值对、文档、列族或图形等数据...
MongoDB是一种非关系型文档数据库,它支持模式自由的数据模型,这意味着不必预先定义数据结构,可以灵活地存储各种不同类型的数据。MongoDB采用了面向集合的架构,其中集合类似于关系数据库中的表,可以包含多个文档...
数据建模是设计数据库结构的过程,包括实体-关系(ER)模型、概念数据模型和逻辑数据模型。在ER模型中,实体、属性和关系被用来描述现实世界的对象和它们之间的联系。通过数据建模,我们可以确保数据库设计满足业务...
MongoDB是一种流行的开源NoSQL数据库,它以JSON格式存储数据,具有高性能、高可用性和可扩展性的特点。在Linux环境中,MongoDB的配置是运维工作中的重要环节,它关系到数据库的稳定运行和性能优化。本篇将深入探讨...
在中国数据库大会-11的演讲中,童家旺深入探讨了NoSQL一致性实践以及对CAP定理的理解。CAP定理,又称布鲁尔定理(Brewer's Theorem),由加州大学伯克利分校的计算机科学家Eric Brewer提出,它指出在分布式计算系统...
NoSQL数据库,全称为"Not Only SQL",是近年来在应对互联网大规模、高并发、高可扩展性和高可用性需求背景下发展起来的一种非关系型数据库。相比于传统的SQL关系数据库,NoSQL数据库提供了不同的数据模型和存储机制...
《数据库原理与应用》第三版的第八章详细探讨了非关系型数据库NoSQL,这是针对大数据时代的一种新型数据库管理系统。本章首先介绍了大数据的基本概念,包括大数据的三个V:大量化(Volume)、多样化(Variety)和...
本文主要探讨了两种主要的数据库类型:关系型数据库(Relational Database Management System,简称RDBMS)和非关系型数据库(NoSQL Database),并分析了它们的基本概念、主流产品、优缺点以及适用场景。...
NoSQL运动当前的景观被《NoSQL状态》一文深入探讨,由Stefan Edlich教授撰写,该文重点阐述了NoSQL架构与开发技能需求的显著提升。随着NoSQL技术获得大规模资金支持,其市场期望值日益升高。文章还提及了已出版或...
本文将详细探讨如何将Spring框架与非关系数据库结合使用,以实现高效、可扩展的数据存储解决方案。 首先,Spring框架提供了强大的数据访问抽象层,使得开发者可以轻松地与各种数据库交互,包括关系型数据库如MySQL...
在现代的互联网应用中,非关系型数据库(NoSQL)因其灵活性、可扩展性和高性能而逐渐受到关注。MongoDB作为一款流行的NoSQL数据库,尤其在处理大规模数据和高并发场景时展现出强大的优势。本篇文章将深入探讨MongoDB...
NoSQL(Not Only SQL / Non-relational)是指一类非关系型数据库管理系统,它与传统的SQL数据库不同,不保证关系数据库的ACID特性(原子性、一致性、隔离性、持久性)以及JOIN操作,但支持动态表结构定义,具有更好...
NoSQL(Not Only SQL / Non-relational)是一种非关系型数据库系统的统称,它突破了传统关系型数据库的限制,在面对大规模数据处理和高并发访问时展现出了强大的优势。NoSQL数据库根据数据模型的不同,可以分为以下...