在了解過世界最大的PHP站點(diǎn),F(xiàn)acebook的后臺技術(shù)后,今天我們來了解一個(gè)百萬級PHP站點(diǎn)的網(wǎng)站架構(gòu):Poppen.de。Poppen.de是德國的一個(gè)社交網(wǎng)站,相對Facebook、Flickr來說是一個(gè)很小的網(wǎng)站,但它有一個(gè)很好的架構(gòu),融合了很多技術(shù),如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。

  Poppen.de目前有200萬注冊用戶數(shù)、2萬并發(fā)用戶數(shù)、每天20萬條私有消息、每天25萬登錄次數(shù)。而項(xiàng)目團(tuán)隊(duì)有11個(gè)開發(fā)人員,兩個(gè)設(shè)計(jì),兩個(gè)系統(tǒng)管理員。該站點(diǎn)的商業(yè)模式采用免費(fèi)增值模式,用戶可以使用搜索用戶、給好友發(fā)送消息、上載圖片和視頻等功能。

  如果用戶想享受不受限制發(fā)送消息和上載圖片,那么就得根據(jù)需要支付不同類型的會員服務(wù),視頻聊天及網(wǎng)站其他服務(wù)也采用同樣的策略。

  Nginx

  Poppen.de 所有的服務(wù)都是基于Nginx服務(wù)上的。前端有兩臺Nginx服務(wù)器在高峰期提供每分鐘15萬次請求的負(fù)載,每個(gè)機(jī)器已經(jīng)有四年壽命,并且只有一個(gè)CPU 和3GB RAM。Poppen.de擁有三臺獨(dú)立的圖像服務(wù)器,由三臺Nginx服務(wù)器為*.bilder.poppen.de提供每分鐘8萬次請求服務(wù)。

  Nginx 架構(gòu)中一個(gè)很酷的設(shè)計(jì)就是有很多請求是由Memcached處理的,因此請求從緩存中獲取內(nèi)容而不需要直接訪問PHP機(jī)器。比如,用戶信息頁(user profile)是網(wǎng)站需要密集處理的內(nèi)容,如果把用戶信息頁全部緩存到Memcached上,那么請求直接從Memcached上獲取內(nèi)容。 Poppen.de的Memcached每分鐘可以處理8000次請求。

  架構(gòu)中有三個(gè)Nginx圖像服務(wù)器提供本地圖像緩存,用戶上載圖 像到一個(gè)中央文件服務(wù)器。當(dāng)向這三個(gè)Nginx之一中請求圖像時(shí),如果服務(wù)器本地中沒有存在該圖像,則從中央文件服務(wù)器下載到該服務(wù)器上作緩存并提供服 務(wù)。這種負(fù)載均衡的分布式圖像服務(wù)器架構(gòu)設(shè)計(jì)可以減輕主要存儲設(shè)備的負(fù)載。

  PHP-FPM

  該網(wǎng)站運(yùn)行在PHP- FPM上。共有28臺雙CPU、6GB內(nèi)存的PHP機(jī)器,每個(gè)機(jī)器上運(yùn)行100個(gè)PHP-FPM的工作線程。使用啟用了APC的PHP5.3.x。 PHP5.3可以降低CPU和內(nèi)存使用率的30%以上。

  程序代碼是基于Symfony1.2框架之上開發(fā)的。一是可以使用外部資源,二是 能夠提高項(xiàng)目開發(fā)進(jìn)度,同時(shí)在一個(gè)著名的框架上可以讓新開發(fā)人員更容易加入到團(tuán)隊(duì)中來。雖然沒有任何事情都是十全十美的,但可以從Symfony框架中得 到很多好處,讓團(tuán)隊(duì)可以更多的精力放在Poppen.de的業(yè)務(wù)開發(fā)上去。

  網(wǎng)站性能優(yōu)化使用XHProf,這是Facebook開源出來的一個(gè)類庫。這個(gè)框架非常容易個(gè)性化和配置,能夠可以緩存大部分高代價(jià)的服務(wù)器計(jì)算。

  MySQL

  MySQL是網(wǎng)站主要的RDBMS。網(wǎng)站又幾個(gè)MySql服務(wù)器:一臺4CPU、32GB的服務(wù)器存儲用戶相關(guān)信息,如基本信息、照片描述信息等。這臺機(jī)器已經(jīng)使用了4 年,下一步計(jì)劃會使用共享集群來替換它。目前仍基于這個(gè)系統(tǒng)上進(jìn)行設(shè)計(jì),以簡化數(shù)據(jù)訪問代碼。根據(jù)用戶ID進(jìn)行數(shù)據(jù)分區(qū),因?yàn)榫W(wǎng)站中大部分信息都是以用戶 為中心的,如照片、視頻、消息等。

  有三臺服務(wù)器按主-從-從配置架構(gòu)提供用戶論壇服務(wù)。一臺從服務(wù)器負(fù)責(zé)網(wǎng)站自定義消息存儲,到現(xiàn)在有 2.5億條消息。另外四臺機(jī)器為主-從配置關(guān)系。另外由4臺機(jī)器配置成NDB族群專門服務(wù)于密集型寫操作數(shù)據(jù),如用戶訪問統(tǒng)計(jì)信息。

  數(shù)據(jù)表設(shè)計(jì)盡量避免關(guān)聯(lián)操作,盡可能緩存最多的數(shù)據(jù)。當(dāng)然,數(shù)據(jù)庫的結(jié)構(gòu)化規(guī)范已經(jīng)完全被破壞掉了。因此,為了更容易搜索,數(shù)據(jù)庫設(shè)計(jì)創(chuàng)建了數(shù)據(jù)挖掘表。大部分表是MyISAM型表,可以提供快速查找?,F(xiàn)在的問題是越來越多的表已經(jīng)全表鎖住了。Poppen.de正考慮往XtraDB存儲引擎上遷移。

  Memcached

  網(wǎng)站架構(gòu)中Memcached應(yīng)用相當(dāng)多,超過45GB的高速緩存和51個(gè)節(jié)點(diǎn)。緩存了Session會話、視圖緩存以及函數(shù)執(zhí)行緩存等。架構(gòu)中有一個(gè)系統(tǒng) 當(dāng)記錄被修改時(shí)可以自動地把數(shù)據(jù)更新到緩存中去。未來改善緩存更新的可能方案是使用新的Redis Hash API或者M(jìn)ongoDB。

  RabbitMQ

  在 2009年中開始在架構(gòu)中使用RabbitMQ。這是一個(gè)很好的消息解決方案,便于部署和集中到這個(gè)架構(gòu)中去,在LVS后運(yùn)行了兩臺RabbitMQ服務(wù) 器。在上個(gè)月,已經(jīng)把更多的東西集成到該隊(duì)列中,意味著同一時(shí)刻有28臺PHP服務(wù)器每天要處理50萬次請求。發(fā)送日志、郵件通知、系統(tǒng)消息、圖像上載等 更多的東西到這個(gè)隊(duì)列中。

  應(yīng)用PHP-FPM中的fastcgi_finish_request()函數(shù)集成隊(duì)列消息,可以把消息異步發(fā) 送到隊(duì)列中。當(dāng)系統(tǒng)需要給用戶發(fā)送HTML或JSON格式響應(yīng)時(shí),就調(diào)用這個(gè)函數(shù),這樣用戶就沒有必要等到PHP腳本清理。

  這個(gè)系統(tǒng)可以改善架構(gòu)資源管理。例如,在高峰期服務(wù)每分鐘可以處理1000次登錄請求。這表示有1000并發(fā)更新用戶表保存用戶的登錄時(shí)間。由于使用了隊(duì)列機(jī)制,可以 按相反的順序來運(yùn)行這些查詢。如果需要提高處理速度,只需要增加更多的隊(duì)列處理者即可,甚至可以增加更多的服務(wù)器到這集群中去,而不需要修改任何配置和部 署新節(jié)點(diǎn)。

  CouchDB

  日志存儲CouchDB運(yùn)行在一臺機(jī)器上。在這臺機(jī)器上可以根據(jù)模塊/行為進(jìn)行日志查詢 /分組,或者根據(jù)錯(cuò)誤類型等等。這對定位問題非常有用。在使用日志聚合服務(wù)CouchDB之前,不得不逐臺登錄到PHP服務(wù)器上設(shè)法日志分析定位問題,這 是非常麻煩的。而現(xiàn)在把所有的日志集中到隊(duì)列中保存到CouchDB中,可以集中進(jìn)行問題檢查和分析。

  Graphite

  網(wǎng)站使用Graphite采集網(wǎng)站實(shí)時(shí)信息并統(tǒng)計(jì)。從請求每個(gè)模塊/行為到Memcached的命中和未命中、RabbitMQ狀態(tài)監(jiān)控以及Unix負(fù)載等等。Graphite服務(wù)平均每分鐘有4800次更新操作。實(shí)踐已經(jīng)證實(shí)要監(jiān)測網(wǎng)站發(fā)發(fā)生什么是非常有用的,它的簡單文本協(xié)議和繪圖功能可以方便地即插即 用的方式用于任何需要監(jiān)控的系統(tǒng)上。

  一件很酷的事情是使用Graphite同時(shí)監(jiān)控了網(wǎng)站的兩個(gè)版本。一月份部署了Symfony框架新 版本,以前代碼作為一個(gè)備份部署。這就意味著網(wǎng)站可能會面臨性能問題。因此可以使用Graphite來對兩個(gè)版本在線進(jìn)行對比。

  發(fā)現(xiàn)新版本上的Unix負(fù)載表較高,于是使用XHProf對兩個(gè)版本進(jìn)行性能分析,找出問題所在。

  Red5

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

  Tsung

  Tsung 是一個(gè)Erlang編寫的分布式基準(zhǔn)分析工具。在Poppen.de網(wǎng)站中主要用于HTTP基準(zhǔn)分析、MySQL與其他存儲系統(tǒng)(XtraDB)的對比分 析。用一個(gè)系統(tǒng)記錄了主要的MySQL服務(wù)器的流量,再轉(zhuǎn)換成Tsung的基準(zhǔn)會話。然后對該流量進(jìn)行回放,由Tsung產(chǎn)生數(shù)以千計(jì)的并發(fā)用戶訪問實(shí)驗(yàn) 室的服務(wù)器。這樣就可以在實(shí)驗(yàn)環(huán)境中與真實(shí)場景非常接近。