文章来源:http://www.keakon.cn/bbs/thread-2093-1-1.html
由于平时经常接触Google App Engine,所以对NoSQL也算比较关注。在设计网站时,总会不由自主地考虑使用NoSQL是否合适,而在给我的网站添加社交功能时,我也不禁想到了一个问题:Twitter为何会采用那么麻烦的NoSQL?
最早是看到
《Digg和Twitter都在迁移数据库到Cassandra》这篇文章才知道Twitter准备采用NoSQL。
用过Twitter的都知道,Twitter有timeline(时间线)这个概念。简单来说(忽略Retweet、DM等情况),你发的Tweet(包括reply等,下同)会出现在你的公开时间线上,而你的时间线相当于你和所有你关注的人(following)的公开时间线的并集。也就是说,你和你关注的人(following)所发的Tweet会出现在你的时间线;与此同时,你发的Tweet也会出现在关注你的人(followers)的时间线。
所以要提升Twitter的性能,必定要对这几个时间线来动手,可是这样问题就来了。
首先看传统的关系型数据库可以怎样处理吧(下面只是简化处理而已)。
第一个表是用户,存储用户的id、name和其他资料。第二个表是用户关系,存储用户id和其关注者。第三个表是Tweet,存储用户id和他所发的Tweet信息。
这样发Tweet是很简单的,只要在表三中insert一条即可。而删除也是同样的。
在获取公开时间线时,只要将表一和三进行inner join就行了。而在获取某个用户的时间线时,将表一和二进行inner join,获得所有following;加上该用户自己后,再和表三inner join,就能获得他和所有following的公开时间线,也就是他的时间线了。
这里不难看出,如果一个人following了很多人,那么获取所有following的公开时间线时会有个很庞大的inner join,非常影响性能。值得庆幸的是一般人不会following太多人(少于100),因为那会导致信息爆炸。可是Twitter上还有不少机器人存在,这些家伙想following多少都是有可能的…
因此这种方案最大的弊端就是庞大的inner join了,为了减少它的次数,使用memcache是比较常规的方法。
可是缓存用户的时间线是非常低效且不可靠的,所以缓存公开时间线显得更为合理。但如果仍然采用相同的数据库设计,当一个用户的公开时间线缓存失效时,就不得不再次更新所有用户的公开时间线缓存以避免inner join了,所以数据库设计仍然得更改。
于是再增加表四:公开时间线,内容就是用户和其最近所发的一些Tweet(或其id)。
那么在发Tweet时,需要插入表三并更新表四,删除也一样。
而在获取公开时间线时,先从缓存中取,拿不到再取表四,并放入缓存。获取用户的时间线时,也是先获取所有following,再分别从缓存中取following的公开时间线,取不到的再从表四里获取,最后合并即可。
这个方案的性能无疑比前者要好些,因为时间线并不需要即时性,只不过编程复杂度要高一些。
可Twitter为什么仍然对其不满呢?于是我又去研究了一下
Cassandra。
在我对其的粗略研究中(不到一小时),我发现这个数据库也是采用键值对的存储方式,数据通信是采用JSON格式。虽然是键值对,但它却还支持范围查询(所以我估计是采用树,而不是hash算法,或者同时使用2类索引)。另一个重要特性是分布式,可以随意增加数据库结点来提升整体的读写性能。
因此不难看出,Twitter是被后者所吸引了。目前Twitter已有超过100亿条Tweet和1亿多用户,而它之前一直在使用MySQL作为后台数据库。可是MySQL对于处理超大型的数据比较棘手,而且在分布式方面也不是那么得心应手。就算去掉非活跃用户,要求峰值时支持1000万并发也在情理之中,可我估计非分布式数据库大概只能支持几千到几万并发。而突破了单台数据库的物理瓶颈,性能就可以通过服务器数量来提升了,这大概就是Twitter所打的如意算盘吧。
写到这里我突然发现了一篇好文:
《NoSQL数据库笔谈》,想深入了解NoSQL的不妨看看。这里面也谈到了一点:Twitter是没有自己的硬件的,全部由NTTA提供和维护,所以增加服务器也不会影响运营成本。
只是这样数据库设计也不得不改动了,正好我在Cassandra Wiki里发现了一个
Twissandra,于是就拿它来说明了。
这个Twissandra使用了Timeline和Userline这2个ColumnFamily(相当于关系数据库的表),于是就很好解释了。
用户发Tweet时不但要插入Tweet,还要插入Userline,然后遍历follower,分别插入他们的Timeline。由于非关系型数据库没有join操作,所以这个遍历是在应用服务器上完成的,因此要多次访问数据库。有些明星型用户可能有上百万的follower,这样发一个Tweet就要访问百万次数据库,这也是我在Google App Engine上遇到的一个难题(要知道一个GAE应用最多只能并行30个数据库查询)。
当然,获取时也有遍历的问题,但由于前文所述,following一般不会太多,所以还不算什么大问题。
由此可见,Twissandra带来了巨大的性能问题:过多的数据库访问。当然,如果Twitter有1亿台服务器的话,还是可以支持上百个拥有百万follower的用户来并行发Tweet,只是这个代价确实太高了。
那么Twitter肯定不会做这种蠢事,必然会使用更为有效的设计方案,可这个方案是什么?
最显而易见的就是不在数据库里使用Timeline和Userline这种区分,只使用公开时间线。这样就和方案二差不多,只不过join变成了多次数据库访问,同时也减少了数据冗余。
这样对一个用户来说,它的响应时间应该会比关系型数据库要慢,但由于存在缓存,所以平均下来仍然是差不多的。而对于整个系统而言,由于可以扩充大量数据库服务器,所以对数据库的并发性能有大幅提升。
因此在低负载时,单一用户的性能感受应该是略微降低了;而在高负载时,则会有较大改观。而幸运的是Twitter几乎一直都是高负载状态,所以转向NoSQL也在情理之中。
只是对我个人而言,一个低负载的SNS网站采用NoSQL似乎是弊大于利,可谁叫Google不给我其他的选择呢?
分享到:
相关推荐
Digg、Twitter、Google、微软等等公司已经开始研究NoSQL,并在一些项目中进行实施。许多人甚至抛弃了MySQL开源数据库这个长期以来Web 2.0的宠儿,而改由NoSQL的方案来替代,因为优势实在是引人注目
1. **社交媒体**:如Facebook、Twitter利用NoSQL处理用户动态、好友关系等大量实时数据。 2. **电子商务**:如亚马逊使用NoSQL存储商品信息、用户行为等,支持快速检索和个性化推荐。 3. **物联网**:IoT设备产生的...
Twitter 运维经验是指使用Twitter的运维经验。 运维经验是指分布式系统的运维经验。 Metrics是指分布式系统的性能Metrics。 配置管理是指分布式系统的配置管理。 Darkmode是指分布式系统的Darkmode。 进程管理...
NoSQL(Not Only SQL)的概念在21世纪初随着大数据时代的到来而兴起,它打破了传统的关系型数据库模型,为处理海量数据提供了新的解决方案。 一、NoSQL的崛起与背景 在互联网时代,特别是社交网络、电子商务和大...
#### 为什么选择NoSQL? 1. **关系型数据库的扩展问题**:关系型数据库在面对大规模数据处理时往往难以扩展。 - **案例研究**:eBay是一个早期采用NoSQL技术的先驱。Dan Pritchett在其文章《BASE: An Acid ...
NoSQL,全称为Not Only SQL,是一种非关系型数据库,其设计目的是为了处理现代互联网应用中的大规模数据存储和高并发访问需求。随着Web2.0时代的到来,传统的SQL关系数据库在处理这些问题上显得力不从心,从而催生了...
首先,让我们来了解为什么我们需要使用非关系数据库。随着互联网web2.0网站的兴起,非关系型数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。传统的关系数据库在应付web2.0网站,特别是超大...
- **Twitter运维经验**:NoSQL数据库帮助Twitter处理海量的微博消息。 #### 六、总结与展望 NoSQL数据库的发展不仅改变了我们处理大规模数据的方式,也为构建高性能、高可用性的分布式系统提供了强有力的支持。...
NoSQL,全称为"Not Only SQL",是一种非关系型数据库技术,主要针对大规模数据分布式存储、高并发访问、大数据量处理等场景而设计。相比于传统的关系型数据库(如MySQL、Oracle),NoSQL数据库在灵活性、扩展性和...
NoSQL数据库,全称为"Not Only SQL",是一种非关系型的数据库系统,旨在解决传统关系型数据库在处理大规模数据和高并发场景下遇到的问题。在90年代,由于网站访问量较小,静态网页为主,单一数据库可以满足需求。但...
NoSQL数据库,全称为"Not Only SQL",是近年来在应对互联网大规模、高并发、高可扩展性和高可用性需求背景下发展起来的一种非关系型数据库。相比于传统的SQL关系数据库,NoSQL数据库提供了不同的数据模型和存储机制...
NoSQL数据库的应用案例包括eBay、淘宝、Flickr和Twitter等大型网站,它们在应对海量用户和数据时,都利用了NoSQL数据库的特性来构建其架构。 在实际运维中,NoSQL数据库需要考虑的因素有: - 可扩展性:通过水平...
应用篇介绍了eBay、淘宝、Flickr、Twitter等公司在使用NoSQL数据库时的架构经验和运维经验,包括处理高并发、大数据量、系统扩展性等问题的方法。 总结来说,NoSQL数据库学习教程涵盖了分布式系统的基础理论、核心...
NOSQL,全称为Not Only SQL,意为“不仅仅是SQL”,是一种非关系型的数据库系统,旨在处理大规模数据分布式、集群环境下的存储和访问。NOSQL数据库通常以键值对、列存储、文档存储、图形数据库等形式存在,它们在可...
《Twitter使用的技术详细解析》 Twitter,作为全球知名的社交媒体平台,自2006年推出以来,凭借其独特的服务模式和技术创新,在Web 2.0时代迅速崛起。本文将深入探讨Twitter的业务模式、编程语言选择、网站架构以及...
### NoSQL数据库笔谈知识点概览 #### 一、NoSQL概述 -NoSQL(Not Only SQL)是指一类非关系型数据库...以上内容总结了《NoSQL笔谈》中涉及的关键概念和技术细节,为理解NoSQL数据库及其应用场景提供了全面的视角。
本文旨在系统地介绍NoSQL数据库的相关技术、算法和思想,以及当前市场上广泛使用的NoSQL数据库实例。 #### 二、NoSQL的核心理念 ##### 1. CAP理论 CAP理论是NoSQL领域的重要基石之一,它提出了分布式系统无法同时...