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