对于Facebook这样超大规模的网站,很多传统的解决方案根本不适用。Facebook工程师们面临的巨大挑战是保证一个近5亿活跃用户的网站一直稳定可靠地运行。他们是如何做到的呢,这篇文章将介绍一下他们所使用的软件和技术。
Facebook飞速发展面临的挑战
在进入讨论细节之前,先看下面的一些数据,也许让你对Facebook所面临的巨大挑战有一些直观的认识:
- Facebook每月有5700亿页面浏览量 (据Google Ad Planner)。
- Facebook的照片量比其他所有图片网站加起来的还要多(包括Flickr等网站)。
- 每个月超过30亿张照片被上传。
- Facebook的系统每秒要处理120万张照片。这还不包括CDN处理的照片。
- 每月有超过25亿条内容 (状态更新,评论等)被共享。
- Facebook有超过30,000台服务器 (这是去年的数据!)
Facebook飞速发展所依赖的软件
在某些程度上说,Facebook仍然是LAMP的站点,但为了能容纳很多其他的元素与服务,Facebook不得不对它们进行改进与扩展,并修改现行的一些做法。
例如:
- Facebook仍使用PHP,但为它建立了一个编译器,将PHP代码编译为在Web服务器上执行的本地代码,从而提高性能。
- Facebook使用Linux,但针对自己的需求对Linux进行了优化,特别是网络吞吐量方面。
- Facebook使用MySQL,但主要是作为一个Key-value的持久性存储系统,而将连接查询和逻辑操作放在Web服务器上进行,因为在那里更容易进行优化。
另外还有自已开发的系统,如Haystack,一个高度可扩展的对象存储系统,用来存储Facebook上巨量的照片。还有Scribe,一个可以运行在Facebook这种超大规模网站上的日志系统。
好,让我们来看看全球最大的社交网站所使用的软件吧。
Memcached
Memcached是当今互联网上最著名的软件之一。它是一个分布式的内存缓存系统,Facebook(包含其他很多网站)用它作为Web服务器和MySQL服务器之间的缓存层(因为数据库访问相对比较慢)。多年来,Facebook已经对Memcached和它的周边软件进行了很多优化,比如对network stack的优化。
Facebook每时每刻都有数10TB的数据缓存在数千台Memcached服务器上。它可能是世界上最大的Memcached服务器集群了。
HipHop for PHP
PHP作为一种脚本语言,和本地代码相比是运行缓慢的。HipHop可以将PHP转换成C++代码,然后再进行编译,这样可以获得更好的性能。由于Facebook严重依赖PHP,所以通过HipHop可以让Web服务器的性能得到提高。
一个工程师小团队在Facebook(一开始只有三人)花了18个月时间开发HipHop,现在已经投入正式使用。
Haystack
Haystack是Facebook的高性能图片存取系统(严格来说,是一个对象存储系统,因此它并不仅限于存储照片)。它工作繁忙;要管理超过200亿张上传的照片,并且每一片照片被保存为四种不同的分辨率,因此有超过800亿张照片。
它不仅要能处理上亿的照片,而且性能也是至关重要的。正如我们前面提到的,Facebook每秒钟要处理约120万张照片,而且不包括CDN上的,这是一个惊人的数字。
BigPipe
BigPipe是Facebook开发的的动态网页处理系统。为了获得最佳性能,Facebook用它来按分块处理每个网页(称为“pagelets”)。
例如,聊天窗口,新闻Feed等是通过分块分开进行传输的。这些pagelets可以并行工作,不仅可以提高性能,而且即使其中一部分失效或中断,也不影响用户的正常访问。
Cassandra
Cassandra是一个可以避免单点故障的分布式存储系统。它是NoSQL运动的一个典范,并已开放源代码(它甚至成为一个Apache项目)。Facebook在收件箱搜索中使用它。
除了Facebook,其他网站也在使用它,例如Digg。
Scribe
Scribe是一个灵活的日志系统,Facebook在内部大量使用它。它能够处理Facebook这样超大规模的日志记录,并且能自动处理新生成的日志记录类别(Facebook有数百个日志类别)。
Hadoop and Hive
Hadoop是一个开源的map-reduce实现,它可以轻松处理海量数据。Facebook用它来进行数据分析(我们都知道Facebook有巨量的数据)。Hive起源于Facebook,它使得针对Hadoop进行SQL查询成为可能,从而非程序员也可以方便地使用。(注: Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务运行。 )
Hadoop和Hive都是开源的(Apache项目),并且被一些大的网站使用,例如雅虎和Twitter。
Thrift
Facebook在不同的服务中,使用不同的语言。PHP用于前端,Erlang用于聊天,Java和C++也用在一些地方(也许还有其他语言)。Thrift是一个内部开发的跨语言框架,它把不同的语言绑定在一起,让它们之间相互“交流”。这样,Facebook就可以很方便地进行跨语言开发。
Facebook已将Thrift开源,支持的语言会越来越多。
Varnish
Varnish是一个HTTP加速器,不仅可以作为一个负载均衡器,而且可以快速地对内容进行缓存。
Facebook使用Varnish来处理照片和个人资料图片,每天要处理数十亿的要求。像Facebook使用的其他软件一样,Varnish也是开源的。
保证Facebook平稳运行的其他因素
上面我们介绍了支撑着Facebook网站系统的一些软件。但是,处理如此庞大的系统是一项复杂的任务,下面我们将列出保证Facebook平稳运行的一些其他方面的东西。
逐步发布和暗启动
Facebook有一个叫“Gatekeeper”的系统,可以针对不同的用户运行不同的代码。它让Facebook可以逐步地发布新功能,进行A/B测试,只为Facebook员工激活某些特性。
Gatekeeper也可以让Facebook实现“暗启动”,在一些功能正式投入使用之前,先激活这些功能中的某些特性(用户不会察觉,因为UI上并没有体现,所以称之为暗启动)。 这可以当作现实世界的压力测试,帮助在正式发布前发现存在的瓶颈和其他问题。暗启动通常是在正式发动前两个星期。
Profiling
Facebook会仔细监控系统运行情况,有趣的是还会监控每一个PHP函数在生产环境中的性能,使用的是开源工具XHProf。
通过逐步禁用不重要的功能来提升性能
如果Facebook运行时出现性能问题,有一个方法就是逐步地禁用不太重要的功能,以增强Facebook核心功能的性能。
没有提及的方面
我们没有提及硬件方面,但这也是Facebook能达到如此规模的重要环节。例如,和其他大型网站一样,Facebook利用CDN来处理静态内容。Facebook在美国西部的俄勒冈州还有一个巨大的数据中心,可以随时根据需要增加服务器。
Facebook的开源情节
谈到Facebook,我们不能不提及Facebook是多么喜欢开源,或者可以这么说,Facebook是“爱”着开源的。
Facebook不仅使用(也贡献于)已有的开源软件,比如Linux,Memcached,MySQL,Hadoop等等,而且把自己内部开发的软件开源。比如:HipHop, Cassandra, Thrift 和 Scribe。
Facebook还开源了由FriendFeed团队开发的高性能Web服务器框架Tornado(FriendFeed 2009年8月被Facebook收购)。
Facebook所用到的开源软件清单,可以在http://facebook.com/opensource找到。
飞速发展带来的更多挑战
Facebook以令人难以置信的速度在发展,它的用户数的增长几乎是指数级的,现在已经接近5亿活跃用户,谁也不知道年底这个数字会达到多少,看起来每6个月就增加1亿的用户。
Facebook甚至有一个专门的“growth team”,该小组不断地研究如何让人们更多地使用并融入Facebook。
如此快速的发展,比如页面浏览、图片上传,状态信息等用户与网站之间以及用户与用户之间的各种交互内容的增长,将会产生各种各样的性能瓶颈,带来各种各样的挑战。
这是Facebook要面对的现实。Facebook工程师们必须不停地尝试并找到新方法来解决网站飞速发展中遇到的各种问题,比如Facebook的照片存储系统已经被完全重写了好几次。
我们就等着看facebook工程师们还会带来啥好东东吧,相信一定会很有趣。毕竟,他们在攀登一座我们大多数人只能在梦中见到的大山,建设一个用户比大部分国家人口都多的网站。要干这样的事情,你总得有点创造力。(注:最后一段很难翻译,感谢半含朝雨的翻译支持)