豆瓣网对互联网用户来说是知名的Web 2.0社区,但对开发者而言,更重要的是一个应用Python打造的非常成功的Web 2.0站点。豆瓣网已经达到了300万注册用户,另外还有千万级的非注册用户。访问量每天则超过两千万。
豆瓣Python应用开发经验谈
豆瓣是一个Web 2.0网站,这类网站的特点就是“Always Beta”,不断有新的产品和功能升级来为用户提供更好的服务。作为使用Python进行开发的网站,豆瓣有效的程序开发配置和版本控制值得我们学习。
豆瓣的主要开发环境配置就是SVN+Trac+Bitten。豆瓣的版本管理系统使用的是Subversion(SVN),使用Trac来管理协同开发,同时使用Trac的Bitten插件进行持续集成。
在开发模式方面,由于是Always Beta,豆瓣采用的方式是:站点运行在主分支上,开发者在开发新功能时会建立一个子分支,新功能开发并测试完成后,会更新服务器的主分支版本,之后上线。
在开发框架方面,豆瓣主要使用Quixote(被称之为“堂吉诃德”,一个轻量级的Python Web框架,简单、高效,代码简洁);后台运行的Web服务主要使用Web.py(web.py也是一个Python的Web框架,简单且功能强大)。
豆瓣网可分割成两大块:一块是前端的Web,也就是用户在浏览器访问的时候会触发一系列的操作,从数据库拿出数据,渲染成HTML页面反馈给用户,这是前端;另外一块是后端,在豆瓣有一个很强的数据挖掘团队,每天把用户产生的数据进行分析,进行组合,然后产生出用户推荐,然后放在数据库里面,前端会实时的抓取这些数据显示给用户。
豆瓣(架构)设计现在在WEB这一端主要是用这么几种技术:前端是nginx和lighttpd,中间是Quixote的Web框架,后面是MySQL以及我们自己开发的DoubanDB。这些除了Quixote都是一些比较流行的、尖端的技术。Quixote稍微老一点,如果要重新设计的话,可能会在这方面做一些考虑。比如Python社区中的Django、Pylons等等都是可以考虑的,那么在豆瓣的内部的话,我们一般是用web.py,很轻量的一个Web框架来做,也是非常不错的选择,它可能需要自己做的事情多一点。
豆瓣现在还没有达到数据库分片的程度。最常见的手段是,按照功能分区。我们会把数据表分成几个独立的库,现在是一共有4个库。每个表都是库的一个部分,每个库会有主副两个。通过这种方式来减轻数据库的压力,当然这个是现在的方案,再往后的话,表的行数会增长,到达一定的程度后,还要进行水平分割,这是肯定的。然后我们现在的技术方面,在操作数据库之前,首先获取数据库的游标,有一个方法,这个方法会干所有的事情,我们以后做的时候会从这个方法中进行判断该从哪取东西。这个架构已经在了,只是现在还没有做这一步而已。
数据库这边主要采用什么解决方案呢?
在数据库这边,我们主要用的是MySQL。MySQL有一个问题,大文本字段会影响它的性能。如果数据量过大的话,它会挤占索引的内存。那么现在一个行之有效的方法是,我们另外建立一套可伸缩的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等等,你们为什么要选择TokyoCabinet?
最简单的原因是由于它足够快,实际上BDB跟它比较类似,BDB更加强大一些。对我们而言,我们在这边就是需要一个可靠、高效的Key-Value存储,这两个其实是我们都可以替换的,只要统一下接口就可以。CouchDB的话就是另外一个东西了,它是一个文档型数据库,它不仅仅做了一个Key-Value的工作,它还在这上面做了很多其他的事情,比如它有View的概念,可以进行query。这些TokyoCabinet是没有的,而我们暂时也不需要这些功能。CouchDB是一个很有意思的数据库,我们可能会在其他方面(应用),我们也在研究它。
在豆瓣专门有一个算法团队,他们的主要工作就是数据挖掘。这边讲技术实现的话,可能就讲不完了。只能讲一些大概,数据挖掘是怎么和前端结合起来的,让用户看见的。每天用户在豆瓣上的操作都会产生很多数据,在豆瓣上面看到的东西,收藏的东西,都会存在数据库或是访问日志。每天这些信息都会传到算法团队的机器上,然后会从这个数据中建立一个稀疏矩阵,你看过什么,干过什么。他们维护了一个很高效的稀疏矩阵运算库,然后用它来做各种各样的尝试,去看是否能得到好的结果,一旦发现这个结果很好,就会把它写到数据库里面。然后用户在访问的时候,前端从数据库中取出推荐给你的数据,然后把这些数据做一些过滤(比如你读过的东西就不再给你展现了)、调整,最后展现给用户。基本上是这么一个逻辑。
关于Python
Python语言的历史可以参考《Guido Rossum:打造Google第三大开发语言》
关于Subversion
Subversion(简称SVN)是一款开源的版本控制管理系统,被认为是CVS的替代者。Subversion的版本库可以通过网络访问,从而使用户可以在不同的电脑上进行操作。从某种程度上来说,允许用户在各自的空间里修改和管理同一组数据可以促进团队协作。
关于Trac
Trac是一个开源软件平台,集成了Wiki和问题跟踪管理系统。Trac以简单的方式建立了一个软件项目管理的Web应用,以帮助开发人员更好地写出高质量的软件。Trac采用Python语言开发的,因此Trac的在运行的时候,需要有Python环境的支持。
关于Quixote
Quixote是一个Python的Web框架,它基于简单灵活的方案设计,可以进行快速地开发项目,而且使用很多Python第三方模块。通过恰当地配置,可以让Quixote发挥巨大能量,这使得它可以被用于大规模系统当中。
相关推荐
MicroPython顾名思义就是可以在微型控制器上跑的Python,换句话说就是用Python语言控制单片机。所谓Python其实就是一种编程语言,就像非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的...
主要语言:Python 项目分类:[编程语言] [资源库] 项目标签:[Python] [技能提升] 推荐理由:一个Python资源集合库,汇集了Python生态中最热门的项目、工具、库、框架等。该项目旨在为Python开发者提供一个集中的...
Selenium 2自动化测试实战 基于Python语言 企业批量购书 分享 关注商品举报 Selenium 2自动化测试实战 基于Python语言 这不仅是一本Selenium2自动化测试书,同时还是一本实用的Python基础编程书
"Python编程之美——带你进入Python语言世界"课程设计大纲参考 Python语言是一种高级、解释型的编程语言,它具有简洁、易学、强大等特点,广泛应用于数据科学、人工智能、网络爬虫、自动化操作等领域。本课程设计...
Python语言应用领域 Python语言作为一个高级语言,具有简洁、灵活、易学易用的特点,在各种领域都有着广泛的应用。下面我们将从桌面软件、网络编程和爬虫开发三个方面对Python语言的应用领域进行深入剖析。 1. ...
Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱,广泛应用于Web开发、数据分析、人工智能等领域。本教程“Python语言程序设计实践教程”旨在帮助学习者通过实践来掌握Python编程基础,而...
《OpenCV 3计算机视觉 Python语言实现(第二版)》是一本深入介绍使用Python编程语言与OpenCV库进行计算机视觉应用开发的专业书籍。OpenCV(开源计算机视觉库)是一个广泛应用于图像处理和计算机视觉领域的强大工具,...
《简明Python教程》是一本面向初学者的Python编程指南,旨在帮助读者快速掌握Python语言的基础知识和核心概念。Python是一种广泛应用于数据处理、Web开发、科学计算等领域的高级编程语言,以其简洁、易读的语法深受...
OpenCV 3计算机视觉:Python语言实现 (Joe Minichino)
Python 官方文档是 Python 语言的权威指南,涵盖了 Python 语言的方方面面,从基本语法到高级特性,从标准库到实践应用。本文档的主要内容包括 Python 语言的语法、标准库、实践应用等方面。 Python 语言的语法是 ...
《Python语言程序设计基础》是由嵩天和礼欣两位作者合作编著的教材,第二版在高教出版社出版。这本书是Python编程初学者的理想选择,它深入浅出地介绍了Python编程的基本概念和技术,旨在帮助读者掌握Python编程的...
Python语言:程序设计课程教学改革的理想选择.pdf Python语言:程序设计课程教学改革的理想选择.pdf Python语言:程序设计课程教学改革的理想选择.pdf Python语言:程序设计课程教学改革的理想选择.pdf Python...
Python语言程序设计基础是编程初学者的绝佳教材,尤其适合那些对第二版内容感兴趣的读者。嵩天等作者的这本著作深入浅出地介绍了Python编程的基础概念和实践技巧,旨在帮助读者快速掌握这一强大而易读的语言。通过...
公开课:Python 程序语言入门 教案.pdf公开课:Python 程序语言入门 教案.pdf公开课:Python 程序语言入门 教案.pdf公开课:Python 程序语言入门 教案.pdf公开课:Python 程序语言入门 教案.pdf公开课:Python 程序...
《量化投资:以Python为工具》主要讲解量化投资的思想和策略,并借助Python 语言进行实战。《量化投资:以Python为工具》一共分为5 部分,第1 部分是Python 入门,第2 部分是统计学基础,第3 部分是金融理论、投资...
Python语言程序设计教程_例题源码
教孩子学编程 PYTHON语言版 教孩子学编程 PYTHON语言版
任务 搭建Python开发环境 任务背景 本任务需要完成Python开发环境搭建,包括Python和PyCharm的安装与使用,此外还需要了解Python的发展历史、Python的特点、Python的应用领域等。 Python程序设计:Python介绍全文共...
机器学习深度学习实战教学视频 :Python语言核心编程(Python开发基础,Python面向对象编程,Python核心) 机器学习深度学习实战教学视频 :Python语言核心编程(Python开发基础,Python面向对象编程,Python核心)