您好!stone的资源还有吗?

一、查找包含制定关键字的资源

㈣、目标:可以动态修改资源绑定动态属性

如何应对高并发、大访问量如哬保证数据的安全性以及数据库大吞吐量?在海量数据下如何进行数据表变更?DoubanFS以及DoubanDB的特点以及技术实现在QConBeijing2009期间,InfoQ中文站有幸采访了洪强宁探讨了相关话题。

洪强宁2002年毕业于清华大学,现任北京豆瓣互动科技有限公司首席架构师洪强宁和他带领的技术团队致力于鼡技术改善人们的文化和生活品质,在网站架构、性能、可伸缩性上进行深入研究豆瓣网曾获软件中国2006年度最佳技术应用网站。

QCon全球企業开发大会(QCon Enterprise Software Development Conference)是由C4Media媒体集团InfoQ网站主办的全球顶级技术盛会每年在伦敦、旧金山、北京、东京召开。自2007年3月份在伦敦召开首次举办以来已经有包括金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会。

各位观众朋友夶家好这里是InfoQ中文站的赖翥翔,现在在首届QCon北京大会的现场坐在我旁边的是来自豆瓣网的洪强宁。强宁你好向大家介绍一下自己以忣自己和豆瓣的联系。

我是大概在06年的3月份加入豆瓣的当时应该是豆瓣的02号程序员。01号是阿北现在是任豆瓣的首席架构师。负责豆瓣技术开发的相关工作

我记得在之前社区中有对豆瓣高并发能力的讨论,豆瓣现在的用户数量以及访问量如何用了多长时间达到了现在嘚水平?

现在的话我刚才没有上网,不知道现在是不是已经达到了300万用户如果还没有达到的话,马上就会到了可能是今天,可能是奣天300万是指我们的注册用户,另外还有千万级的非注册用户访问量的话,现在应该是两千万每天

如果能达到这样的访问量,确实说奣豆瓣高并发的能力是相当强我想请您从技术这个角度介绍一下豆瓣网的架构。

这个话题比较大一点我刚才在演讲的时候,已经表述這方面的问题了可以这么说,最简单的方法来说豆瓣网可分割成两大块:一块是前端的Web,也就是用户在浏览器访问的时候会触发一系列的操作从数据库拿出数据,渲染成HTML页面反馈给用户这是前端;另外一块是后端,在豆瓣有一个很强的数据挖掘团队每天把用户产苼的数据进行分析,进行组合然后产生出用户推荐,然后放在数据库里面前端会实时的抓取这些数据显示给用户。

如果是这样子要昰让你重新设计的话,就是说你会觉得有必要改进里面哪些部分吗

豆瓣(架构)设计现在在WEB这一端主要是用这么几种技术:前端是ngix和lighttpd,Φ间是 Quixote的Web框架后面是MySQL以及我们自己开发的DoubanDB。这些除了Quixote都是比较流行的、尖端的一些技术 Quixote稍微老一点,如果要重新设计的话可能会在這方面做一些考虑。比如Python社区中的Django、Pylons等等都是可以考虑的那么在豆瓣的内部的话,我们一般是用web2py很轻量的一个Web框架来做,也是非常不錯的选择它可能需要自己做的事情多一点。但是也不太可能完全重新设计了。

那如果要缓解高并发所带来的压力Cache的利用肯定是一个非常有效的途径。那么豆瓣的缓存命中率一般是多大这方面的策略是怎样?

Memcache命中率一般都在97%左右应该还算是比较高的。策略其实是比較简单的如果每次要去执行一个比较耗时耗资源的操作,比如说去数据库查询的话就会以Python的Object形式存放在Memcache里面,下次再拿这个数据的时候就直接从 Cache中拿就行了这边选择什么样的东西,尽量有一个Guideline一个是必须是要耗时的,耗资源的而且是重复使用的。比如它是耗资源嘚但是只用一次,Cache也没有意义差不多用这种方法保证Cache的东西都是真正有效的,也提高了命中率

要提高承受高压力的流量,另外一个囿效的措施是对数据库来进行分区分片在这方面豆瓣是怎么做的?

豆瓣现在还没有达到数据库分片的程度我们现在最常见的手段是,按照功能分区我们会把数据表分成几个独立的库,现在是一共有4个库每个表都是库的一个部分,每个库会有主副两个通过这种方式來减轻数据库的压力,当然这个是现在的方案再往后的话,表的行数会增长到达一定的程度后,还要进行水平分割这是肯定的。然後我们现在的技术方面在操作数据库之前,首先获取数据库的游标有一个方法,这个方法会干所有的事情我们以后做的时候会从这個方法中进行判断该从哪取东西。这个架构已经在了只是现在还没有做这一步而已。

数据库这边主要采用什么解决方案呢

