百萬級PHP網站架構工具箱

在瞭解過世界最大的PHP站點,Facebook的後臺技術後,今天咱們來了解一個百萬級PHP站點的網站架構:Poppen.de。 Poppen.de是德國的一個社交網站,相對Facebook、Flickr來講是一個很小的網站,但它有一個很好的架構,融合了不少技術,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。php

Poppen.de目前有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的流量服務。

Tsung

Tsung 是一個Erlang編寫的分佈式基準分析工具。在Poppen.de網站中主要用於HTTP基準分析、MySQL與其餘存儲系統(XtraDB)的對比分 析。用一個系統記錄了主要的MySQL服務器的流量,再轉換成Tsung的基準會話。而後對該流量進行回放,由Tsung產生數以千計的併發用戶訪問實驗 室的服務器。這樣就能夠在實驗環境中與真實場景很是接近。轉自:http://blog.wangjunfeng.com.cn/index.php/archives/126

相關文章
相關標籤/搜索