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