揭秘Facebook背后的那些軟件
對于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
留言列表