我的原文:http://allenlsy.com/2011/04/25/facebook/
最近读了一片文章,觉得值得精读一下。原文在这里:
http://www.quora.com/What-is-Facebooks-architecture
前端
大家都知道Facebook的网页是由php写出来的。实际上Facebook上有一个神秘的Hiphop项目,它负责把php代码转成C++。这样能优化php。Hiphop这个项目的负责人是北大1987届遗传与分子生物专业毕业生,普林斯顿CS博士赵海平。Hiphop为Facebook的服务器减少了50%的CPU使用率。Facebook曾经尝试了很多办法优化网站,甚至重写了Zend引擎,并且提交给了PHP项目,但都没能达到目标,后来才选择了Hiphop。Hiphop的原理是,在php转C++的过程中实现了三步操作:静态分析(分析依赖关系)->类型推演(选择合适的C++变量类型)->代码生成。此项目总共30万行代码,在google groups上有讨论。http://groups.google.com/group/hiphop-php-dev。
Facebook在Http在传输时使用了BigPipe。有兴趣的同学可以去查查这方面的资料。简单的说它是一个Web服务器和浏览器之间建立的一种不同传统http模式的传输方式。网上普遍用的加速方法有延迟javascript的加载或者并行下载等方式。BigPipe当然也有并行的思想。它最重要的地方是调整了一些请求的发送顺序,实现了网页加载的加速。当Web服务器挣在生成页面时,此时的浏览器正处于闲置状态。如何让Web服务器产生时间和浏览器的Rendering时间重合呢?BigPipe采用的是分解页面的办法。不多说了。
Facebook使用了Varnish Cache实现的反向代理服务器技术。普通的代理服务器技术是,客户手动配置Proxy,把请求发给Proxy,由Proxy转发给Web服务器。Web服务器并没有配置和使用这个Proxy。反向代理服务器的最大不同是,Web服务器配置了这个Proxy,而用户没有配置它。比如当Facebook用户把请求发给一个IP地址时,以为发给了Facebook的服务器,其实可能只是发给了Facebook的Proxy。这个Proxy负责把请求发给Facebook的内部服务器组。这样黑客如果黑这个IP,其实对Facebook影响不大,因为数据并不在Proxy上面。Varnish Cache的开发者是丹麦人Kamp,他也是FreeBSD的内核开发者之一。
在Operating Systems Design and Implementation 2010上有一篇论文,讲了Facebook所使用的Haystack图片存储系统。Facebook目前有260Billion张图片,总共20PB,平均每张800KB,并且数据量还在以每周60TB的速度增长。Haystack的使用动机解释起来有点复杂。主要原理是让多个逻辑文件共享一个物理文件。就好像是非常多的图片文件和并称了一个大文件,这个文件格式是Facebook自行设计的,再在里面搞些Indexing。搜索图片时,实际上用的又是它自行设计的查找算法,这样完全绕过了操作系统的文件查找算法。在Google论文中搜索Finding a needle in Haystack: Facebook's photo storage可以查到更多资料。
业务逻辑层
这一层是Facebook自己的核心项目Thrift,后来开源了。它的主要目的是实现各种不同编程语言间的相互通信,包括C++、Java、python、ruby、C#、erlang、cocoa、php等等。这些语言之间通过XML或者JSON来传递数据。Apache已经将Thrift列入孵化器项目中了。请见 http://incubator.apache.org/thrift。据说是Facebook觉得tomcat服务器太重量级了,所以他们用Java些的Services都没有架在公开的服务器框架上,而是只供Thrift使用。
数据访问层
这是所谓的持久化操作,由MySQL、Memcached、Facebook自己的Cassandra、Hadoop的HBase一同完成。
Memcached是一套高效的分布式内存缓存框架,它能减少对象读取数据库的次数。作者Anatoly Vorobey是以色列理工大学毕业的,年纪也不小了。另一名作者是华盛顿大学毕业的Brad Fitzpatrick。他的成名作其实是LiveJournal。
Cassandra是一个非关系型数据库,也是Facebook自己开发的,现在开源了。它是一个分布式的数据库系统,而不是一个单纯的数据库。对于一个分布式数据库进行一次读写,这条命令会被路由到所有的数据库节点上去。Cassandra具有很好的扩展性和稳定性,这对Facebook来说是极其重要的。
HBase是Apache Hadoop项目的一个子项目。Hadoop项目本身是提供分布式计算的。这里说的是计算,主要功能不是上面的数据库存储。HBase是基于Hadoop之上做的一个分布式数据库,其名字表明它就是Hadoop Database的意思,主要实现分布式储存。理论基础来自于Chang et al所写的Goole论文Bigtable。现在普遍认为HBase是Bigtable的开源实现(因为Google自己还实现了一套Bigtable)。
Facebook的工程师说他们正在减少Cassadra的使用,因为他们更喜欢HBase,因为那个更简单好用。
硬件
最近炒得很火热的Facebook在俄勒冈州的新数据中心,有超过60000台服务器。当然和Google一样,这些服务器都是自己设计的。这个数据中心将支持Facebook提出的Open Compute项目。很多人对这个项目进行很多有趣的评论。因为对于Google和Amazon来说,他们的数据中心技术是严格保密的。Facebook竟然公开了类似的顶尖技术,就好像跟Google示威说,以后人人都能学会如何搭建这样的Web数据中心。
稍微娱乐一下。
一是今天看到了一张图,是由Facebook的一个实习生Paul Butler制作的。他把Facebook的5亿用户的用户关系还出来了。是哪里一片漆黑了呢?
点击查看原图,3.8M高清
二是,据说在Google Images上搜索cstring会有意想不到的结果。我感到很抱歉,为什么会这样?
一些参考资料:
http://www.facebook.com/notes.php?id=9445547199
http://www.infoq.com/presentations/Facebook-Software-Stack