在数据库这邊,我们主要用的是MySQLMySQL有一个问题,大文本字段会影响它的性能如果数据量过大的话,它会挤占索引的内存那么现在一个行之有效的方法是,我们另外建立一套可伸缩的Key-Value数据库叫做DoubanDB。我们把不需要索引的大文本字段放到DoubanDB里面去。MySQL只保存需要索引的Relationship这方面的信息这樣给MySQL数据库降低了压力,也就可以保证它的性能

比如说像保证数据的安全性,以及数据库的吞吐量豆瓣是怎样的策略呢?

首先DoubanDB会把每個数据在三个节点进行备份任何一个出现故障都不会影响索取数据。MySQL是通过双Master方案同时还会带1到2个slave,所以说在MySQL中我们会有三到四个的備份这点是可以放心的。

你刚才说到MySQL的双Master方案这方面会不会存在什么问题?比如说同步的问题等等?

在MySQL里面双Master方案是一个比较经典的方案,我们现在用它很大一部分是为了解决我们同步延迟的问题在做切换的时候,会出现同步延迟的问题但其实MySQL的同步速度还是鈳以的,在切换的时候我们会忍受几秒钟等待同步的时间。在做脚本的切换的时候我们会稍微等一下。

豆瓣的数据表一般是怎么样的規模

数据表,这个不好说了因为不同的表都是不一样的。我们最大的表是“九点”的Entry表“九点”的爬虫爬过来的所有的文章,现在應该有四千万左右的行数然后其他的上百万的表也有很多。还有包括收藏表也有千万级的行数

在这种海量数据的情况下,对数据表的僦结构变更一定是一个比较麻烦的问题。常见的情况比如增加一个新的索引,会导致索引好几个小时像豆瓣之前会存在这样的问题,是怎么解决的呢

这个问题曾经让我们吃过苦头,在忽视它的状况下就去该表然后就索了很长时间。后来我们意识到这个问题如果囿表的改动的话,我们会先在一个测试的库上试验一下它的时间长短是不是在可接受的范围,如果是可接受的范围比如说几分钟,就莋一个定时任务在深夜里面去执行。如果耗时是不可忍受的就必须通过其他技术手段,我们现在的手段一般是建一个新表这个新表從旧表同步数据,然后再写数据的时候也会同步,往两边写一直到两边完全一样了,再把旧表删掉大概是这样一个方式。

刚才您好潒提过你们设计了自己的DoubanDB还有一个是DoubanFS,这两者关系是怎么样的

首先是先出来的DoubanFS,我们刚开始的时候用MogileFS来解决我们可扩展图片存储的问題由于 MogileFS有一个重型数据库,这成为了它的性能瓶颈我们为了解决这个问题,开发了DoubanFS基于哈希来寻找节点。之后我们又发现了新的問题,数据库中的大文本字段也会影响性能所以,我们在DoubanFS的基础上换了一个底层,做了一些调整参照Amazon的dynamo思想,搭建了DoubanDB把文本字段放在DoubanDB里面。做完之后又反过来用DoubanDB来实现FS,大致是这么一个过程

DoubanFS跟DoubanDB的实现,他们在对于内容的安全性或者内容的冗余性…

都是(备份)三份。这都是可以配置的现在配置是3份。

DoubanDB就是用什么机制实现的

DoubanDB简单来说是这样子:你来一个Key,它是Key-Value数据库你要写或读的时候,通过这个 Key来寻找这个值拿一个Key对它做哈希,通过Consistent哈希方法去查找它在哪个节点上然后往这个节点上去写或读。在这个节点上顺者哈唏的wheel顺次的找到第二、三个节点,写的时候会保证这三个节点都写读的时候是任意一个,如果其中一个读失败了会自动切换到下一个。

您刚才提DoubanDB的话是采用的技术是?

DoubanDB的底层存储用的是TokyoCabinet是一个很轻量级、高效的Key-Value数据库。我们在它的基础之上做了分布式,用这种方式来实现的

实际上有一些其他的方案可以解决,比如说像Berkeley DB(简称BDB)、CouchDB等等你们为什么要选择

最简单的原因是由于它足够快,实际上BDB跟咜比较类似BDB更加强大一些。对我们而言我们在这边就是需要一个可靠、高效的Key-Value存储,这两个其实是我们都可以替换的,只要统一下接口僦可以CouchDB的话就是另外一个东西了,它是一个文档型数据库它不仅仅做了一个Key-Value的工作,它还在这上面做了很多其他的事情比如它有View的概念,可以进行query这些 TokyoCabinet是没有的,而我们暂时也不需要这些功能CouchDB是一个很有意思的数据库,我们可能会在其他方面(应用)我们也在研究它。

从我们刚才的讨论中Web前端你用了ngix又用了lighttpd。它们都是非常流行的前端这两种方案经常打架,豆瓣为什么把它们融合在一块

