百萬(wàn)級(jí)PHP網(wǎng)站架構(gòu)工具箱
在了解過(guò)世界最大的PHP站點(diǎn),F(xiàn)acebook的后臺(tái)技術(shù)后,今天我們來(lái)了解一個(gè)百萬(wàn)級(jí)PHP站點(diǎn)的網(wǎng)站架構(gòu):Poppen.de。Poppen.de是德國(guó)的一個(gè)社交網(wǎng)站,相對(duì)Facebook、Flickr來(lái)說(shuō)是一個(gè)很小的網(wǎng)站,但它有一個(gè)很好的架構(gòu),融合了很多技術(shù),如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。
51CTO推薦閱讀:大型B2C網(wǎng)站高性能可伸縮架構(gòu)技術(shù)探秘
Poppen.de目前有200萬(wàn)注冊(cè)用戶數(shù)、2萬(wàn)并發(fā)用戶數(shù)、每天20萬(wàn)條私有消息、每天25萬(wàn)登錄次數(shù)。而項(xiàng)目團(tuán)隊(duì)有11個(gè)開(kāi)發(fā)人員,兩個(gè)設(shè)計(jì),兩個(gè)系統(tǒng)管理員。該站點(diǎn)的商業(yè)模式采用免費(fèi)增值模式,用戶可以使用搜索用戶、給好友發(fā)送消息、上載圖片和視頻等功能。
如果用戶想享受不受限制發(fā)送消息和上載圖片,那么就得根據(jù)需要支付不同類(lèi)型的會(huì)員服務(wù),視頻聊天及網(wǎng)站其他服務(wù)也采用同樣的策略。
Nginx
Poppen.de 所有的服務(wù)都是基于Nginx服務(wù)上的。前端有兩臺(tái)Nginx服務(wù)器在高峰期提供每分鐘15萬(wàn)次請(qǐng)求的負(fù)載,每個(gè)機(jī)器已經(jīng)有四年壽命,并且只有一個(gè)CPU 和3GB RAM。Poppen.de擁有三臺(tái)獨(dú)立的圖像服務(wù)器,由三臺(tái)Nginx服務(wù)器為*.bilder.poppen.de提供每分鐘8萬(wàn)次請(qǐng)求服務(wù)。
Nginx 架構(gòu)中一個(gè)很酷的設(shè)計(jì)就是有很多請(qǐng)求是由Memcached處理的,因此請(qǐng)求從緩存中獲取內(nèi)容而不需要直接訪問(wèn)PHP機(jī)器。比如,用戶信息頁(yè)(user profile)是網(wǎng)站需要密集處理的內(nèi)容,如果把用戶信息頁(yè)全部緩存到Memcached上,那么請(qǐng)求直接從Memcached上獲取內(nèi)容。 Poppen.de的Memcached每分鐘可以處理8000次請(qǐng)求。
架構(gòu)中有三個(gè)Nginx圖像服務(wù)器提供本地圖像緩存,用戶上載圖 像到一個(gè)中央文件服務(wù)器。當(dāng)向這三個(gè)Nginx之一中請(qǐng)求圖像時(shí),如果服務(wù)器本地中沒(méi)有存在該圖像,則從中央文件服務(wù)器下載到該服務(wù)器上作緩存并提供服 務(wù)。這種負(fù)載均衡的分布式圖像服務(wù)器架構(gòu)設(shè)計(jì)可以減輕主要存儲(chǔ)設(shè)備的負(fù)載。
PHP-FPM
該網(wǎng)站運(yùn)行在PHP- FPM上。共有28臺(tái)雙CPU、6GB內(nèi)存的PHP機(jī)器,每個(gè)機(jī)器上運(yùn)行100個(gè)PHP-FPM的工作線程。使用啟用了APC的PHP5.3.x。 PHP5.3可以降低CPU和內(nèi)存使用率的30%以上。
51CTO推薦閱讀:Nginx + PHP-FPM + APC=絕妙的組合
程序代碼是基于Symfony1.2框架之上開(kāi)發(fā)的。一是可以使用外部資源,二是 能夠提高項(xiàng)目開(kāi)發(fā)進(jìn)度,同時(shí)在一個(gè)著名的框架上可以讓新開(kāi)發(fā)人員更容易加入到團(tuán)隊(duì)中來(lái)。雖然沒(méi)有任何事情都是十全十美的,但可以從Symfony框架中得 到很多好處,讓團(tuán)隊(duì)可以更多的精力放在Poppen.de的業(yè)務(wù)開(kāi)發(fā)上去。
網(wǎng)站性能優(yōu)化使用XHProf,這是Facebook開(kāi)源出來(lái)的一個(gè)類(lèi)庫(kù)。這個(gè)框架非常容易個(gè)性化和配置,能夠可以緩存大部分高代價(jià)的服務(wù)器計(jì)算。
MySQL
MySQL是網(wǎng)站主要的RDBMS。網(wǎng)站又幾個(gè)MySql服務(wù)器:一臺(tái)4CPU、32GB的服務(wù)器存儲(chǔ)用戶相關(guān)信息,如基本信息、照片描述信息等。這臺(tái)機(jī)器已經(jīng)使用了4 年,下一步計(jì)劃會(huì)使用共享集群來(lái)替換它。目前仍基于這個(gè)系統(tǒng)上進(jìn)行設(shè)計(jì),以簡(jiǎn)化數(shù)據(jù)訪問(wèn)代碼。根據(jù)用戶ID進(jìn)行數(shù)據(jù)分區(qū),因?yàn)榫W(wǎng)站中大部分信息都是以用戶 為中心的,如照片、視頻、消息等。
推薦專(zhuān)題:MySQL數(shù)據(jù)庫(kù)入門(mén)與精通教程
有三臺(tái)服務(wù)器按主-從-從配置架構(gòu)提供用戶論壇服務(wù)。一臺(tái)從服務(wù)器負(fù)責(zé)網(wǎng)站自定義消息存儲(chǔ),到現(xiàn)在有 2.5億條消息。另外四臺(tái)機(jī)器為主-從配置關(guān)系。另外由4臺(tái)機(jī)器配置成NDB族群專(zhuān)門(mén)服務(wù)于密集型寫(xiě)操作數(shù)據(jù),如用戶訪問(wèn)統(tǒng)計(jì)信息。
數(shù)據(jù)表設(shè)計(jì)盡量避免關(guān)聯(lián)操作,盡可能緩存最多的數(shù)據(jù)。當(dāng)然,數(shù)據(jù)庫(kù)的結(jié)構(gòu)化規(guī)范已經(jīng)完全被破壞掉了。因此,為了更容易搜索,數(shù)據(jù)庫(kù)設(shè)計(jì)創(chuàng)建了數(shù)據(jù)挖掘表。大部分表是MyISAM型表,可以提供快速查找。現(xiàn)在的問(wèn)題是越來(lái)越多的表已經(jīng)全表鎖住了。Poppen.de正考慮往XtraDB存儲(chǔ)引擎上遷移。
#p#
Memcached
網(wǎng)站架構(gòu)中Memcached應(yīng)用相當(dāng)多,超過(guò)45GB的高速緩存和51個(gè)節(jié)點(diǎn)。緩存了Session會(huì)話、視圖緩存以及函數(shù)執(zhí)行緩存等。架構(gòu)中有一個(gè)系統(tǒng) 當(dāng)記錄被修改時(shí)可以自動(dòng)地把數(shù)據(jù)更新到緩存中去。未來(lái)改善緩存更新的可能方案是使用新的Redis Hash API或者M(jìn)ongoDB。
RabbitMQ
在 2009年中開(kāi)始在架構(gòu)中使用RabbitMQ。這是一個(gè)很好的消息解決方案,便于部署和集中到這個(gè)架構(gòu)中去,在LVS后運(yùn)行了兩臺(tái)RabbitMQ服務(wù) 器。在上個(gè)月,已經(jīng)把更多的東西集成到該隊(duì)列中,意味著同一時(shí)刻有28臺(tái)PHP服務(wù)器每天要處理50萬(wàn)次請(qǐng)求。發(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ù),這樣用戶就沒(méi)有必要等到PHP腳本清理。
這個(gè)系統(tǒng)可以改善架構(gòu)資源管理。例如,在高峰期服務(wù)每分鐘可以處理1000次登錄請(qǐng)求。這表示有1000并發(fā)更新用戶表保存用戶的登錄時(shí)間。由于使用了隊(duì)列機(jī)制,可以 按相反的順序來(lái)運(yùn)行這些查詢(xún)。如果需要提高處理速度,只需要增加更多的隊(duì)列處理者即可,甚至可以增加更多的服務(wù)器到這集群中去,而不需要修改任何配置和部 署新節(jié)點(diǎn)。
CouchDB
日志存儲(chǔ)CouchDB運(yùn)行在一臺(tái)機(jī)器上。在這臺(tái)機(jī)器上可以根據(jù)模塊/行為進(jìn)行日志查詢(xún) /分組,或者根據(jù)錯(cuò)誤類(lèi)型等等。這對(duì)定位問(wèn)題非常有用。在使用日志聚合服務(wù)CouchDB之前,不得不逐臺(tái)登錄到PHP服務(wù)器上設(shè)法日志分析定位問(wèn)題,這 是非常麻煩的。而現(xiàn)在把所有的日志集中到隊(duì)列中保存到CouchDB中,可以集中進(jìn)行問(wèn)題檢查和分析。
Graphite
網(wǎng)站使用Graphite采集網(wǎng)站實(shí)時(shí)信息并統(tǒng)計(jì)。從請(qǐng)求每個(gè)模塊/行為到Memcached的命中和未命中、RabbitMQ狀態(tài)監(jiān)控以及Unix負(fù)載等等。Graphite服務(wù)平均每分鐘有4800次更新操作。實(shí)踐已經(jīng)證實(shí)要監(jiān)測(cè)網(wǎng)站發(fā)發(fā)生什么是非常有用的,它的簡(jiǎn)單文本協(xié)議和繪圖功能可以方便地即插即 用的方式用于任何需要監(jiān)控的系統(tǒng)上。
一件很酷的事情是使用Graphite同時(shí)監(jiān)控了網(wǎng)站的兩個(gè)版本。一月份部署了Symfony框架新 版本,以前代碼作為一個(gè)備份部署。這就意味著網(wǎng)站可能會(huì)面臨性能問(wèn)題。因此可以使用Graphite來(lái)對(duì)兩個(gè)版本在線進(jìn)行對(duì)比。
發(fā)現(xiàn)新版本上的Unix負(fù)載表較高,于是使用XHProf對(duì)兩個(gè)版本進(jìn)行性能分析,找出問(wèn)題所在。
Red5
網(wǎng)站為用戶也提供了兩種類(lèi)型的視頻服務(wù),一種是用戶自己上載的視頻,另外一種是視頻聊天,用戶視頻互動(dòng)和分享。到2009年年中,每月為用戶提供17TB的流量服務(wù)。
Tsung
Tsung 是一個(gè)Erlang編寫(xiě)的分布式基準(zhǔn)分析工具。在Poppen.de網(wǎng)站中主要用于HTTP基準(zhǔn)分析、MySQL與其他存儲(chǔ)系統(tǒng)(XtraDB)的對(duì)比分 析。用一個(gè)系統(tǒng)記錄了主要的MySQL服務(wù)器的流量,再轉(zhuǎn)換成Tsung的基準(zhǔn)會(huì)話。然后對(duì)該流量進(jìn)行回放,由Tsung產(chǎn)生數(shù)以千計(jì)的并發(fā)用戶訪問(wèn)實(shí)驗(yàn) 室的服務(wù)器。這樣就可以在實(shí)驗(yàn)環(huán)境中與真實(shí)場(chǎng)景非常接近。
【編輯推薦】





















