`
robbin
  • 浏览: 4822430 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:137133
社区版块
存档分类
最新评论

NoSQL数据库探讨之一 - 为什么要用非关系数据库?

阅读更多
随着互联网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应用来说,并不要求这么高的实时性,比方说我(JavaEye的robbin)发一条消息之后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。

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编写的,每个都有自己的独到之处,看都看不过来了,我(robbin)也只能从中挑选一些比较有特色,看起来更有前景的产品学习和了解一下。这些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的主要缺点是在数据量达到上亿级别以后,并发写数据性能会大幅度下降,NoSQL: If Only It Was That Easy提到,他们发现在TC里面插入1.6亿条2-20KB数据的时候,写入性能开始急剧下降。看来是当数据量上亿条的时候,TC性能开始大幅度下降,从TC作者自己提供的mixi数据来看,至少上千万条数据量的时候还没有遇到这么明显的写入性能瓶颈。

这个是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的并发读写性能,我(robbin)也打算有空的时候好好测试一下。

因为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能力方面的需求是多么殷切。前面我(robbin)提到,web应用的架构当中,web层和app层相对来说都很容易横向扩展,唯有数据库是单点的,极难scale,现在Facebook和Linkedin在非关系型数据库的分布式方面探索了一条很好的方向,这也是为什么现在Cassandra这么热门的主要原因。

如今,NoSQL数据库是个令人很兴奋的领域,总是不断有新的技术新的产品冒出来,改变我们已经形成的固有的技术观念,我自己(robbin)稍微了解了一些,就感觉自己深深的沉迷进去了,可以说NoSQL数据库领域也是博大精深的,我(robbin)也只能浅尝辄止,我(robbin)写这篇文章既是自己一点点钻研心得,也是抛砖引玉,希望吸引对这个领域有经验的朋友来讨论和交流。

从我(robbin)个人的兴趣来说,分布式数据库系统不是我能实际用到的技术,因此不打算花时间深入,而其他两个数据领域(高性能NoSQLDB和海量存储NoSQLDB)都是我很感兴趣的,特别是Redis,TT/TC和MongoDB这3个NoSQL数据库,因此我接下来将写三篇文章分别详细介绍这3个数据库。
分享到:
评论
55 楼 cuishen 2010-01-15  
我记得论坛里有一篇帖子 - 数据库水平切分的实现原理解析讲的很好,这个水平切分的模型有点类似Teradata,其核心思想就是将大数据打散,提高并发。

我们试想下:假如有1亿条数据,以某种算法(Teradata里是用的哈希算法)均匀分散到20个库里面(在Teradata里是20个AMP),那么每个库只需要处理500万条数据,压力大幅降低,在路由器的广播控制下(Teradata里是YNET)多个库并发协同工作(每个库有自己独立的磁盘,这样就大幅减少高并发下的I/O冲突)(在Teradata里是每个AMP对应一个或者多个磁盘),高并发下海量数据处理性能就得到了极大的提高!相比Teradata单个节点动辄上千万的天价,数据库水平切分真是个平民化的解决方案!
54 楼 yishh 2010-01-15  
itian 写道
  准备做个社区类网站,在寻觅nosql数据库,最近简单测试了一下市面上的nosql数据库,MongoDB是我目前最想用的。
 
  我用java连接另外一台机器上的虚拟机上的ubuntu服务器,插入1W条数据,速度基本上控制在1000ms以内,相比我在同样的坏境下用Hibernate写入mysql来说,mongo我已经觉得是神级的了,但是目前还有最后一个问题,Mongodb说它的默认引擎是使用“内存映射文件”的,这一点我一直搞不太明白,或者说,我不知道怎么控制它只占用指定的内存空间,不管我一次插入一百万,还是一千万条数据,它的内存始终在增长,直到内存占用90%以上,整个系统动不了为止,这点让我非常郁闷。

是啊,我也遇到这个内存一直增加的问题,现在是在生产环境下跑的。内存已经用到69%,还是一直在涨,不知道会不会当掉
53 楼 lenky0401 2010-01-14  
最近一直在利用空闲时间整mongodb,分别用vc2008编写了操作mysql和mongodb的测试工程
今天测试了一下同插入十万条数据 mongodb需10秒 mysql需20秒
而数据全部删除mongodb显示为0秒(为何是0还未研究mongodb的机制)
mysql需要6秒

上面的测试环境都是我个人的PC,性能并不好,但用于对比倒也无妨。
52 楼 freespace 2010-01-11  
mongodb是目前高性能数据库中唯一可以在windows下使用的,它具备类似对象数据的高级查询功能,目前已具备高级查询功能,如:与、等于、大于、小与、正则表达式查询、分页等等(或逻辑目前还没有支持)。

正则表达式查询可以做出类似全文检索的功能。

但在windows下,mongodb作为服务启动,当直接关闭windows而非通过人工停止mongodb服务,会引起本次开机以来的所有数据丢失问题,不知道是否有人遇到过这个问题?

不知道linux下是否也存在该问题,抽时间测试一下。
51 楼 totothink 2010-01-06  
非常好的文章。
我们目前使用的是TokyoCabinet。为了能更好的使用,我们也写了一个类似于ActiveRecord的gem包———— ActiveObject. 有兴趣参与开发的朋友可以和我们联系

http://github.com/totothink/active_object
50 楼 gyro 2009-12-14  
AreYouOK? 写道
我在工作中也遇到很多问题,关系数据库确实有些力不从心了,但是不使用关系数据库,面对复杂的查询,没有好的解决方案。
从这篇文章的介绍看,我对MongoDB最感兴趣,期待后续。

我的需求和这里列出的Web2.0的网站需求还不太一样。我的场景是:
  • 数据量非常巨大,写操作特别多。数据量可以说是无限的,就看系统能处理多少,如果能处理更多就要接入更多的数据(一般来说我们只接入了部分数据)。
  • 读操作非常少,可以用每天多少次来衡量(就那么几个使用人员,他用的时候才有查询操作),但是一旦有查询操作,往往都是重量级的。
  • 查询操作可以稍微慢点,能在5秒内出来就不错了,如果进行复杂的查询,30秒出来也算不错了。10分钟甚至1个小时才查出结果,是非常不好的,但是能出来总比不能要好。
  • 写操作允许丢失少量数据,但是整个数据库的完整性要有保证
  • 数据最好能够压缩存储


在某个项目里面,数据量大的时候大约每天40、50G,使用postgresql,居然也支撑了下来,但是查询非常慢。接下来的一些项目数据量会更大,可能会有这个量的100倍以上,目前没有好的办法,只能从数据源头先做过滤。

我在1年前,开始尝试进行一些探索,根据产品需求特点,使用自定义的数据格式存储。目前能够解决的问题有:
  • 对数据进行简单的解析和压缩存储
  • 能够对压缩的数据进行简单的查询(指定数据源、时间范围、关键字),查询较慢,但是比SQL有一个好处,就是能看见当前查询到哪个时间点了,而不是像SQL一样,等运行完了才能给用户看到
  • 高性能的写入。目前在我的笔记本上进行简单的测试,每秒2万条的UDP包,丢包率是0.5%,在复杂的环境下性能是会下降的,但服务器的性能会更好

不幸的是,我只有很少的时间能投入到这上面,有时候几个星期都没空去弄,所以到现在还有很多要完善的地方,没有在项目里面实用。有时候我都怀疑这条路是不是走错了。

目前没有解决的问题是高性能的、对数据的复杂查询。数据可以分为2部分,原始数据和格式化后的数据,目前我这里只解决了原始数据的问题,对于格式化数据的复杂查询,还是需要类似关系数据库的功能才行。这也是我对MongoDB比较感兴趣的原因。




感觉上,你这就是一个日志统计系统,解决模型可以看现在大部分的日志统计程序
只保留必要的数据,并且汇总必要的数据,根据你可以开放的查询功能,设计你的数据结构。
49 楼 fansofjava 2009-12-08  
yishh 写道
不知道有谁测试过mongodb的性能,我简单测试了一下,插入1亿条同样的记录。用postgresql和mongodb做查询(100并发),mongodb查询的性能是比pg要好,但是加上通过DBCursor遍历数据的时间,就比jdbc的resultset遍历的时间要多很地多,还没去看看这里是怎么实现的,怀疑是因为反序列化json花掉的时间。

------------
看了下mongo for java driver的代码。collection.find()方法只是创建了一个DBCursor对象,没有做实际的查询操作,所以都是瞬间完成的。实际获取数据是在DBCursor.next的时候。总的消耗时间远远超过pg。pg每次查询都在20ms内完成,而mongo db需要800ms了。
在insert和update时,mongodb有巨大优势。插入10万条数据pg需要200585ms(batch方式提交),mongodb需要109773ms

不知道你获取多少条记录,我试了一下,获取3万条数据(不复杂)也就花了两秒多。比起用hibernate来说,快得太多了。
48 楼 wangzy 2009-12-08  
mongodb文档说可以自己灵活有效使用系统的剩余内存,所以不需要像数据库一样要配置各种内存参数
你这个速度慢,可能跟虚拟机有关系
47 楼 itian 2009-12-08  
  准备做个社区类网站,在寻觅nosql数据库,最近简单测试了一下市面上的nosql数据库,MongoDB是我目前最想用的。
 
  我用java连接另外一台机器上的虚拟机上的ubuntu服务器,插入1W条数据,速度基本上控制在1000ms以内,相比我在同样的坏境下用Hibernate写入mysql来说,mongo我已经觉得是神级的了,但是目前还有最后一个问题,Mongodb说它的默认引擎是使用“内存映射文件”的,这一点我一直搞不太明白,或者说,我不知道怎么控制它只占用指定的内存空间,不管我一次插入一百万,还是一千万条数据,它的内存始终在增长,直到内存占用90%以上,整个系统动不了为止,这点让我非常郁闷。
46 楼 yishh 2009-12-08  
不知道有谁测试过mongodb的性能,我简单测试了一下,插入1亿条同样的记录。用postgresql和mongodb做查询(100并发),mongodb查询的性能是比pg要好,但是加上通过DBCursor遍历数据的时间,就比jdbc的resultset遍历的时间要多很地多,还没去看看这里是怎么实现的,怀疑是因为反序列化json花掉的时间。

------------
看了下mongo for java driver的代码。collection.find()方法只是创建了一个DBCursor对象,没有做实际的查询操作,所以都是瞬间完成的。实际获取数据是在DBCursor.next的时候。总的消耗时间远远超过pg。pg每次查询都在20ms内完成,而mongo db需要800ms了。
在insert和update时,mongodb有巨大优势。插入10万条数据pg需要200585ms(batch方式提交),mongodb需要109773ms
45 楼 comet12345678 2009-12-03  
realzhang 写道
可惜MongoDB在32bit下有2Gb的限制

这个限制没有影响

MongoDB的无模式,强大的查询功能非常吸引人。以前用属性保存数据,查询就不方便了,friendfeed在mysql中的schame-less更是加上了索引,解决了查询问题,感觉还是别扭,不如mdb来得自然。
44 楼 nightsailer 2009-11-28  
我选择了Flare和MongoDB. 对于GridFS, 我自己用的感觉还是不错的. 可能是数据量比较小,不到1TB. MongoDB用起来非常爽, 像实时日志统计,数据分析之类的,特别适合. Flare的扩展性好,的确是这样. 此外我觉得它的透明proxy也是很不错,不论是master,slave,都能够切换获得同样的数据.
43 楼 realzhang 2009-11-28  
可惜MongoDB在32bit下有2Gb的限制
42 楼 smiletuna 2009-11-27  
robbin 写道
这里有篇很棒的文章,介绍各个NoSQLDB: NoSQL: If Only It Was That Easy

他提到Tokyo Cabinet在大数据量的时候性能下降问题:

引用
We tried to insert 160mil 2k -20k documents into a single Tokyo Tyrant server, and performance quickly dropped off and kept going down. You could have had a nice holiday skiing on the graph of inserts/sec. This is pretty typical of anything that you write to a disk. The more you write, the slower it goes. We could distribute the write easily, because Tokyo doesn’t scale.


当我们尝试在单个TT服务器节点里面插入1.6亿条2-20KB的记录的时候,TC的写数据性能迅速下降,你可以看到一个像滑雪一样的性能下降曲线。

看来是当数据量上亿条的时候,TC性能开始大幅度下降,从TC作者自己提供的mixi数据来看,至少上千万条数据量的时候还没有遇到这么明显的写入性能瓶颈。


这个也要看具体存储的数据有多大。我曾经搞过一个可以加载大数据的GIS架构。存储vector data部分使用cabinet, 索引在mysql上。 生成的索引大约1100万条。 照理会很快,但是cabinet的单体文件 高达 5G.读取速度下降比较快。

据比较,单体文件不超过2G时性能最好。所以后来写了一个简单的client让 数据散列到多个cabinet文件上去。这样才提高了速度。
41 楼 redaready 2009-11-27  
比较看好mongodb,看作者自己给自己在Bug database里加了N多的issue,这小伙很有上进心啊~~希望它早日一统江湖。
40 楼 庄表伟 2009-11-26  
zozoh 写道
庄表伟 写道


第一篇打不开,郁闷 ~~~


这个...任何时候,翻墙都是基本的技能啊。。。
39 楼 zozoh 2009-11-26  
庄表伟 写道


第一篇打不开,郁闷 ~~~
38 楼 mikeandmore 2009-11-26  
diogin 写道

而 key-value 数据库,实际上只是“关系+散列索引”的另一种表现形式。这种数据结构不支持 range 查询。


想支持还是可以支持的。

不过前面的话我还是很赞同的。
37 楼 diogin 2009-11-26  
个人认为 SQL 与否并不是问题的实质,真正的问题在于为不同的场景选择不同的数据结构及其存储方式。传统的关系数据库把一切数据看成“关系”这种离散的逻辑数据结构,而关系是要切实存储下来的,于是出来了各种存储引擎,针对关系的各种检索方式,出来了各种索引(树,散列表等等)。这些索引的用途实际上只是以“适应算法要求”的最高效率的方式找到所需的“关系”集合。

基于这种思路,所谓的 NoSQLDB 只是让问题回归实质而已——使用不同的数据结构来存储数据,这些数据的存取方式各异。

而 key-value 数据库,实际上只是“关系+散列索引”的另一种表现形式。这种数据结构不支持 range 查询。
36 楼 wangzy 2009-11-25  
半年前,我对mongodb就开始关注子了,这个东西非常像mysql。

他介乎key-value和rdbms之间,各自的优点都具备。

另外版本升级飞快,从0.x到现在支持的特性越来越多,我也准备应用他作为social game的后端存储。

相关推荐

    NoSQL数据库探讨之一-为什么要用非关系数据库?.pdf

    NoSQL数据库,全称为"Not Only SQL",是近年来在应对互联网大规模、高并发、高可扩展性和高可用性需求背景下发展起来的一种非关系型数据库。相比于传统的SQL关系数据库,NoSQL数据库提供了不同的数据模型和存储机制...

    NoSQL数据库原理课件-侯宾.zip

    本课件将深入探讨分布式数据库的原理以及NoSQL数据库的核心概念,帮助读者理解和掌握这两种技术。 一、分布式数据库基础 1. 分布式数据库定义:分布式数据库是一种物理上分散在不同地理位置,但在逻辑上视为单一...

    厦门大学-林子雨-大数据技术基础-第5章 NoSQL数据库-上机练习-关系数据库和NoSQL数据库操作实践

    《大数据技术基础》课程的第五章重点探讨了NoSQL数据库,并通过上机练习来深化学生对关系数据库和NoSQL数据库的理解。在这个环节中,学生将有机会实际操作四种不同类型的数据存储系统:MySQL(关系型数据库)、Redis...

    NoSQL数据库入门思维导图

    这暗示了我们将会探讨的是NoSQL数据库的基础概念以及常见的NoSQL数据库类型。 【标签】:“MySQL”虽然在本主题中可能不是直接的焦点,但作为关系型数据库的代表,MySQL常常与NoSQL数据库进行对比,因此在这里可能...

    NoSQL数据库技术实战

    NoSQL(Not Only SQL)数据库是一种非关系型数据库,它打破了传统的关系型数据库模型,为处理大规模分布式数据提供了新的解决方案。在大数据时代,由于其高可扩展性、高性能和灵活的数据模型,NoSQL数据库被广泛应用...

    NoSQL数据库原理-第二章-NoSQL数据库的基本原理.pptx

    NoSQL数据库原理主要探讨了非关系型数据库与传统的关系型数据库在设计和操作上的差异。在第二章中,重点讲解了NoSQL数据库的基本原理,包括它如何打破关系模型的常规特征,以及它对完整性约束和事务机制的不同处理...

    nosql入门 ----------待续

    **标题解析:** "nosql入门 ----------待续" 这个标题暗示了我们要探讨的是NoSQL数据库的基础知识,而且这个话题可能是一个系列的一部分,但具体的信息由于"待续"一词表明并未完整提供。 **描述分析:** "NULL" 的...

    NoSQL数据库-MongoDB和Redis

    NoSQL数据库的出现是为了应对传统关系型数据库无法解决的一些问题,特别是在大规模数据处理方面。CAP理论(Consistency,Availability,Partition Tolerance)指出,在分布式系统中,一致性(Consistency)、可用性...

    NoSQL数据库入门

    NoSQL(Not Only SQL)数据库是一种非关系型数据库系统,其设计目的是为了处理大量数据,尤其是在分布式、云计算和大数据环境中。与传统的SQL数据库相比,NoSQL数据库提供了更高的可伸缩性、灵活性和性能。 在...

    NoSQL数据库探讨.ppt

    NoSQL数据库,全称为"Not Only SQL",是在互联网web2.0时代兴起的一种新型数据库解决方案,主要用于处理大规模数据和高并发访问的需求。传统的SQL(结构化查询语言)关系型数据库在面对这类挑战时,往往表现出性能...

    大数据挑战与NoSQL数据库技术PDF

    “大数据挑战与NoSQL数据库技术”这本书很可能深入探讨了这些问题,包括大数据的挑战、NoSQL数据库的原理、各类NoSQL数据库的特点以及如何在实际项目中选择和使用NoSQL数据库。通过阅读这本书,读者可以更全面地了解...

    nosql数据库的应用探讨

    ### NoSQL数据库的应用探讨 #### NoSQL产生的背景 随着互联网技术的飞速发展,特别是社交网络、移动互联网等新兴领域的兴起,传统的关系型数据库面临着前所未有的挑战。这些挑战主要体现在三个方面:一是对数据库...

    BUPT NoSQL数据库

    本章节主要探讨了NoSQL数据库中的三种重要类型:图数据库、文档数据库和列族数据库,并结合北京邮电大学(BUPT)的相关课程作业进行深入学习。 首先,让我们详细了解一下图数据库。图数据库以节点、边和属性三元组...

    NoSQL数据库之MongoDB源码和PPT

    MongoDB是一种流行的开源、分布式、文档型的NoSQL数据库,其设计目标是处理大量数据的同时,提供高可用性、高性能和可伸缩性。在这个"MongoDB源码和PPT"的压缩包中,我们可以期待深入理解MongoDB的核心概念、工作...

    NOSQL数据库入门【淡绿色背景版本】.pdf

    NoSQL(Not Only SQL)数据库是一种非关系型数据库,与传统的SQL(Structured Query Language)数据库相比,NoSQL数据库在处理大规模数据集、提供高并发访问以及灵活的数据模型方面具有显著优势。接下来,我们将深入...

    大数据挑战与NoSQL数据库技术 (PDF版)- 陆嘉恒编著

    《大数据挑战与NoSQL数据库技术》一书,由陆嘉恒编著,深入探讨了在当前数据爆炸的时代,如何应对大数据带来的挑战,并介绍了NoSQL数据库技术作为解决方案的重要角色。本书内容丰富,旨在帮助读者理解大数据的特性、...

    NOSQL数据库的查询处理

    **方法**:可以结合使用NoSQL数据库和关系型数据库,利用RDBMS的强大查询能力来弥补NoSQL在这方面的不足。例如,可以在RDBMS中存储NoSQL数据库中对象的关键属性,并通过标准SQL查询来检索这些属性。 **示例**:如果...

    Linux运维-03-NoSQL数据库之MongoDB-03配置.zip

    MongoDB是一种流行的开源NoSQL数据库,它以JSON格式存储数据,具有高性能、高可用性和可扩展性的特点。在Linux环境中,MongoDB的配置是运维工作中的重要环节,它关系到数据库的稳定运行和性能优化。本篇将深入探讨...

    10NoSQL非关系型数据库.zip

    标题“10NoSQL非关系型数据库”暗示了我们将探讨10个重要的NoSQL数据库相关主题,而描述没有提供具体信息,所以我们只能根据提供的压缩文件名来深入讲解其中涉及的NoSQL数据库——Redis和MongoDB。 1. **Redis**: ...

Global site tag (gtag.js) - Google Analytics