分享Poppen.de架構(gòu)經(jīng)驗(yàn)
Posted in architecture on 四月 24th, 2010 by kafka0102
Poppen.de是德國的一家婚姻中介網(wǎng)站,對于該網(wǎng)站的統(tǒng)計數(shù)字有:1)2.000.000的用戶數(shù),2)20.000的并發(fā)用戶數(shù),3)每天產(chǎn)生300.000的私信,4)250.000的日登錄用戶數(shù)。這樣的網(wǎng)站也就是個中型規(guī)模的網(wǎng)站,下面看看這個網(wǎng)站在技術(shù)應(yīng)用及經(jīng)驗(yàn)方面帶來的東西。
原文鏈接:http://highscalability.com/blog/2010/4/12/poppende-architecture.html
Nginx
Poppen.de使用nginx作為webserver,包括靜態(tài)請求和動態(tài)請求。特別的,Poppen.de通過nginx來直接從memcache中獲取緩存的動態(tài)頁面內(nèi)容而不需要經(jīng)過PHP,一個例子就是請求用戶信息頁。對于緩存整個動態(tài)請求頁面內(nèi)容,這是一種方法,更常見的是使用squid、varnish來做。在請求用戶上傳圖片的處理方面,Poppen.de是將圖片上傳到統(tǒng)一的文件服務(wù)器,而前端的nginx在請求時會做本機(jī)的cache處理(不知道它的請求是如何落到nginx上的,如果是隨機(jī)的,多臺nginx本機(jī)cache的數(shù)據(jù)就重復(fù)了,有些浪費(fèi),但也最簡單),對于圖片量不大的情況倒是簡單的處理方法。
PHP-FPM
Poppen.de使用了PHP5.3.x、APC和PHP-FPM,PHP-FPM是啟用了100個進(jìn)程,也是個標(biāo)配。使用APC使得PHP能減少30%的CPU和內(nèi)存消耗。Poppen.de竟然使用了symfony作為開發(fā)框架,出發(fā)點(diǎn)自然是希望快速開發(fā),但從我的使用經(jīng)驗(yàn)來說,symfony還是太重的一個框架,無論是使用上還是性能上都不是最優(yōu)的PHP框架。當(dāng)然,它也提到,框架是有性能損失的,但還可以接受。就PHP框架來說,盡管開源的框架一筐一筐,但沒一個真正流行的,而重復(fù)的輪子卻不停的出現(xiàn),此種現(xiàn)象很耐人尋味。Poppen.de還使用了Facebook出品的XHProf來分析PHP程序的性能問題。
Mysql
Poppen.de的數(shù)據(jù)存在Mysql中,主要就是主從模式。由于現(xiàn)在的數(shù)據(jù)量并不大,并沒有做數(shù)據(jù)分區(qū)處理,當(dāng)數(shù)據(jù)量上來時,像垂直和水平分區(qū)自然是擴(kuò)展性能的簡單方式。稍顯意外的是,Poppen.de使用由4臺機(jī)器構(gòu)成的NDBcluster來存儲寫頻繁的數(shù)據(jù),比如某個用戶頁都被誰訪問過這樣的統(tǒng)計信息。如果NDBcluster能被一些大型應(yīng)用證明其穩(wěn)定性,對于解決寫頻繁的應(yīng)用(比如Socialgame?)來說是個不錯的選擇。Poppen.de的表大多是MyISAM,自然不是很好的選擇,不過他們竟然有計劃轉(zhuǎn)向XtraDB(自然是經(jīng)過測試比較后的結(jié)果),真是夠有個性的。盡管XtraDB很優(yōu)秀,但官方的innodb顯然會更成熟,并且新版也在吸收如XtraDB等存儲引擎的優(yōu)點(diǎn),選擇一個不明前途的第三方引擎還是有些風(fēng)險的。
Memcached
cache為王,Poppen.de有45GB、51個結(jié)點(diǎn)的cache數(shù)據(jù)。并且還做了一個系統(tǒng),當(dāng)一個表數(shù)據(jù)變化時,自動作廢cache數(shù)據(jù),好處自然是減少了應(yīng)用處理。當(dāng)然,也可以做一個穿透的數(shù)據(jù)訪問中間件來做cache填充與失效的事情(就像DAL)。Poppen.de似乎也在考慮使用Redis或MongoDB等來將cache操作和數(shù)據(jù)操作自然的綁在一起。
RabbitMQ
Poppen.de使用了RabbitMQ來做一些異步j(luò)ob處理。特別有趣的是,它使用了PHP-FPM的一個專有特性,即fastcgi_finish_request()函數(shù),能夠在請求結(jié)束前,在把結(jié)果返回到客戶端后,異步的做諸如連接關(guān)閉、發(fā)送消息的處理。在消費(fèi)消息方面,Poppen.de使用了最簡單的山寨方法,就是同時運(yùn)行多個PHP腳本,每個腳本在消費(fèi)250個job后退出,然后由監(jiān)控腳本再新起一個消費(fèi)腳本。當(dāng)處理不過來時,或者多加腳本或者多加機(jī)器來解決。
其他
Poppen.de使用CouchDB來存儲log而是代替人工直接分析日志文件,這個對于單機(jī)的日志分析或許會更快更方便些,并且他們有計劃將日志可視化,但他們想必現(xiàn)在還沒打算做分布式的日志存儲與分析的工作。Poppen.de使用了叫做Red5的東西來存儲視頻(我是不了解了)。Poppen.de還使用Graphite來做數(shù)據(jù)監(jiān)控,包括如Memcached的命中率、RabbitMQ狀態(tài)監(jiān)控、各機(jī)器的負(fù)載監(jiān)控等。當(dāng)一個網(wǎng)站有一定規(guī)模后,這種監(jiān)控是必不可少的,而通常也是拿現(xiàn)成的工具使用,在必要時做些功能上的擴(kuò)展。Poppen.de還使用Tsung來做基準(zhǔn)測試,比如HTTP請求及各Mysql存儲引擎方面的測試。
經(jīng)驗(yàn)
1、背靠大樹好乘涼,選擇技術(shù)和工具時要挑成熟、活躍的社區(qū),這樣有問題也有途徑及時解決。
2、了解你所使用的技術(shù)的優(yōu)缺點(diǎn),發(fā)揮它的優(yōu)點(diǎn),避開它的缺點(diǎn)。
3、擴(kuò)展工具,讓工具更好的滿足你。
4、敢于嘗試??梢钥吹剑绞谴蠊?,在技術(shù)選型時越是縮手縮腳,生怕外面的東西不成熟有問題,總相信自己能造成更好的自己能掌控的輪子。而看看Poppen.de上面提到的東西,有多少是你不知道沒用過的?再感慨一下,每天都有大量的開源項(xiàng)目出現(xiàn),一些因?yàn)楸蝗岁P(guān)注而眾人拾柴,東西就存活下去,一些盡管東西很好但因?yàn)闊o人問津,也就悄無聲息的死去。
5、度量一切,對網(wǎng)站的各個模塊、系統(tǒng)、流量等數(shù)字有清晰的認(rèn)識。
6、經(jīng)驗(yàn)積累、全面把握。不要等到上線時發(fā)現(xiàn)新模塊的功能不是需要的,不要等到上線時發(fā)現(xiàn)模塊性能不滿足需求。
總結(jié)
Poppen.de還做了些展望,比如將更多的使用erlang產(chǎn)品,這要是個國內(nèi)的公司,估計很多人會膜拜的。而總結(jié)來說,Poppen.de分享的東西真是很實(shí)在很實(shí)用,是個很開放也很技術(shù)流的公司,對中小規(guī)模的網(wǎng)站來說是可充分借鑒的。
=============================== 華麗的終止符 ================================