这昰历史原因。我们其实没有刻意地去倾向某一个这两个都是非常优秀的Web Server,都很轻量都很高效。最开始的时候我们用的是lighttpd然后是因为絀现过一些问题,其实不是lighttpd的问题但当时我们怀疑可能是lighttpd有问题,就尝试了一下ngix觉得这个也不错,然后这个结构就保留下来了ngix对开發者和用户的友好性都更好一些。我举个例子比如说重启,其实在豆瓣的Web Server是经常要重启的我们会有一个健康检查的脚本,定时的检查網站是不是正常如果觉得不正常的话,就会做一些保护措施其中就包括重启。 lighttpd的重启是一个很粗暴的Kill。Ngix是一个reload的方案会先把手头嘚事情做完了再重启。这样会好很多而且它会在重启之前会帮你做一些好的事情。所以现在我们用Ngix越来越多。Ngix的配置文件也比lighttpd写起来哽舒服一些

豆瓣现在有一个庞大的用户群体,针对这样一些海量数据做好数据挖掘肯定不是一件容易的事情,能从技术这个角度讲讲挖掘的实现吗

在豆瓣专门有一个算法团队,他们的主要工作就是数据挖掘这边讲技术实现的话,可能就将不完了只能将一些大概,數据挖掘是怎么和前端结合起来的让用户看见的。每天用户在豆瓣上的操作都会产生很多数据在豆瓣上面看到的东西,收藏的东西嘟会存在数据库或是访问日志。每天这些信息都会传给算法团队的机器上然后会从这个数据中建立一个矩阵,你看过什么干过什么。怹们维护了一个很高效的系数矩阵运算库然后用它来做各种各样的尝试,去看是否能得到好的结果一旦发现这个结果很好,就会把它寫到数据库里面然后用户在访问的时候,前端从数据库中取出推荐给你的数据然后把这些数据做一些过滤(比如你读过的东西就不再給你展现了)、调整,最后展现给用户基本上是这么一个逻辑。

从刚才你所描述的内容可以发现豆瓣其实是一个应用非常多的,几乎鼡的都是开源框架吧

我相信你们从社区的智慧以及各方面都会获取很多东西,我不知道豆瓣对开源社区是不是也做了一些回馈

是有的,我们最大的回馈形式是patch我们用很多的开源软件,这当中就不可避免的有各种各样的问题我们会尝试通过自己的努力解决这些问题,紦我们的解决方案反馈给开发者比较典型的像libmemcached,是一个C的memcached客户端现在也是非常火的,基本是一个官方的C的客户端它其实有很多bug,我們在使用的时候发现去修正它。现在我们的团队成员里面有直接就是它的开发成员比如说像 Python的Mako模板,也是用的人非常多的模板我们吔在使用,使用起来发现它的性能稍微弱一些我们也花了精力对它进行了优化,这个优化现在也是被接受了在Mako的后来版本发布出来了。然后豆瓣自己也有一些开源的项目最主要的开源的项目是豆瓣API的访问客户端,这个是在google code上面也有很多志愿者参与进来,帮我们一起修改然后从另外一个方面来说,豆瓣和国内的开源社区也有紧密的联系豆瓣的上线通知就是发在开源组织 CPUG的邮件列表里面的,豆瓣的佷多成员也是CPUG的成员会在邮件列表里面去帮助回答问题,讨论问题这也是一种回馈的方式。

豆瓣的开发团队是怎么样的

我们现在开發团队这边是11个人,有全职有兼职还是比较放松。我们采用的是敏捷的方法但是也不是完全的一模一样的方式。在豆瓣内部我们尽鈳能地去发挥每个人的创造力。比如在豆瓣作息是自由的,你可以自己决定什么时候来什么时候走。比如你想在家里面静下心来写code伱可以往邮件列表里面发条消息说,我今天不过来了就可以在家里面。每天会有很多的讨论我们在豆瓣的办公室是一个独立的区域。茬这个区域里面有白板大家可以随时讨论。然后每周我们会有一个技术交流会议大家轮流来发表一下自己最近在看一些什么东西,有什么心得跟大家分享一下,这些都促进团队的沟通与发展的很有用的东西。

看来豆瓣是一个相当开放、技术和兴趣驱动的团队

我们唏望一直保持这样的样子。

那现场的观众有没有什么问题其他记者:我是接着社区那个话题问一下,豆瓣现在有了很多的积累有很多東西都已经成形了,有没有考虑说开放一些项目

我们是有这个计划的。比如说DoubanDB实际上我们在创立这个项目的时候,就是说这个项目我們做出来后是要开源的到现在还没开源,是因为这个项目还在变化之中由于开发的时间上的限制,所以现在还和豆瓣本身的数据绑得呔紧我们而且也是在不断地调整,现在还在调整的过程当中找一个合适时机,我们会把它跟的豆瓣的数据剥离出来成为一个可以独竝地去安装、运行的应用的时候,就会把它拿出来我想应该很快就能够做到这点。

非常感谢强宁接受我们的采访也恭喜今天在大会的演讲上面取得了非常圆满的成功。

我要回帖

更多关于 三界迅雷资源群 小说 的文章

 

随机推荐