<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    coolfiry

    認(rèn)認(rèn)真真做人,兢兢業(yè)業(yè)做事!
    posts - 39, comments - 17, trackbacks - 0, articles - 0

    從LiveJournal后臺(tái)發(fā)展看大規(guī)模網(wǎng)站性能優(yōu)化方法

    一、LiveJournal發(fā)展歷程

    LiveJournal是99年始于校園中的項(xiàng)目,幾個(gè)人出于愛(ài)好做了這樣一個(gè)應(yīng)用,以實(shí)現(xiàn)以下功能:

    • 博客,論壇
    • 社會(huì)性網(wǎng)絡(luò),找到朋友
    • 聚合,把朋友的文章聚合在一起

    LiveJournal采用了大量的開(kāi)源軟件,甚至它本身也是一個(gè)開(kāi)源軟件。

    在上線后,LiveJournal實(shí)現(xiàn)了非常快速的增長(zhǎng):

    • 2004年4月份:280萬(wàn)注冊(cè)用戶。
    • 2005年4月份:680萬(wàn)注冊(cè)用戶。
    • 2005年8月份:790萬(wàn)注冊(cè)用戶。
    • 達(dá)到了每秒鐘上千次的頁(yè)面請(qǐng)求及處理。
    • 使用了大量MySQL服務(wù)器。
    • 使用了大量通用組件。

    二、LiveJournal架構(gòu)現(xiàn)狀概況

    livejournal_backend.png

    三、從LiveJournal發(fā)展中學(xué)習(xí)

     

    LiveJournal從1臺(tái)服務(wù)器發(fā)展到100臺(tái)服務(wù)器,這其中經(jīng)歷了無(wú)數(shù)的傷痛,但同時(shí)也摸索出了解決這些問(wèn)題的方法,通過(guò)對(duì)LiveJournal的學(xué)習(xí),可以讓我們避免LJ曾經(jīng)犯過(guò)的錯(cuò)誤,并且從一開(kāi)始就對(duì)系統(tǒng)進(jìn)行良好的設(shè)計(jì),以避免后期的痛苦。

    下面我們一步一步看LJ發(fā)展的腳步。

    1、一臺(tái)服務(wù)器

    一 臺(tái)別人捐助的服務(wù)器,LJ最初就跑在上面,就像Google開(kāi)始時(shí)候用的破服務(wù)器一樣,值得我們尊敬。這個(gè)階段,LJ的人以驚人的速度熟悉的Unix的操 作管理,服務(wù)器性能出現(xiàn)過(guò)問(wèn)題,不過(guò)還好,可以通過(guò)一些小修小改應(yīng)付過(guò)去。在這個(gè)階段里L(fēng)J把CGI升級(jí)到了FastCGI。

    最終問(wèn)題出現(xiàn)了,網(wǎng)站越來(lái)越慢,已經(jīng)無(wú)法通過(guò)優(yōu)過(guò)化來(lái)解決的地步,需要更多的服務(wù)器,這時(shí)LJ開(kāi)始提供付費(fèi)服務(wù),可能是想通過(guò)這些錢(qián)來(lái)購(gòu)買(mǎi)新的服務(wù)器,以解決當(dāng)時(shí)的困境。
    毫無(wú)疑問(wèn),當(dāng)時(shí)LJ存在巨大的單點(diǎn)問(wèn)題,所有的東西都在那臺(tái)服務(wù)器的鐵皮盒子里裝著。

    LJ-backend-7.png

    2、兩臺(tái)服務(wù)器

    用付費(fèi)服務(wù)賺來(lái)的錢(qián)LJ買(mǎi)了兩臺(tái)服務(wù)器:一臺(tái)叫做Kenny的Dell 6U機(jī)器用于提供Web服務(wù),一臺(tái)叫做Cartman的Dell 6U服務(wù)器用于提供數(shù)據(jù)庫(kù)服務(wù)。

    LJ-backend-8.png

    LJ有了更大的磁盤(pán),更多的計(jì)算資源。但同時(shí)網(wǎng)絡(luò)結(jié)構(gòu)還是非常簡(jiǎn)單,每臺(tái)機(jī)器兩塊網(wǎng)卡,Cartman通過(guò)內(nèi)網(wǎng)為Kenny提供MySQL數(shù)據(jù)庫(kù)服務(wù)。

    暫時(shí)解決了負(fù)載的問(wèn)題,新的問(wèn)題又出現(xiàn)了:

    • 原來(lái)的一個(gè)單點(diǎn)變成了兩個(gè)單點(diǎn)。
    • 沒(méi)有冷備份或熱備份。
    • 網(wǎng)站速度慢的問(wèn)題又開(kāi)始出現(xiàn)了,沒(méi)辦法,增長(zhǎng)太快了。
    • Web服務(wù)器上CPU達(dá)到上限,需要更多的Web服務(wù)器。

    3、四臺(tái)服務(wù)器

    又買(mǎi)了兩臺(tái),Kyle和Stan,這次都是1U的,都用于提供Web服務(wù)。目前LJ一共有3臺(tái)Web服務(wù)器和一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器。這時(shí)需要在3臺(tái)Web服務(wù)器上進(jìn)行負(fù)載均橫。

    LJ-backend-9.png

    LJ把Kenny用于外部的網(wǎng)關(guān),使用mod_backhand進(jìn)行負(fù)載均橫。

    然后問(wèn)題又出現(xiàn)了:

    • 單點(diǎn)故障。數(shù)據(jù)庫(kù)和用于做網(wǎng)關(guān)的Web服務(wù)器都是單點(diǎn),一旦任何一臺(tái)機(jī)器出現(xiàn)問(wèn)題將導(dǎo)致所有服務(wù)不可用。雖然用于做網(wǎng)關(guān)的Web服務(wù)器可以通過(guò)保持心跳同步迅速切換,但還是無(wú)法解決數(shù)據(jù)庫(kù)的單點(diǎn),LJ當(dāng)時(shí)也沒(méi)做這個(gè)。
    • 網(wǎng)站又變慢了,這次是因?yàn)镮O和數(shù)據(jù)庫(kù)的問(wèn)題,問(wèn)題是怎么往應(yīng)用里面添加數(shù)據(jù)庫(kù)呢?

    4、五臺(tái)服務(wù)器

    又買(mǎi)了一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器。在兩臺(tái)數(shù)據(jù)庫(kù)服務(wù)器上使用了數(shù)據(jù)庫(kù)同步(Mysql支持的Master-Slave模式),寫(xiě)操作全部針對(duì)主數(shù)據(jù)庫(kù)(通過(guò)Binlog,主服務(wù)器上的寫(xiě)操作可以迅速同步到從服務(wù)器上),讀操作在兩個(gè)數(shù)據(jù)庫(kù)上同時(shí)進(jìn)行(也算是負(fù)載均橫的一種吧)。

    LJ-backend-10.png

    實(shí)現(xiàn)同步時(shí)要注意幾個(gè)事項(xiàng):

    • 讀操作數(shù)據(jù)庫(kù)選擇算法處理,要選一個(gè)當(dāng)前負(fù)載輕一點(diǎn)的數(shù)據(jù)庫(kù)。
    • 在從數(shù)據(jù)庫(kù)服務(wù)器上只能進(jìn)行讀操作
    • 準(zhǔn)備好應(yīng)對(duì)同步過(guò)程中的延遲,處理不好可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)同步的中斷。只需要對(duì)寫(xiě)操作進(jìn)行判斷即可,讀操作不存在同步問(wèn)題。

    5、更多服務(wù)器

    有錢(qián)了,當(dāng)然要多買(mǎi)些服務(wù)器。部署后快了沒(méi)多久,又開(kāi)始慢了。這次有更多的Web服務(wù)器,更多的數(shù)據(jù)庫(kù)服務(wù)器,存在 IO與CPU爭(zhēng)用。于是采用了BIG-IP作為負(fù)載均衡解決方案。

    LJ-backend-11.png

    6、現(xiàn)在我們?cè)谀睦铮?/h2>

    LJ-backend-1.png

    現(xiàn)在服務(wù)器基本上夠了,但性能還是有問(wèn)題,原因出在架構(gòu)上。

    數(shù)據(jù)庫(kù)的架構(gòu)是最大的問(wèn)題。由于增加的數(shù)據(jù)庫(kù)都是以Slave模式添加到應(yīng)用內(nèi),這樣唯一的好處就是將讀操作分布到了多臺(tái)機(jī)器,但這樣帶來(lái)的后果就是寫(xiě)操作被大量分發(fā),每臺(tái)機(jī)器都要執(zhí)行,服務(wù)器越多,浪費(fèi)就越大,隨著寫(xiě)操作的增加,用于服務(wù)讀操作的資源越來(lái)越少。

    LJ-backend-2.png

    由一臺(tái)分布到兩臺(tái)

    LJ-backend-3.png

    最終效果

    現(xiàn)在我們發(fā)現(xiàn),我們并不需要把這些數(shù)據(jù)在如此多的服務(wù)器上都保留一份。服務(wù)器上已經(jīng)做了RAID,數(shù)據(jù)庫(kù)也進(jìn)行了備份,這么多的備份完全是對(duì)資源的浪費(fèi),屬于冗余極端過(guò)度。那為什么不把數(shù)據(jù)分布存儲(chǔ)呢?

    問(wèn)題發(fā)現(xiàn)了,開(kāi)始考慮如何解決。現(xiàn)在要做的就是把不同用戶的數(shù)據(jù)分布到不同的服務(wù)器上進(jìn)行存儲(chǔ),以實(shí)現(xiàn)數(shù)據(jù)的分布式存儲(chǔ),讓每臺(tái)機(jī)器只為相對(duì)固定的用戶服務(wù),以實(shí)現(xiàn)平行的架構(gòu)和良好的可擴(kuò)展性。

    為 了實(shí)現(xiàn)用戶分組,我們需要為每一個(gè)用戶分配一個(gè)組標(biāo)記,用于標(biāo)記此用戶的數(shù)據(jù)存放在哪一組數(shù)據(jù)庫(kù)服務(wù)器中。每組數(shù)據(jù)庫(kù)由一個(gè)master及幾個(gè)slave 組成,并且slave的數(shù)量在2-3臺(tái),以實(shí)現(xiàn)系統(tǒng)資源的最合理分配,既保證數(shù)據(jù)讀操作分布,又避免數(shù)據(jù)過(guò)度冗余以及同步操作對(duì)系統(tǒng)資源的過(guò)度消耗。

    LJ-backend-4.png

    由一臺(tái)(一組)中心服務(wù)器提供用戶分組控制。所有用戶的分組信息都存儲(chǔ)在這臺(tái)機(jī)器上,所有針對(duì)用戶的操作需要先查詢(xún)這臺(tái)機(jī)器得到用戶的組號(hào),然后再到相應(yīng)的數(shù)據(jù)庫(kù)組中獲取數(shù)據(jù)。

    這樣的用戶架構(gòu)與目前LJ的架構(gòu)已經(jīng)很相像了。

    在具體的實(shí)現(xiàn)時(shí)需要注意幾個(gè)問(wèn)題:

    • 在數(shù)據(jù)庫(kù)組內(nèi)不要使用自增ID,以便于以后在數(shù)據(jù)庫(kù)組之間遷移用戶,以實(shí)現(xiàn)更合理的I/O,磁盤(pán)空間及負(fù)載分布。
    • 將userid,postid存儲(chǔ)在全局服務(wù)器上,可以使用自增,數(shù)據(jù)庫(kù)組中的相應(yīng)值必須以全局服務(wù)器上的值為準(zhǔn)。全局服務(wù)器上使用事務(wù)型數(shù)據(jù)庫(kù)InnoDB。
    • 在數(shù)據(jù)庫(kù)組之間遷移用戶時(shí)要萬(wàn)分小心,當(dāng)遷移時(shí)用戶不能有寫(xiě)操作。

    7、現(xiàn)在我們?cè)谀睦?/h2>

    LJ-backend-5.png

    問(wèn)題:

    • 一個(gè)全局主服務(wù)器,掛掉的話所有用戶注冊(cè)及寫(xiě)操作就掛掉。
    • 每個(gè)數(shù)據(jù)庫(kù)組一個(gè)主服務(wù)器,掛掉的話這組用戶的寫(xiě)操作就掛掉。
    • 數(shù)據(jù)庫(kù)組從服務(wù)器掛掉的話會(huì)導(dǎo)致其它服務(wù)器負(fù)載過(guò)大。

    對(duì)于Master-Slave模式的單點(diǎn)問(wèn)題,LJ采取了Master-Master模式來(lái)解決。所謂Master-Master實(shí)際上是人工實(shí)現(xiàn)的,并不是由MySQL直接提供的,實(shí)際上也就是兩臺(tái)機(jī)器同時(shí)是Master,也同時(shí)是Slave,互相同步。

    Master-Master實(shí)現(xiàn)時(shí)需要注意:

    • 一個(gè)Master出錯(cuò)后恢復(fù)同步,最好由服務(wù)器自動(dòng)完成。
    • 數(shù)字分配,由于同時(shí)在兩臺(tái)機(jī)器上寫(xiě),有些ID可能會(huì)沖突。

    解決方案:

    • 奇偶數(shù)分配ID,一臺(tái)機(jī)器上寫(xiě)奇數(shù),一臺(tái)機(jī)器上寫(xiě)偶數(shù)
    • 通過(guò)全局服務(wù)器進(jìn)行分配(LJ采用的做法)。

     

    Master-Master模式還有一種用法,這種方法與前一種相比,仍然保持兩臺(tái)機(jī)器的同步,但只有一臺(tái)機(jī)器提供服務(wù)(讀和寫(xiě)),在每天晚上的時(shí)候進(jìn)行輪換,或者出現(xiàn)問(wèn)題的時(shí)候進(jìn)行切換。

    8、現(xiàn)在我們?cè)谀睦?/h2>

    LJ-backend-6.png

    現(xiàn)在插播一條廣告,MyISAM VS InnoDB。

    使用InnoDB:

    • 支持事務(wù)
    • 需要做更多的配置,不過(guò)值得,可以更安全的存儲(chǔ)數(shù)據(jù),以及得到更快的速度。

    使用MyISAM:

    • 記錄日志(LJ用它來(lái)記網(wǎng)絡(luò)訪問(wèn)日志)
    • 存儲(chǔ)只讀靜態(tài)數(shù)據(jù),足夠快。
    • 并發(fā)性很差,無(wú)法同時(shí)讀寫(xiě)數(shù)據(jù)(添加數(shù)據(jù)可以)
    • MySQL非正常關(guān)閉或死機(jī)時(shí)會(huì)導(dǎo)致索引錯(cuò)誤,需要使用myisamchk修復(fù),而且當(dāng)訪問(wèn)量大時(shí)出現(xiàn)非常頻繁。

    9、緩存

    去年我寫(xiě)過(guò)一篇文章介紹memcached,它就是由LJ的團(tuán)隊(duì)開(kāi)發(fā)的一款緩存工具,以key-value的方式將數(shù)據(jù)存儲(chǔ)到分布的內(nèi)存中。LJ緩存的數(shù)據(jù):

    • 12臺(tái)獨(dú)立服務(wù)器(不是捐贈(zèng)的)
    • 28個(gè)實(shí)例
    • 30GB總?cè)萘?
    • 90-93%的命中率(用過(guò)squid的人可能知道,squid內(nèi)存加磁盤(pán)的命中率大概在70-80%)

    如何建立緩存策略?

    想緩存所有的東西?那是不可能的,我們只需要緩存已經(jīng)或者可能導(dǎo)致系統(tǒng)瓶頸的地方,最大程度的提交系統(tǒng)運(yùn)行效率。通過(guò)對(duì)MySQL的日志的分析我們可以找到緩存的對(duì)象。

    緩存的缺點(diǎn)?

    • 沒(méi)有完美的事物,緩存也有缺點(diǎn):
    • 增大開(kāi)發(fā)量,需要針對(duì)緩存處理編寫(xiě)特殊的代碼。
    • 管理難度增加,需要更多人參與系統(tǒng)維護(hù)。
    • 當(dāng)然大內(nèi)存也需要錢(qián)。

    10、Web訪問(wèn)負(fù)載均衡

    在數(shù)據(jù)包級(jí)別使用BIG-IP,但BIG-IP并不知道我們內(nèi)部的處理機(jī)制,無(wú)法判斷由哪臺(tái)服務(wù)器對(duì)這些請(qǐng)求進(jìn)行處理。反向代理并不能很好的起到作用,不是已經(jīng)夠快了,就是達(dá)不到我們想要的效果。

    所以,LJ又開(kāi)發(fā)了Perlbal。特點(diǎn):

    • 快,小,可管理的http web 服務(wù)器/代理
    • 可以在內(nèi)部進(jìn)行轉(zhuǎn)發(fā)
    • 使用Perl開(kāi)發(fā)
    • 單線程,異步,基于事件,使用epoll , kqueue
    • 支持Console管理與http遠(yuǎn)程管理,支持動(dòng)態(tài)配置加載
    • 多種模式:web服務(wù)器,反向代理,插件
    • 支持插件:GIF/PNG互換?

    11、MogileFS

    LJ使用開(kāi)源的MogileFS作為分布式文件存儲(chǔ)系統(tǒng)。MogileFS使用非常簡(jiǎn)單,它的主要設(shè)計(jì)思想是:

    • 文件屬于類(lèi)(類(lèi)是最小的復(fù)制單位)
    • 跟蹤文件存儲(chǔ)位置
    • 在不同主機(jī)上存儲(chǔ)
    • 使用MySQL集群統(tǒng)一存儲(chǔ)分布信息
    • 大容易廉價(jià)磁盤(pán)

    到目前為止就這么多了,更多文檔可以在http://www.danga.com/words/找到。Danga.comLiveJournal.com的 同學(xué)們拿這個(gè)文檔參加了兩次MySQL Con,兩次OS Con,以及眾多的其它會(huì)議,無(wú)私的把他們的經(jīng)驗(yàn)分享出來(lái),值得我們學(xué)習(xí)。在web2.0時(shí)代快速開(kāi)發(fā)得到大家越來(lái)越多的重視,但良好的設(shè)計(jì)仍是每一個(gè)應(yīng) 用的基礎(chǔ),希望web2.0們?cè)诔砷L(zhǎng)為T(mén)op500網(wǎng)站的路上,不要因?yàn)榧軜?gòu)阻礙了網(wǎng)站的發(fā)展。

     http://blog.csdn.net/xmr_gxcfe/archive/2007/09/14/1785292.aspx

     

    主站蜘蛛池模板: 99re8这里有精品热视频免费| 国产精品亚洲专一区二区三区| 国产人成网在线播放VA免费| 国产女高清在线看免费观看| 亚洲中文字幕久久精品无码VA| 18禁止看的免费污网站| 亚洲av鲁丝一区二区三区| 中文字幕免费观看全部电影| 亚洲国产精品一区二区九九 | 妞干网手机免费视频| 亚洲性一级理论片在线观看| 99久久国产免费中文无字幕| 亚洲精品视频在线| 一级毛片免费观看不卡视频| 亚洲情XO亚洲色XO无码| 97在线免费观看视频| 久久精品国产亚洲AV网站| 午夜精品一区二区三区免费视频| 伊人久久大香线蕉亚洲五月天| 好吊色永久免费视频大全| 国产亚洲AV夜间福利香蕉149| 国产日韩精品无码区免费专区国产 | 99久久精品毛片免费播放| 亚洲成A人片在线观看无码不卡| 成全视成人免费观看在线看| 亚洲成AV人片在| 99re免费视频| 亚洲永久网址在线观看| 永久免费无码网站在线观看| 在线91精品亚洲网站精品成人| 亚洲M码 欧洲S码SSS222| 一区二区三区在线观看免费| 久久亚洲精品国产精品黑人| 免费A级毛片无码A∨免费| 亚洲情A成黄在线观看动漫软件| 国产网站免费观看| 中文字幕免费在线视频| 亚洲美女一区二区三区| 成人毛片18女人毛片免费| 特级av毛片免费观看| 国产av天堂亚洲国产av天堂|