对于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的高性能图片存取系统(严格来说,是一个对象存储系统,因此它并不仅限于存储照片)。它工作繁忙;要管理超过20亿张上传的照片,并且每一片照片被保存为四种不同的分辨率,因此有超过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工程师们还会带来啥好东东吧,相信一定会很有趣。毕竟,他们在攀登一座我们大多数人只能在梦中见到的大山,建设一个用户比大部分国家人口都多的网站。要干这样的事情,你总得有点创造力。(注:最后一段很难翻译,感谢半含朝雨的翻译支持)
英文原文:Exploring the software behind Facebook, the world’s largest site
翻译:博客园
部分翻译文字参考自:http://blog.jobbole.com/entr.php/73
相关推荐
### Facebook数据仓库揭秘:RCFile高效存储结构 #### RCFile:一种混合型高效存储结构 在大数据处理领域,特别是对于像Facebook这样的大型社交平台来说,数据仓库的设计与优化至关重要。Facebook提出了一种新的...
Facebook移动客户端开发揭秘.doc
显而易见,Facebook的工程师们不会像传统软件行业那样使用瀑布模型进行开发,他们不断地开发新的功能,并迅速上线,让用户能够访问到这些新功能,这就是大家口中经常提到的持续部署(continuousdeployment)。...
Facebook作为全球最大的社交网络平台,其背后的基础设施规模庞大且复杂。为了高效管理其数据中心的网络流量,Facebook采用了SDN(Software-Defined Networking,软件定义网络)技术。SDN的核心理念是将网络控制层面...
Facebook API和Facebook_JAR包是开发者用来与Facebook平台进行交互的重要工具,它们使得开发者能够创建应用程序,集成到Facebook生态系统中,实现数据交换、用户登录验证、发布内容等功能。Facebook API通常指的是...
bitlbee-facebook, 用于BitlBee的Facebook协议插件 bitlbee的Facebook协议插件。 这个插件使用基于 Facebook Messenger mqtt的协议。这里项目与 Facebook 。Inc不相关。用法bitlbee wiki中提供了通用用法说明:...
Facebook签到位置预测是一个涉及大数据分析、地理位置服务和社交网络行为学的复杂主题。在这个问题中,我们关注的是如何利用用户在Facebook上分享的签到信息来预测他们可能的未来签到位置。以下是对这个话题的详细...
在IT行业中,Facebook分享是一项常见的功能,特别是在移动应用和网页开发中。Facebook分享允许用户将内容,如文本、图片或链接,快速便捷地发布到他们的Facebook时间线,从而扩大信息的传播范围。在这个"facebook...
本书由Diomidis Spinellis等著,王海鹏等翻译,是一本讲诉架构设计之美的著作,书中介绍了什么是一个好的架构,怎样创建软件架构,什么是伸缩性的架构设计,并通过风靡全球的社交软件Facebook平台的架构距离,具体...
Facebook Android SDK 4.8.2 是Facebook提供的一款用于帮助Android开发者在其应用中集成Facebook功能的开发工具包。这个版本的SDK包含了实现Facebook登录、分享、邀请、广告以及分析等功能所需的库和资源。通过使用...
Facebook是全球最大的社交媒体平台之一,其背后有着复杂的网络架构来支撑数亿用户的日常互动。这份“Facebook的架构”PDF文件详细介绍了这个庞然大物的技术基础。以下是对这份文档内容的概览: Facebook架构的核心...
Facebook作为全球最流行的社交平台之一,拥有庞大的用户基础和流量,其技术架构自然成为了业界关注的焦点。为了维持高效的分享和通信能力,Facebook构建了一个复杂的系统来应对难以想象的访问量和数据规模。2007年11...
具体来说,Facebook WiFi利用了Facebook账号作为认证凭据,通过与路由器制造商合作,在路由器上安装特定的软件模块,以支持Facebook WiFi认证流程。当用户尝试连接支持Facebook WiFi的Wi-Fi网络时,路由器会自动检测...
### Facebook的成功秘诀及其本质 #### 引言与背景 自2005年起,随着互联网技术的迅猛发展,社交网络服务(Social Networking ...对于希望借鉴Facebook经验的SNS网站来说,理解其成功背后的多维度因素至关重要。
标题“facebook2008”指的是关于2008年Facebook平台的相关学习资源,这可能包括当时的API(应用程序编程接口)文档、开发指南以及可能的使用教程。2008年是Facebook发展的一个重要阶段,它推出了许多关键功能,如...
这本书的书名——《打造Facebook:亲历Facebook爆发的5年》很嚣张,谁有资格可以说这句话呢,当然,扎克伯格最有资格,但他不会亲自来告诉你,至少从目前的情况来看,近几年都不大可能。而且,这不是一个人的公司。...
Facebook登录分享发布信息程序是基于C#编程语言和Facebook SDK(FaceBook.dll)构建的应用,旨在为用户提供一种简便的方式,通过Webview组件实现用户在Windows桌面应用中的Facebook账户登录,并授权应用发布信息到...
Unity Facebook API 官方 Demo 是一个为游戏开发者提供的完整工程,它展示了如何在Unity引擎中集成Facebook的功能,以便实现用户登录、得分分享、排行榜展示以及头像获取等社交互动功能。这个Demo项目名为...
### Facebook数据仓库揭秘之RCFile高效存储结构 #### RCFile高效存储结构概述 Facebook的数据仓库在处理海量数据方面面临着巨大挑战。为了优化数据处理效率,Facebook引入了一种名为RCFile(Record Columnar File...
"FaceBook插件开发入门教程" 本文将从Facebook插件开发的角度,讲解如何创建一个简单的Facebook插件,并介绍Facebook插件开发的基本概念和流程。 一、Facebook插件开发简介 Facebook插件开发是指在Facebook平台上...