從LiveJournal后臺發(fā)展看大規(guī)模網(wǎng)站性能優(yōu)化方法于敦德 2006-3-16 一、LiveJournal發(fā)展歷程LiveJournal是99年始于校園中的項目,幾個人出于愛好做了這樣一個應用,以實現(xiàn)以下功能:
在上線后,LiveJournal實現(xiàn)了非??焖俚脑鲩L:
二、LiveJournal架構(gòu)現(xiàn)狀概況
三、從LiveJournal發(fā)展中學習
LiveJournal從1臺服務器發(fā)展到100臺服務器,這其中經(jīng)歷了無數(shù)的傷痛,但同時也摸索出了解決這些問題的方法,通過對LiveJournal的學習,可以讓我們避免LJ曾經(jīng)犯過的錯誤,并且從一開始就對系統(tǒng)進行良好的設計,以避免后期的痛苦。 下面我們一步一步看LJ發(fā)展的腳步。 1、一臺服務器一臺別人捐助的服務器,LJ最初就跑在上面,就像Google開始時候用的破服務器一樣,值得我們尊敬。這個階段,LJ的人以驚人的速度熟悉的Unix的操作管理,服務器性能出現(xiàn)過問題,不過還好,可以通過一些小修小改應付過去。在這個階段里LJ把CGI升級到了FastCGI。 最終問題出現(xiàn)了,網(wǎng)站越來越慢,已經(jīng)無法通過優(yōu)過化來解決的地步,需要更多的服務器,這時LJ開始提供付費服務,可能是想通過這些錢來購買新的服務器,以解決當時的困境。 2、兩臺服務器用付費服務賺來的錢LJ買了兩臺服務器:一臺叫做Kenny的Dell 6U機器用于提供Web服務,一臺叫做Cartman的Dell 6U服務器用于提供數(shù)據(jù)庫服務。 LJ有了更大的磁盤,更多的計算資源。但同時網(wǎng)絡結(jié)構(gòu)還是非常簡單,每臺機器兩塊網(wǎng)卡,Cartman通過內(nèi)網(wǎng)為Kenny提供MySQL數(shù)據(jù)庫服務。
3、四臺服務器又買了兩臺,Kyle和Stan,這次都是1U的,都用于提供Web服務。目前LJ一共有3臺Web服務器和一臺數(shù)據(jù)庫服務器。這時需要在3臺Web服務器上進行負載均橫。 LJ把Kenny用于外部的網(wǎng)關,使用mod_backhand進行負載均橫。 然后問題又出現(xiàn)了:
4、五臺服務器又買了一臺數(shù)據(jù)庫服務器。在兩臺數(shù)據(jù)庫服務器上使用了數(shù)據(jù)庫同步(Mysql支持的Master-Slave模式),寫操作全部針對主數(shù)據(jù)庫(通過Binlog,主服務器上的寫操作可以迅速同步到從服務器上),讀操作在兩個數(shù)據(jù)庫上同時進行(也算是負載均橫的一種吧)。 實現(xiàn)同步時要注意幾個事項:
5、更多服務器有錢了,當然要多買些服務器。部署后快了沒多久,又開始慢了。這次有更多的Web服務器,更多的數(shù)據(jù)庫服務器,存在 IO與CPU爭用。于是采用了BIG-IP作為負載均衡解決方案。 6、現(xiàn)在我們在哪里:現(xiàn)在服務器基本上夠了,但性能還是有問題,原因出在架構(gòu)上。 數(shù)據(jù)庫的架構(gòu)是最大的問題。由于增加的數(shù)據(jù)庫都是以Slave模式添加到應用內(nèi),這樣唯一的好處就是將讀操作分布到了多臺機器,但這樣帶來的后果就是寫操作被大量分發(fā),每臺機器都要執(zhí)行,服務器越多,浪費就越大,隨著寫操作的增加,用于服務讀操作的資源越來越少。 由一臺分布到兩臺 最終效果 現(xiàn)在我們發(fā)現(xiàn),我們并不需要把這些數(shù)據(jù)在如此多的服務器上都保留一份。服務器上已經(jīng)做了RAID,數(shù)據(jù)庫也進行了備份,這么多的備份完全是對資源的浪費,屬于冗余極端過度。那為什么不把數(shù)據(jù)分布存儲呢? 問題發(fā)現(xiàn)了,開始考慮如何解決?,F(xiàn)在要做的就是把不同用戶的數(shù)據(jù)分布到不同的服務器上進行存儲,以實現(xiàn)數(shù)據(jù)的分布式存儲,讓每臺機器只為相對固定的用戶服務,以實現(xiàn)平行的架構(gòu)和良好的可擴展性。 為了實現(xiàn)用戶分組,我們需要為每一個用戶分配一個組標記,用于標記此用戶的數(shù)據(jù)存放在哪一組數(shù)據(jù)庫服務器中。每組數(shù)據(jù)庫由一個master及幾個slave組成,并且slave的數(shù)量在2-3臺,以實現(xiàn)系統(tǒng)資源的最合理分配,既保證數(shù)據(jù)讀操作分布,又避免數(shù)據(jù)過度冗余以及同步操作對系統(tǒng)資源的過度消耗。 由一臺(一組)中心服務器提供用戶分組控制。所有用戶的分組信息都存儲在這臺機器上,所有針對用戶的操作需要先查詢這臺機器得到用戶的組號,然后再到相應的數(shù)據(jù)庫組中獲取數(shù)據(jù)。 這樣的用戶架構(gòu)與目前LJ的架構(gòu)已經(jīng)很相像了。 在具體的實現(xiàn)時需要注意幾個問題:
7、現(xiàn)在我們在哪里問題:
對于Master-Slave模式的單點問題,LJ采取了Master-Master模式來解決。所謂Master-Master實際上是人工實現(xiàn)的,并不是由MySQL直接提供的,實際上也就是兩臺機器同時是Master,也同時是Slave,互相同步。 Master-Master實現(xiàn)時需要注意:
解決方案:
Master-Master模式還有一種用法,這種方法與前一種相比,仍然保持兩臺機器的同步,但只有一臺機器提供服務(讀和寫),在每天晚上的時候進行輪換,或者出現(xiàn)問題的時候進行切換。 8、現(xiàn)在我們在哪里現(xiàn)在插播一條廣告,MyISAM VS InnoDB。 使用InnoDB:
使用MyISAM:
9、緩存去年我寫過一篇文章介紹memcached,它就是由LJ的團隊開發(fā)的一款緩存工具,以key-value的方式將數(shù)據(jù)存儲到分布的內(nèi)存中。LJ緩存的數(shù)據(jù):
如何建立緩存策略? 想緩存所有的東西?那是不可能的,我們只需要緩存已經(jīng)或者可能導致系統(tǒng)瓶頸的地方,最大程度的提交系統(tǒng)運行效率。通過對MySQL的日志的分析我們可以找到緩存的對象。 緩存的缺點?
10、Web訪問負載均衡在數(shù)據(jù)包級別使用BIG-IP,但BIG-IP并不知道我們內(nèi)部的處理機制,無法判斷由哪臺服務器對這些請求進行處理。反向代理并不能很好的起到作用,不是已經(jīng)夠快了,就是達不到我們想要的效果。 所以,LJ又開發(fā)了Perlbal。特點:
11、MogileFSLJ使用開源的MogileFS作為分布式文件存儲系統(tǒng)。MogileFS使用非常簡單,它的主要設計思想是:
到目前為止就這么多了,更多文檔可以在http://www./words/找到。Danga.com和LiveJournal.com的同學們拿這個文檔參加了兩次MySQL Con,兩次OS Con,以及眾多的其它會議,無私的把他們的經(jīng)驗分享出來,值得我們學習。在web2.0時代快速開發(fā)得到大家越來越多的重視,但良好的設計仍是每一個應用的基礎,希望web2.0們在成長為Top500網(wǎng)站的路上,不要因為架構(gòu)阻礙了網(wǎng)站的發(fā)展。 參考資料:http://www./words/2005_oscon/oscon-2005.pdf 感謝向靜推薦了這篇文檔給我。 |
|