PHP搭建百萬級網站架構技術揭秘:Poppen.de德國社交
在瞭解過世界最大的PHP網站,Facebook的後台技術後,今天我們來瞭解一個百萬級PHP網站的網站架構:Poppen.de。Poppen.de是德國的一個社交網站,相對Facebook、Flickr來說是一個很小的網站,但它有一個很好的架構,融合了很多技術,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。
統計資訊
◆200萬註冊使用者數;
◆2萬並發使用者數;
◆每天20萬條私人訊息;
◆每天25萬登入次數;
◆項目團隊有11個開發人員,兩個設計,兩個系統管理員;
商業模式
該網站採用免費增值模式,使用者可以免費使用下面任何服務:
◆搜尋其他使用者;
◆給好友發送訊息;
◆上傳圖片和視頻;
◆尋找好友;
◆視訊交談;
◆更多…
但如果使用者想享受不受限制發送訊息和上傳圖片,那麼就得根據需要支付不同類型的會員服務,視訊交談及網站其他服務也採用同樣的策略。
工具箱
Nginx
Poppen.de 所有的服務都是基於Nginx服務上的。前端有兩台Nginx伺服器在高峰期提供每分鐘15萬次請求的負載,每個機器已經有四年壽命,並且只有一個CPU 和3GB RAM。Poppen.de擁有三台獨立的映像伺服器,由三台Nginx伺服器為*.bilder.poppen.de提供每分鐘8萬次請求服務。
Nginx 架構中一個很酷的設計就是有很多請求是由Memcached處理的,因此請求從緩衝中擷取內容而不需要直接存取PHP機器。比如,使用者資訊頁(user profile)是網站需要密集處理的內容,如果把使用者資訊頁全部緩衝到Memcached上,那麼請求直接從Memcached上擷取內容。 Poppen.de的Memcached每分鐘可以處理8000次請求。
架構中有三個Nginx映像伺服器提供本地映像緩衝,使用者上傳圖 像到一個中央檔案伺服器。當向這三個Nginx之一中請求映像時,如果伺服器本地中沒有存在該映像,則從中央檔案伺服器下載到該伺服器上作緩衝並提供服 務。這種負載平衡的分布式映像伺服器架構設計可以減輕主要存放裝置的負載。
PHP-FPM
該網站運行在PHP- FPM上。共有28台雙CPU、6GB記憶體的PHP機器,每個機器上運行100個PHP-FPM的背景工作執行緒。使用啟用了APC的PHP5.3.x。 PHP5.3可以降低CPU和記憶體使用量率的30%以上。
程式碼是基於Symfony1.2架構之上開發的。一是可以使用外部資源,二是 能夠提高項目開發進度,同時在一個著名的架構上可以讓新開發人員更容易加入到團隊中來。雖然沒有任何事情都是十全十美的,但可以從Symfony架構中得 到很多好處,讓團隊可以更多的精力放在Poppen.de的業務開發上去。
網站效能最佳化使用XHProf,這是Facebook開源出來的一個類庫。這個架構非常容易個人化和配置,能夠可以緩衝大部分高代價的伺服器計算。
MySQL
MySQL是網站 主要的RDBMS。網站又幾個MySql伺服器:一台4CPU、32GB的伺服器儲存使用者相關資訊,如基本資料、照片描述資訊等。這台機器已經使用了4 年,下一步計劃會使用共用叢集來替換它。目前仍基於這個系統上進行設計,以簡化資料存取碼。根據使用者ID進行資料分區,因為網站中大部分資訊都是以使用者 為中心的,如照片、視頻、訊息等。
有三台伺服器按主-從-從配置架構提供使用者論壇服務。一台從伺服器負責網站自訂訊息儲存,到現在有 2.5億條訊息。另外四台機器為主-從配置關係。另外由4台機器配置成NDB族群專門服務於密集型寫操作資料,如使用者訪問統計資訊。
資料表設計盡量避免關聯操作,儘可能緩衝最多的資料。當然,資料庫的結構化規範已經完全被破壞掉了。因此,為了更容易搜尋,資料庫設計建立了資料採礦表。大部分表是MyISAM型表,可以提供快速尋找。現在的問題是越來越多的表已經全表鎖住了。Poppen.de正考慮往XtraDB儲存引擎上遷移。
Memcached
網站架構中Memcached應用相當多,超過45GB的快取和51個節點。緩衝了Session會話、視圖緩衝以及函數執行緩衝等。架構中有一個系統 當記錄被修改時可以自動地把資料更新到緩衝中去。未來改善緩衝更新的可能方案是使用新的Redis Hash API或者MongoDB。
RabbitMQ
在 2009年中開始在架構中使用RabbitMQ。這是一個很好的訊息解決方案,便於部署和集中到這個架構中去,在LVS後運行了兩台RabbitMQ服務 器。在上個月,已經把更多的東西整合到該隊列中,意味著同一時刻有28台PHP伺服器每天要處理50萬次請求。發送日誌、郵件通知、系統訊息、映像上傳等 更多的東西到這個隊列中。
應用PHP-FPM中的fastcgi_finish_request()函數整合隊列訊息,可以把訊息非同步發 送到隊列中。當系統需要給使用者發送HTML或JSON格式響應時,就調用這個函數,這樣使用者就沒有必要等到PHP指令碼清理。
這個系統可以改善架構資源管理。例如,在高峰期服務每分鐘可以處理1000次登入請求。這表示有1000並發更新使用者表儲存使用者的登入時間。由於使用了隊列機制,可以 按相反的順序來運行這些查詢。如果需要提高處理速度,只需要增加更多的隊列處理者即可,甚至可以增加更多的伺服器到這叢集中去,而不需要修改任何配置和部 署新節點。
CouchDB
日誌儲存CouchDB運行在一台機器上。在這台機器上可以根據模組/行為進行日誌查詢 /分組,或者根據錯誤類型等等。這對定位問題非常有用。在使用日誌彙總服務CouchDB之前,不得不逐台登入到PHP伺服器上設法日誌分析定位問題,這 是非常麻煩的。而現在把所有的日誌集中到隊列中儲存到CouchDB中,可以集中進行問題檢查和分析。
Graphite
網站使用Graphite採集網站即時資訊並統計。從請求每個模組/行為到Memcached的命中和未命中、RabbitMQ狀態監控以及Unix負載等等。Graphite服務平均每分鐘有4800次更新操作。實踐已經證實要監測網站發發生什麼是非常有用的,它的簡單文本協議和繪圖功能可以方便地即插即 用的方式用於任何需要監控的系統上。
一件很酷的事情是使用Graphite同時監控了網站的兩個版本。一月份部署了Symfony架構新 版本,以前代碼作為一個備份部署。這就意味著網站可能會面臨效能問題。因此可以使用Graphite來對兩個版本線上進行對比。
發現新版本上的Unix負載表較高,於是使用XHProf對兩個版本進行效能分析,找出問題所在。
Red5
網站為使用者也提供了兩種類型的視頻服務,一種是使用者自己上傳的視頻,另外一種是視訊交談,使用者視頻互動和分享。到2009年年中,每月為使用者提供17TB的Cellular Data Package。
Tsung
Tsung 是一個Erlang編寫的分布式基準分析工具。在Poppen.de網站中主要用於HTTP基準分析、MySQL與其他儲存系統(XtraDB)的對比分 析。用一個系統記錄了主要的MySQL伺服器的流量,再轉換成Tsung的基準會話。然後對該流量進行回放,由Tsung產生數以千計的並發使用者訪問實驗 室的伺服器。這樣就可以在實驗環境中與真實情境非常接近。