百萬級PHP站點Poppen.de的技術架構

Facebook無疑是現在世界上最大的PHP站點,關於Facebook的技術架構可以在網上搜索到很多資料,今天我們來了解另外一個百萬級PHP站點的網站架構:Poppen.de。

Poppen.de是德國的一家交友/ 聊天/ 視頻 的SNS網站,對於該網站的統計數字有:1)200萬的用戶數,2)2萬的併發用戶數,3)每天產生30萬的私信,4)25萬的日登錄用戶數。這樣的網站也就是個中型規模的網站,下面看看這個網站在技術應用及經驗方面帶來的東西。但它有一個很好的架構,融合了很多技術,如 Nigix、MySql、CouchDB、Erlang、Memcached、PHP、RabbitMQ(消息服務器),採用了Graphite作爲網站的系統監 控,Red5作爲視頻服務,Tsung作爲壓力測試工具,選擇的技術種類較多。而項目團隊有11個開發人員,兩個設計,兩個系統管理員。該站點的商業模式採用免費增值模式,用戶可以使用搜索用戶、給好友發送消息、上載圖片和視頻等功能。

如果用戶想享受不受限制發送消息和上載圖片,那麼就得根據需要支付不同類型的會員服務,視頻聊天及網站其他服務也採用同樣的策略。
Poppen.de 是德國的成人交友/約會網站,小朋友不要隨便上哦,網站裏的內容很開放,有很多怪叔叔(Gay),呵呵。與Facebook這樣巨頭網站相比算是一個小型網站了,但是通過Poppen.de網站這次對外的技術信息分享,可以看出網站有個不錯的技術架構,讓我們可以從中得到很多值得學習與借鑑的內容。
NSFW這個英文縮寫常常出現在Blog中,表示某個站點含有露點或者極度暴力的內容,如果你在上班的時候打開這個網站你的同事經過你身邊的時候估計會讓你很尷尬,呵呵。所以目前我們通過普通方式是無法打開這個站點,如果你非要滿足自己的好奇心的華可以自己想辦法解決,我就不明說了。這裏來個截圖,如圖所示:

技術架構描述

Nginx(web服務器)

Poppen.de 所有的服務都是基於Nginx服務上的,包括靜態請求和動態請求。前端有兩臺Nginx服務器在高峯期提供每分鐘15萬次請求的負載,每個機器已經有四年壽命,並且只有一個CPU 和3GB RAM。Poppen.de擁有三臺獨立的圖像服務器,由三臺Nginx服務器爲*.bilder.poppen.de提供每分鐘8萬次請求服務。

Nginx 架構中一個很酷的設計就是有很多請求是由Memcached處理的,因此請求從緩存中獲取內容而不需要直接訪問PHP機器。比如,用戶信息頁(user profile)是網站需要密集處理的內容,如果把用戶信息頁全部緩存到Memcached上,那麼請求直接從Memcached上獲取內容。對於緩存整個動態請求頁面內容,這是一種方法,更常見的是使用squid、varnish來做。 Poppen.de的Memcached每分鐘可以處理8000次請求。

架構中有三個Nginx圖像服務器提供本地圖像緩存,用戶上載圖像到一箇中央文件服務器。而前端的nginx在請求時會做本機的cache處理(不知道它的請求是如何落到 nginx上的,如果是隨機的,多臺nginx本機cache的數據就重複了,有些浪費,但也最簡單),對於圖片量不大的情況倒是簡單的處理方法。當向這三個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(緩存)

cache爲王,Poppen.de有超過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對兩個版本進行性能分析,找出問題所在。

如果你想嘗試一下的話,具體的安裝步驟參見:http://graphite.wikidot.com/installation
安裝好以後的效果如圖所示:

graphite

graphite圖示

Red5

網站爲用戶也提供了兩種類型的視頻服務,一種是用戶自己上載的視頻,另外一種是視頻聊天,用戶視頻互動和分享。到2009年年中,每月爲用戶提供17TB的流量服務。

Tsung

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

如圖:

tsung-report_s

tsung-report_s

如果你有興趣的話,可以查看Tsung詳細的用戶手冊:http://tsung.erlang-projects.org/user_manual.html

經驗

1、背靠大樹好乘涼,選擇技術和工具時要挑成熟、活躍的社區,這樣有問題也有途徑及時解決。
2、瞭解你所使用的技術的優缺點,發揮它的優點,避開它的缺點。
3、擴展工具,讓工具更好的滿足你。
4、敢於嘗試。可以看到,越是大公司,在技術選型時越是縮手縮腳,生怕外面的東西不成熟有問題,總相信自己能造成更好的自己能掌控的輪子。而看看 Poppen.de上面提到的東西,有多少是你不知道沒用過的?再感慨一下,每天都有大量的開源項目出現,一些因爲被人關注而衆人拾柴,東西就存活下去, 一些儘管東西很好但因爲無人問津,也就悄無聲息的死去。
5、度量一切,對網站的各個模塊、系統、流量等數字有清晰的認識。
6、經驗積累、全面把握。不要等到上線時發現新模塊的功能不是需要的,不要等到上線時發現模塊性能不滿足需求。

總結

下圖爲網友猜想的poppen.de的架構示意圖:

architecture_s

architecture_s

Poppen.de還做了些展望,比如將更多的使用erlang產品,這要是個國內的公司,估計很多人會膜拜的。而總結來說,Poppen.de分享的東西真是很實在很實用,是個很開放也很技術流的公司,對中小規模的網站來說是可充分借鑑的。

來至Javabloger的總結:

1.越來越多的網站由於業務的壯大,在尋求通過消息傳遞的,異步式架構的方案,在poppen.de中使用的RabbitMQ是Erlang編寫的消息服務器,支持Java、C/C++、.Net 、PHP 等語言。

2.MySQL 的第三方引擎 XtraDB 受到越來越多人的認知,MyISAM依然有用武之地,只是老大難鎖表問題一直沒有很好的解決辦法。

3.Graphite是一款不錯的系統監控軟件,對與一個網站來說監控其運行狀態,觀測硬盤、CPU的使用率,Memcached的命中率,客戶的訪問動向、來源,是一件比較重要的事情, 採用Python語言寫的,個人感覺Python如果能得到更好的商業支持,將來的前景會比Java好。

4.CouchDB是Apache組織又一款經典產品,作爲非關鍵性的數據進行存儲是一個絕佳的方案,例如:系統中的日誌。

5.Memcached 和 數據庫之間會逐漸的多出一個產物,比如 MongoDB ,不會像現在這樣緩存和數據庫2者之間有這麼大的跨度

6.凡是接觸過 Erlang 的人,都會對其產生喜好,可見Erlang的勢頭。

7.MySQL 的 官方集羣方案仍然不會被人看好,但是 MySQL 的 MMM 和 MSS 依然是經典。

8.Ngixn的性能強大和配置簡單讓他成爲web服務器的新寵兒, 對一些圖片的訪問/讀寫還可以使用Ngixn的本地緩存 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章