德国SNS交友/视频网站Poppen.de的技术架构分享
Poppen.de是一個德國的 交友/ 聊天/ 視頻 的SNS網(wǎng)站, 部分內(nèi)容NSFW,網(wǎng)站采用了很多我們熟悉的技術(shù),像Nginx ,MySQL,CouchDB,Erlang,Memcached的,RabbitMQ(消息服務(wù)器),采用了Graphite作為網(wǎng)站的系統(tǒng)監(jiān)控,Red5作為視頻服務(wù),Tsung作為壓力測試工具,選擇的技術(shù)種類較多,還采用PHP和Erlang?2種程序語言作為不同功能的開發(fā)。
關(guān)于 Poppen.de 的資料統(tǒng)計(jì)數(shù)據(jù)
??? *? 2 000 000 用戶數(shù)
??? *? 20.000并發(fā)用戶數(shù)
??? *? 300.000條私人訊息/每天
??? *? 250.000登錄/每天
功能概要
??? * 用戶在線搜索其他用戶;
??? * 站內(nèi)對方寫私人消息;
??? * 用戶上傳圖片和視頻;
??? * 用戶與用戶之間的在線視頻聊天。
?Poppen.de整個網(wǎng)站的技術(shù)團(tuán)隊(duì)有 11個人開發(fā)人員,2個界面設(shè)計(jì)師和兩個系統(tǒng)管理員。
H.E的口水1:
Poppen.de 是德國的交友網(wǎng)站,與Facebook這樣巨頭網(wǎng)站相比算是一個小型網(wǎng)站了,但是通過Poppen.de網(wǎng)站這次對外的技術(shù)信息分享,可以看出網(wǎng)站有個不錯的技術(shù)架構(gòu),讓我們可以從中得到很多值得學(xué)習(xí)與借鑒的內(nèi)容。?
H.E的口水2:
NSFW這個英文縮寫常常出現(xiàn)在Blog中,表示某個站點(diǎn)含有露點(diǎn)或者極度暴力的內(nèi)容,如果你在上班的時候打開這個網(wǎng)站你的同事經(jīng)過你身邊的時候估計(jì)會讓你很尷尬,呵呵。所以在我朝廷的大局域網(wǎng)內(nèi)是無法打開這個站點(diǎn),如果一定要滿足自己的好奇心,你可以動動腦筋看看有什么辦法。
下面是最新的截圖,如圖所示:
系統(tǒng)架構(gòu)描述:
* Web 層服務(wù)器
采用Nginx作為Web App 服務(wù)器,2臺機(jī)器在前端作為www的請求,在高峰的時候每分鐘能夠處理150.000個用戶的請求,并且結(jié)合Memcached一起使用,用來緩存一些用戶的資料信息。
另外3臺Ngixn 服務(wù)器作為圖片服務(wù)器的請求 例如:img.bilder.poppen.de (image servers),每分鐘處理用戶80.000請求,用戶通過這3臺服務(wù)器進(jìn)行圖片的讀、寫操作,只使用每臺服務(wù)器的本地緩存,并不通過Memcached服務(wù)器,并且將用戶上傳的圖片信息存放在中央式的文件系統(tǒng)中,估計(jì)這樣目的是為了減輕主要儲存設(shè)備的負(fù)荷。網(wǎng)站已經(jīng)這樣使用了4年,一共5臺Ngixn服務(wù)器,每臺配置普通32位CPU、3GB RAM 內(nèi)存。
* 語言環(huán)境
使用 PHP的5.3 版本 為程序語言運(yùn)行環(huán)境,整個網(wǎng)站使用28臺機(jī)器作為PHP Ap 服務(wù)器,每臺機(jī)器配置6G內(nèi)存。每個機(jī)器運(yùn)行運(yùn)行100個worker processes, 將運(yùn)行環(huán)境的可選PHP緩存(Alternative PHP Cache, APC)打開, 據(jù)說網(wǎng)站透露這樣可以提高性能,能夠減少 30%的CPU和內(nèi)存使用率,使用了Symfony1.2版本作為PHP的Web開發(fā)框架,可以提高網(wǎng)站開發(fā)效率,可快速創(chuàng)建復(fù)雜的WEB程序。
* 緩存(Memcached)
網(wǎng)站使用memcached的節(jié)點(diǎn)據(jù)說有50個總大小超過45 GB,Memcached用來用戶會話、個人信息、功能執(zhí)行中需要的緩存、數(shù)據(jù)中需要執(zhí)行l(wèi)ike的查詢結(jié)果的存儲,網(wǎng)站對于將來可能會漸漸的采用 MongoDB Hash 的解決方法來進(jìn)行代替現(xiàn)在大量的使用Memcached的現(xiàn)象,Javabloger個人也認(rèn)為以為大量的使用Memcached緩存服務(wù)器不是明智之舉,因?yàn)镸emcached的原則就不是給你放什么重要信息和可以長期存放的地方,你見過有人拿超市的存包格當(dāng)私人的保險(xiǎn)柜嗎?但一味的使用數(shù)據(jù)庫存儲也不是可取的方法,大量數(shù)據(jù)庫連接/關(guān)閉 執(zhí)行SQL的開銷帶來的負(fù)載是很多機(jī)器設(shè)備不能接受的,所以使用像 MongoDB 之類的東西 還是比較折中的選擇,我們相信將來會有更多的網(wǎng)站會向MongoDB靠攏的。
* 消息服務(wù)器
整個網(wǎng)站采用的算是一種分布式的異步架構(gòu)體系,中間采用RabbitMQ作為異步通訊服務(wù)器,通過上層28臺PHP Ap Server做成的LVS集群對下層2臺集群的 RabbitMQ 消息系統(tǒng)進(jìn)行調(diào)用,這里消息系統(tǒng)主要用來發(fā)送運(yùn)行日志,電子郵件通知,系統(tǒng)消息,用戶圖片上傳,每天大約需要處理 500.000條消息,這樣的架構(gòu)體系可以對系統(tǒng)的運(yùn)行性能有所改善,在Javabloger看一般有3個原因:????
????第一是加強(qiáng)了系統(tǒng)的可擴(kuò)展性,
????第二是提高系統(tǒng)資源的使用率,
????第三是降低系統(tǒng)運(yùn)行中瞬間的瓶頸。
比如在系統(tǒng)繁忙的時間里,每分鐘有1000個用戶進(jìn)行登錄,這意味著我們將有1000個并發(fā)的用戶請求需要對緩存/數(shù)據(jù)庫表的更新,但是現(xiàn)在有了消息隊(duì)列的架構(gòu),我們可以運(yùn)行他們每個順序相反。如果我們需要更多的處理速度,我們可以添加更多的消費(fèi)者到消息隊(duì)列,還可以加入更多的機(jī)器到MQ消息群集中,不需要修改以前任何的配置或部署任何新的代碼。網(wǎng)站表示系統(tǒng)將來會向異步式架構(gòu)發(fā)展,將更多的業(yè)務(wù)放入RabbitMQ 系統(tǒng)隊(duì)列中進(jìn)行處理。
H.E的口水1:
? 在2010年4月份中旬,VMware旗下的SpringSource 將RabbitMQ給收購了,不過這次收購應(yīng)該是一件好事,因?yàn)镾pringSource計(jì)劃對RabbitMQ開發(fā)者社區(qū)提供全方位的支持,另外,SpringSource還針對此次收購發(fā)布了一個FAQ。詳見:http://www.springsource.com/rabbit-technologies-acquisition-faq
H.E.的口水2:
來自2位國內(nèi)/外網(wǎng)友的經(jīng)驗(yàn)分享 (Ref1) (Ref2) (Ref3)
1.RabbitMQ支持AMQP協(xié)議,而ZeroMQ的極為簡單。
2.RabbitMQ較慢,幾十個并發(fā)以內(nèi),延時為幾十毫秒,但當(dāng)客戶端達(dá)到1000個并發(fā)的時候,速度就無法容忍了(參考);ZeroMQ上則據(jù)稱可以達(dá)到13毫米延時和高達(dá)每秒4.1兆次傳遞(參考, 國內(nèi)需要翻墻才能訪問)。
3.如果隊(duì)列較多的話,RabbitMQ很容易把內(nèi)存耗盡,而ZeroMQ則把隊(duì)列內(nèi)容保存在發(fā)送端。
4.JMS僅僅是Java領(lǐng)域內(nèi)的API規(guī)范,只能說AMQP比JMS更先進(jìn),它有自己的wire-level protocol 可編程的協(xié)議,并且RabbitMQ服務(wù)器充分利用了Erlang的分布式、高可靠性、并發(fā)等特性,而并不能一概而論的說JMS沒有RabbitMQ服務(wù)器好與壞。
??
* 分布式文檔數(shù)據(jù)庫(CouchDB)
系統(tǒng)中運(yùn)行CouchDB的服務(wù)器只有一臺,主要是用來存日志的,因?yàn)樵谶^去我們需要查看某臺機(jī)器的日志需要登錄某臺機(jī)器進(jìn)行tail -f 的查看,如果機(jī)器一多肯定混亂,采用CouchDB 中一些查詢方法 query/group 就會讓工作簡化很多,而且采用分布式文檔數(shù)據(jù)庫存放系統(tǒng)日志似乎真的很合理,而且管理,使用也不算很復(fù)雜。Javabloger前端時間一個人看管了15臺機(jī)器,需要查看日志的時候還真的有點(diǎn)不方便,所以日后會在項(xiàng)目中嘗試一下將日志系統(tǒng)進(jìn)行集中化處理的方案。
* 數(shù)據(jù)庫服務(wù)器
采用MySQL數(shù)據(jù)庫作為網(wǎng)站主要的數(shù)據(jù)信息存儲,有4臺MySQL服務(wù)器使用基于集群方式NDB表引擎用來存放用戶資料和用戶相關(guān)數(shù)據(jù),這組集群每臺機(jī)器配置32GB內(nèi)存 、4個CPU,但是他們打算在將來采用 Sharing的方式根據(jù)用戶的id來進(jìn)行水平劃分,這樣當(dāng)然有好處,可是這樣做了以后需要面對事物和跨庫查詢的問題,網(wǎng)站還有另外3臺MySQL服務(wù)器使用的是 master-slave-slave 架構(gòu)存放用戶在論壇里面的信息,目前數(shù)據(jù)庫表引擎采用的是MyISAM,這樣讀寫會很快,但是會遇到全表鎖的問題,所以將來打算使用?XtraDB?引擎進(jìn)行存儲,網(wǎng)站對于查詢SQL和建立數(shù)據(jù)庫表結(jié)構(gòu)也進(jìn)行了多次考慮,為了避免like和join帶來的開銷,因此創(chuàng)建數(shù)據(jù)庫匯總表,以紓緩用戶查詢帶來壓力。
* 系統(tǒng)監(jiān)控(Graphite)
Graphite是這個網(wǎng)站一個重要的部分,用來進(jìn)行收集服務(wù)器所有的及時狀態(tài),用戶請求信息,Memcached命中率,RabbitMQ消息服務(wù)器的狀態(tài),Unix操作系統(tǒng)的負(fù)載狀態(tài),Graphite服務(wù)器大約每分鐘需要有4800次更新操作,Graphite采用簡單的文本協(xié)議和繪圖功能可以方便地使用在任何操作系統(tǒng)上。Graphite 是一個Python寫的web應(yīng)用,采用django框架,如果你想嘗試一下的話,具體的安裝步驟參見:http://graphite.wikidot.com/installation
安裝好以后的效果如圖所示:
對于具體的PHP程序性能運(yùn)行的監(jiān)控是采用Facebook開源出來的一個php性能測試工具,XHProf是一個分層PHP性能分析工具。它報(bào)告函數(shù)級別的請求次數(shù)和各種指標(biāo),包括阻塞時間,CPU時間和內(nèi)存使用情況。一個函數(shù)的開銷,可細(xì)分成調(diào)用者和被調(diào)用者的開銷。原始數(shù)據(jù)收集部分是用純C實(shí)現(xiàn)的,是一個名叫xhprof的 Zend擴(kuò)展 。XHProf有一個簡單的HTML的用戶界面( PHP寫成的)。基于瀏覽器的性能分析用戶界面能更容易查看,或是與同行們分享成果。也能繪制調(diào)用關(guān)系圖。如果他們通過 Graphite發(fā)現(xiàn)那臺Unix負(fù)荷高了,將會進(jìn)一步的使用 XHProf 分析器進(jìn)行測試。并且有一個單獨(dú)的服務(wù)器發(fā)送 XHProf測試的概況,并從那里進(jìn)行分析,找到性能問題的所在。
* 視頻服務(wù)器 (Red5)
網(wǎng)站還為用戶提供視頻服務(wù),一種是用戶上傳的一段視頻,還可以彼此進(jìn)行分享與評價(jià),此外,網(wǎng)站還有一個在線的視頻聊天,在2009年中期每月視頻說產(chǎn)生的網(wǎng)絡(luò)流量達(dá)到17TB。網(wǎng)站將會尋找更換Red5 視頻服務(wù)的方案,可能會選擇Oneteam媒體服務(wù)器。
* 壓力測試 (Tsung)
Tsung是采用Erlang編寫一個分布式測試工具。在Tsung控制機(jī)器上寫tsung.xml,在這個文件中指定所有的client機(jī)器地址、每臺機(jī)器的權(quán)重、模擬的用戶數(shù)量 配置完成就可以進(jìn)行測試了,網(wǎng)站用它做HTTP的 benchmarks? 測試,測試 MySQL存儲引擎的處理能力,例如是否需要使用新的MySQL引擎 XtraDB,并且還需要知道XtraDB的處理能力是多大,都是通過Tsung得出的結(jié)果,因?yàn)門sung可以輸出不同的格式的報(bào)告和圖表信息,如圖所示:
查看大圖請點(diǎn)擊這里,如果你有興趣的話,可以查看Tsung詳細(xì)的用戶手冊:http://tsung.erlang-projects.org/user_manual.html
通過Poppen.de這次的對外技術(shù)分享,整個網(wǎng)站在我腦海中的架構(gòu)如圖所示,這只是我的猜想,與實(shí)際的架構(gòu)有出入,請多多見諒:
查看大圖請點(diǎn)擊這里
總結(jié):
1.越來越多的網(wǎng)站由于業(yè)務(wù)的壯大,在尋求通過消息傳遞的,異步式架構(gòu)的方案,在poppen.de中使用的RabbitMQ是Erlang編寫的消息服務(wù)器,支持Java、C/C++、.Net 、PHP 等語言。
2.MySQL 的第三方引擎 XtraDB 受到越來越多人的認(rèn)知,MyISAM依然有用武之地,只是老大難鎖表問題一直沒有很好的解決辦法。
3.Graphite是一款不錯的系統(tǒng)監(jiān)控軟件,對與一個網(wǎng)站來說監(jiān)控其運(yùn)行狀態(tài),觀測硬盤、CPU的使用率,Memcached的命中率,客戶的訪問動向、來源,是一件比較重要的事情, 采用Python語言寫的,個人感覺Python如果能得到更好的商業(yè)支持,將來的前景會比Java好。
4.CouchDB是Apache組織又一款經(jīng)典產(chǎn)品,作為非關(guān)鍵性的數(shù)據(jù)進(jìn)行存儲是一個絕佳的方案,例如:系統(tǒng)中的日志。
5.Memcached 和 數(shù)據(jù)庫之間會逐漸的多出一個產(chǎn)物,比如?MongoDB ,不會像現(xiàn)在這樣緩存和數(shù)據(jù)庫2者之間有這么大的跨度。
6.凡是接觸過 Erlang 的人,都會對其產(chǎn)生喜好,可見Erlang的勢頭。
7.MySQL 的 官方集群方案仍然不會被人看好,但是 MySQL 的 MMM 和 MSS 依然是經(jīng)典。
8.Ngixn的性能強(qiáng)大和配置簡單讓他成為web服務(wù)器的新寵兒, 對一些圖片的訪問/讀寫還可以使用Ngixn的本地緩存 。
??
–end–
總結(jié)
以上是生活随笔為你收集整理的德国SNS交友/视频网站Poppen.de的技术架构分享的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Javascript到PHP加密通讯的简
- 下一篇: 花生焖猪蹄怎么做好吃,花生焖猪蹄的家常做
