以Facebook現在的經營規模,諸多傳統服務器的技術均將崩潰或根本無法支撐。那么面對5億的活躍用戶,Facebook的工程師們又將如何讓網站平穩運轉呢?伯樂在線 - 職場博客的這篇文章將展示Facebook的工程師完成這個艱巨任務所用到的一系列軟件。 Facebook級別規模的挑戰 在我們深入細節之前,先了解一組Facebook不得不面對數據,你就可以想象這種規模。
Facebook所用的軟件 從某些方面來說,Facebook還是屬于LAMP類型網站,但是,為了配合其他大量的組件和服務,Facebook對已有的方法,已經做了必要的改變、拓展和修改。 比如:
還有定制的系統,比如, Haystack -- 高度可擴展的對象存儲,用來處理Facebook的龐大的圖片;Scribe -- Facebook的日志系統。 下面展現給大家的是,全球最大的社交網站Facebook所使用到的軟件。 Memcached Memcached是一款相當有名的軟件。它是分布式內存緩存系統。Facebook(還有大量的網站)用它作為Web服務器和MySQL服務器之間的緩存層。經過多年,Facebook已在Memcached和其相關軟件(比如,網絡棧)上做了大量優化工作。 Facebook運行著成千上萬的Memcached服務器,借以及時處理TB級的緩存數據。可以這樣說,Facebook擁有全球最大的Memcached設備。 HipHop for PHP 和運行在本地服務器上代碼相比,PHP的運行速度相對較慢。HipHop把PHP代碼轉換成C++代碼,提高編譯時的性能。因為Facebook很依賴PHP來處理信息,有了HipHop,Facebook在Web服務器方面更是如虎添翼。 HipHop誕生過程:在Facebook,一小組工程師(最初是3位)用了18個月研發而成。 Haystack Haystack是Facebook高性能的圖片存儲/檢索系統。(嚴格來說,Haystack是一對象存儲,所以它不一定要存儲圖片。)Haystack的工作量超大。Facebook上有超過2百億張圖片,每張圖片以四種不同分辨率保存,所以,Facebook有超過8百億張圖片。 Haystack的作用不單是處理大量的圖片,它的性能才是亮點。我們在前面已提到,Facebook每秒大概處理120萬張圖片,這個數據并不包括其CDN處理的圖片數。這可是個驚人的數據!!! BigPipe BigPipe是Facebook開發的動態網頁處理系統。為了達到最優,Facebook用它來處理每個網頁的分塊(也稱“Pagelets”)。 比如,聊天窗口是獨立檢索的,新聞源也是獨立檢索的。這些Pagelets是可以并發檢索,性能也隨之提高。如此,即使網站的某部分停用或崩潰后,用戶依然可以使用。 Cassandra Cassandra是一個沒有單點故障的分布式存儲系統。它是前NoSQL運動的成員之一,現已開源(已加入Apache工程)。Facebook用它來做郵箱搜索。 除了Facebook之外,Cassandra也適用于很多其他服務,比如Digg。 Scribe Scribe是個靈活多變的日志系統,Facebook把它用于多種內部用途。Scribe用途:處理Facebook級別日志,一旦有新的日志分類生成,Scribe將自動處理。(Facebook有上百個日志分類)。 Hadoop and Hive Hadoop是款開源Map/Reduce框架,它可以輕松處理海量數據。Facebook用它來做數據分析。(前面就說到了,Facebook的數據量是超海量的。)Hive起源于Facebook,Hive可以使用SQL查詢,讓非程序員比較容易使用Hadoop。(注1: Hive是是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供完整的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。 ) Thrift Facebook在其不同的服務中,使用了不同的語言。比如: PHP用在前端,Erlang用于聊天系統,Java和C++用于其它地方,等等。Thrift是內部開發的跨語言的框架,把不同的語言綁定在一起,使之可以相互“交流”。這就讓Facebook的跨語言開發,變得比較輕松。 Facebook已把Thrift開源,Thrift支持的語言種類將更多。 Varnish Varnish是一個HTTP加速器,擔當負載均衡角色,同時也用于快速處理緩存內容。 Facebook用Varnish處理圖片和用戶照片,每天都要處理十億級的請求。和Facebook其他的應用應用一樣,Varnish也是開源的。 Facebook可以平穩運行,還得利于其他方面 雖然上面已經提到了一些構成Facebook系統的軟件,但是處理如此龐大的系統,本身就是一項復雜的任務。所以,下面還將列出使Facebook能平穩運行的一些東西。 逐步發布&暗啟動 Facebook有一個系統,他們稱之為“門衛”。該系統可以針對不同種類的用戶運行不同的代碼。(它簡單介紹了代碼庫中的不同條件。)該系統讓Facebook逐步發布新特性、A/B測試、激活僅針對Facebook員工的特性 等等。 門衛系統也讓Facebook做些“暗啟動”的事情。比如,在某一特性上線之前,可以激活該特性背后的元件。另外,它還可以做模擬壓力測試,發現瓶頸和潛在的問題。默默啟動一般都是在正式啟動之前的2周完成。 實時系統的簡介 Facebook會仔細監控自身系統,有趣的是,它還監控每個PHP函數在實時生產環境下的性能。這一實時PHP環境監控是通過一個叫XHProf的開源工具完成的。 逐步禁用某些特性,借以提高性能 如果Facebook遇到性能問題,Facebook有大量的途徑來逐步禁用不很重要的特性,以提高其核心特性性能。 尚未提到的東西 雖然這里無法過多深入硬件方面,但硬件絕對是Facebook能達到空前規模的重要因素。比如,和其他大型網站一樣,Facebook也用CDN來處理靜態內容。Facebook還在美國西部的俄勒岡州建有一超大的數據中心,可以隨時增加服務器。 當然了,除了前面已經提到的,還有其他大量的軟件沒有說到。但是,希望能突出其中非常有特色的。 Facebook和開源之間的“戀情” Facebook和開源之間聯系,此文不能不提,雖不能說Facebook是多么地鐘愛開源,但至少可以這樣說,Facebook是“愛”著開源的。 Facebook不僅使用(也捐贈)開源軟件,比如,Linux、Memcached、MySQL、Hadoop等等,它還內部開發不少軟件,并且也將之開源。 Facebook開發的開源工程,包括HipHop、Cassandra、Thrift和Scribe。另外,Facebook也把Tornado開源了。Tornado是一個高性能的Web服務器框架,由FriendFeed幕后團隊開發而成。(2009年8月,Facebook收購FriendFeed。) (Facebook所用到的開源軟件,可以在Facebook的開源頁面找到。) 面臨更多的大規模挑戰 Facebook以一種令人難以置信的速度成長。它的用戶群幾乎是成倍增加,活躍用戶數量現已接近5億。而且,誰都無法預測今年底,活躍用戶量會到多少。 Facebook甚至成立了一個專門的“成長小組”,該小組不斷思考如何讓人們使用facebook并融入到facebook中。 這一快速成長,意味著Facebook將遇到不同的性能瓶頸。Facebook會面臨來這如下方面的挑戰:PV、搜索、上傳的圖片和狀態消息,用戶之間的交互和用戶和Facebook之間的交互帶來的挑戰。 這也是Facebook面對的事實。Facebook的工程師們將繼續尋求新方法來擴展(這不只是增加服務器的問題了)。比如,隨著網站成長,其圖片存儲系統已經多次完全重寫。 所以,我們將看到Facebook的工程師們奔向下一個“山頭”。我們相信他們不會辜負眾望。畢竟,他們正跨越山頭,那個我們大多數人僅能向往的山頭;他們正擴展網站,那個用戶來自全球各地的網站。當你實現那個里程碑時,你將彪炳史冊。