
網(wǎng)站架構是網(wǎng)站這個(gè)網(wǎng)站成功與否的另一個(gè)關(guān)鍵點(diǎn),也是架構用戶(hù)體驗把握的重要因素之一。不ヽ(′ー`)ノ同的網(wǎng)站網(wǎng)站類(lèi)型需要相對應的網(wǎng)站架構作為滿(mǎn)足用戶(hù)(′_`)體驗的先決(jue)條件,比如用戶(hù)的架構主┐(′?`)┌要需求是圖片的話(huà),我們就需要對應的網(wǎng)站進(jìn)行關(guān)于?圖片站的網(wǎng)站架構規劃操作。
在百度百科對網(wǎng)站架構的架構概念是這樣解釋的:網(wǎng)站架構,一般認為是網(wǎng)站根據客戶(hù)需求分析的結果(guo),準確定位網(wǎng)站目標群體,架構設定??網(wǎng)站整??體架構,網(wǎng)站規劃、架構設計網(wǎng)站欄目及其內容,(°o°)網(wǎng)站制定(ding)網(wǎng)站開(kāi)發(fā)流程及順序,架構以最大限度地進(jìn)行高效資源分配與管理的網(wǎng)站設計。其內容有程序架構,架構呈現架構,網(wǎng)站和信息架構三種表現,而步驟主要分為硬架構和軟架構兩步程序,網(wǎng)絡(luò )架構是現代網(wǎng)絡(luò )學(xué)習和發(fā)展的一個(gè)必須的基礎技術(shù)。
1、硬架構
機房的選擇
第一:假設峰值流量是平均流量的5倍。
第二:??假設每次訪(fǎng)問(wèn)平均??的頁(yè)面大小是100K字節左右。
如果100萬(wàn)(╯°□°)╯PV的訪(fǎng)問(wèn)量在一天(tian)內??平均分布的話(huà),折合到每秒大約12次訪(fǎng)問(wèn),如果按平(ping)均每次訪(fǎng)問(wèn)頁(yè)面的大小是100K字??節左右計算的話(huà),這12次訪(fǎng)問(wèn)總計大約就是1200K字節,字節的單位是ヽ(′▽?zhuān)?ノByte(′?`),而帶寬的單位是bit,它們之間的關(guān)系(xi)是1Byte=8bit,所以1200K Byte大致就相當于9600K bit,也就是9Mbps的樣子,實(shí)際情況中??,我們的網(wǎng)站必須能在峰值流量時(shí)保持正常訪(fǎng)問(wèn),所以按照假設的峰值流量算,真實(shí)帶寬的需求應該在45Mbps 左右。
當然,這個(gè)結論是建立在前面提到的(′?ω?`)兩點(diǎn)假設的基礎上,如果你的實(shí)際情況和這兩點(diǎn)假設有出ヾ(?■_■)ノ入,那么結果也會(huì )有差別。
服務(wù)器的劃分
先看我們都需要哪些服務(wù)器:圖片服???務(wù)器,頁(yè)面服務(wù)器,數據庫服務(wù)器,應用服務(wù)器,日志??服務(wù)器等等。
對于訪(fǎng)問(wèn)量大點(diǎn)的網(wǎng)站而言,分離單獨的圖片服務(wù)器和頁(yè)面服務(wù)器相當必要,我們可以用lighttpd來(lái)跑圖??片服務(wù)器,用apache來(lái)跑頁(yè)面服務(wù)器,當然也可以選擇別的,甚至,我們可以擴展成很多臺圖片服務(wù)器和很多臺頁(yè)面服務(wù)器,并設置相關(guān)(′?ω?`)域名,如img.dom??ain和 www.domain,頁(yè)面里的圖(tu)片路徑都使用絕對路(′_ゝ`)徑,如,然后設置DNS輪循,達到最初級的負載均衡。當然,服務(wù)器多了就不可(?⊿?)避免的涉及一個(gè)同步的問(wèn)題,(′?`*)這個(gè)可以使用rsync軟件來(lái)搞定。
數據庫服務(wù)器是重中之重,因為網(wǎng)站的瓶頸問(wèn)題十有八九是出在數據庫身上?,F在一般的中小網(wǎng)站多使用MySQL數據庫,不過(guò)它的集群功能似乎還沒(méi)有達到stable的階段,所以這里不做評價(jià)。一般而言,使用MySQL數據庫的時(shí)候,我們應該搞一個(gè)主從(一主多從)結構,主數??據庫服務(wù)器使用innodb表結構,從數據服務(wù)器使用myisam表結構,充分發(fā)揮它們各自的優(yōu)勢??,而且這樣的主從結構分離了讀寫(xiě)操作,降低了讀操作的壓力,甚至我們還可以設定一個(gè)專(zhuān)門(mén)的從服務(wù)器做備份服務(wù)器,方便備份。不然如果你只有一臺主(O_O)服務(wù)器,在大數據量的情(/ω\)況下,mysqldump基本就沒(méi)戲了,直接拷貝數據文件的話(huà),還得先停止數據庫服務(wù)再拷貝,否則備份文件會(huì )出錯。但對于很多網(wǎng)站而言,即使數據庫服務(wù)僅停止了一秒也是不可接受的。如果你有了一臺從數據庫服??務(wù)器,在備份數據的時(shí)候,可以先停止服務(wù)(slave stop)再備份,再啟動(dòng)服務(wù)(slave start)后從服務(wù)器會(huì )自動(dòng)從主服務(wù)器同步數據,一切都沒(méi)有影響。但是主從結構也是有致命缺點(diǎn)的,那就是主從結構只是降低了讀操作的壓力(⊙_⊙),卻不能降低寫(xiě)操作的壓力。
為了適應更大的規模,可能只剩下最后??這招了:橫向/縱向分割數據庫。所謂橫向分ヾ(′?`)?割數據庫,就是把不同的表保存到不同的數據庫服務(wù)器上,比如說(shuō) 用戶(hù)??表保存在A(yíng)( ?ヮ?)數據庫服務(wù)器上,文章表保存在B數據庫服務(wù)器上,當然這樣的分割是有代價(jià)的,最基本的就是你沒(méi)法進(jìn)行LEFT JOIN之類(lèi)的操作了。所謂縱向分割數據庫,一般是指按照用戶(hù)標識(user_id)等來(lái)劃分數據存儲的服務(wù)器,比如說(shuō):我們有5臺數據庫服務(wù)器,那么 “user_id % 5 + 1”等于1的就保存到1號服務(wù)器,???等于2的(de)就保存到2號服務(wù)器,以此類(lèi)推,縱向分隔的原則有很多???種,可以視情況選擇。不過(guò)和橫向分割數據庫一樣,縱向分割數據庫也是有代價(jià)的,最基本的就是我們在進(jìn)行如(′Д` )COUNT, SUM等匯總操作的時(shí)候會(huì )麻煩很多。綜上所述,數據庫服務(wù)器的解決方案一般視情況往往是一個(gè)混合的方案,以其發(fā)揮各種方案的優(yōu)勢,有時(shí)候還需要借助memcached之類(lèi)的第三方軟件,以便適應更大訪(fǎng)問(wèn)量的要求。
如果有專(zhuān)門(mén)的應用服務(wù)器來(lái)跑PHP腳本是最合適不過(guò)的了,那樣我們的頁(yè)面服務(wù)器只保存靜態(tài)頁(yè)面就可以了,可以給應用服務(wù)器設置一些諸如(╯°□°)╯app.domain??之類(lèi)的域名來(lái)和頁(yè)ヽ(′▽?zhuān)?/面服務(wù)器加以區別。對于應用服務(wù)器,我還是更傾向于使用prefork模式的apache,配上必要的xcache之類(lèi)的PHP緩存軟件,加載模塊要越少越好ヾ(′ω`)?,除了mod_rewrite等必要的模塊,不必要的東西統統舍棄,盡量減少httpd進(jìn)程的內存消耗,而那些圖片服務(wù)器,頁(yè)面服務(wù)器等靜態(tài)內容就可以使用lighttpd或者tux來(lái)搞,充分發(fā)揮各種服務(wù)器的特點(diǎn)。
如果條??件允許,獨立的日志服務(wù)器也是必要的,一般小網(wǎng)站的做法都是把頁(yè)面服務(wù)器和日志服務(wù)器合二為一了,在凌晨訪(fǎng)問(wèn)量不大的時(shí)候cron運行前一天的日志計算,不過(guò)如果你使用awstats之類(lèi)的日志分析軟件,對于百萬(wàn)級訪(fǎng)問(wèn)量而言,即使按天(tian)歸檔,也會(huì )(′▽?zhuān)?消耗很多時(shí)間和服務(wù)(╬ ò﹏ó)器資(zi)源去計算,所以分離單獨的日志服務(wù)器還是有好處的,這樣不會(huì )影響正式服務(wù)(wu)器的工作狀??態(tài)。
軟架構編輯
現在的PHP框架有很多選擇,比如:Cak??ePHP,Symfony,Zend Framework等等,至于應該使用哪一個(gè)并沒(méi)有唯一的答案,要根據T??eam里團隊成員對各個(gè)框架的了解程??度而定。很多時(shí)候,即使沒(méi)(′;ω;`)有使用框架,一樣能 寫(xiě)出好的程序來(lái),比如Flickr據說(shuō)就是用Pear??+Smarty這樣的類(lèi)庫寫(xiě)出來(lái)的,所以,是否用框架,用什么框架,一般不是最重要的,重要的是我們 的編程思想里要有框架的意識。
網(wǎng)站ヽ(′ー`)ノ規模到??了一定的程度之后,代碼里各種邏輯糾纏在一起,會(huì )給維護和擴展帶來(lái)巨大的障礙,這時(shí)我們的??解決方式其實(shí)很簡(jiǎn)單,那就是重構,??將邏輯進(jìn)行分層。通常,自上而下可以分為表現層,應用層,領(lǐng)域層,持久層。
表現層
所謂表現層,并不僅僅就指模板,它的范??圍要更廣一些,所有和表現相關(guān)的邏輯都應該ヾ(′▽?zhuān)??被納入表現層的范疇。比如說(shuō)某處的字體要顯示為紅色,某處的開(kāi)頭要空兩格,這些都屬于表現層。很多時(shí)候,我們容易犯的錯誤就是把本屬于表現層的邏輯放??到了其他層面去完成,這里說(shuō)一個(gè)很常見(jiàn)的例子:我們在列表頁(yè)顯示文章標題的時(shí)候,都會(huì )設定一個(gè)最大字數,一旦標題長(cháng)度超過(guò)了這個(gè)限制,就截斷,并在后面顯示“..”,這(′?_?`)就是ヾ(′ω`)?最典型的表現層邏輯,但是實(shí)際情況,有很多程序員都是在非表現層代碼里完成數(shu)據的獲取和截斷,然后賦值給表現層模板,這樣的代碼最直接的缺點(diǎn)就是同樣一段??數據,在這個(gè)頁(yè)面我可能想顯示前10個(gè)字,┐(′ー`)┌再另一個(gè)頁(yè)面我可能想顯示前15個(gè)字??,而一旦我們在程序里固化了這個(gè)字數,也(ye)就喪失了可移植性。正確??的做法是應該做一個(gè)視圖助手之類(lèi)??的程序來(lái)專(zhuān)門(mén)處理此類(lèi)邏輯,比如說(shuō):Smarty里的truncate就屬于這樣的視圖助手(不過(guò)它那個(gè)實(shí)現不適合中文)。
應用層
所謂應用層,它的主要(yao)作用是定義用戶(hù)可以做什么(′ω`*),并把操作結果反饋給表現層。至于如何做,通常不是它的職責范圍(而是領(lǐng)域層的職責范圍),它會(huì )通過(guò)委派把如何做的工作交給領(lǐng)域層去處理。在使用MVC架構的網(wǎng)站中,我們可以看到類(lèi)??似下面這樣的URL: domain/articles/view/123,其內部編碼實(shí)現,??一般就是一個(gè)Articles控制器??類(lèi),里面有一個(gè)v(?????)iew方法,這就是一 個(gè)典型的應用層操作,因為它定義了用戶(hù)可以做一個(gè)查看的動(dòng)作。在MVC架構中,有一個(gè)準則是這么(me)說(shuō)的:Rich Model Is Good。言外之意,就是Controller要保持“瘦”一些比較好,進(jìn)而說(shuō)明應用層要盡量簡(jiǎn)單,不要??包括涉及領(lǐng)域內容的??邏輯。
領(lǐng)域層
所謂領(lǐng)域層,最直接的解釋就是包含領(lǐng)域邏輯的層。它是一個(gè)軟件的靈魂所在。先來(lái)看看什么叫領(lǐng)域邏輯,簡(jiǎn)單的說(shuō),具有明確的領(lǐng)域概念的邏輯就是領(lǐng)域邏輯,比如我們在A(yíng)TM機上取錢(qián),過(guò)程大致是這樣的(de):插入銀聯(lián)卡,輸入密碼,輸入取款金額,確定,拿錢(qián),然后ATM吐出一個(gè)交易憑條。在這個(gè)過(guò)程中,銀聯(lián)卡 在A(yíng)TM機器里完成錢(qián)從帳戶(hù)上劃??撥的(de)過(guò)程就是一個(gè)領(lǐng)域邏輯,因為取錢(qián)在銀行中是一個(gè)明確的領(lǐng)域概念,而AT??M機吐出一個(gè)交易憑條則不是領(lǐng)域邏輯,而僅是一 個(gè)應用邏輯,因為吐出交易憑條并不是銀行中一個(gè)(ge)明確的領(lǐng)域(yu)概念,只是一種技術(shù)手段,對應的,我們取錢(qián)后不吐交易憑條,而發(fā)送一條提醒短信也是可能的,但并 不是一定如此,如果在實(shí)際情況中,我們要求取ヽ(′ー`)ノ款后必須吐出交易憑條,也就是說(shuō)吐出交易憑條已┐(′?`)┌經(jīng)和取款緊密結合,那么你也可以把吐出交易憑條??看作是領(lǐng)域邏輯 的一部分,一切??都以問(wèn)題的具體情況而定。
在Eric那本經(jīng)典的領(lǐng)域驅動(dòng)設計中,把領(lǐng)域層分為了五種基本元素:實(shí)體,值對象,服務(wù),工廠(chǎng),倉儲。具體可以參 閱書(shū)中的介紹。領(lǐng)域層最常犯的錯誤就是把本應屬于領(lǐng)域層的邏輯泄(′Д` )露到了其他層次,比如說(shuō)在一個(gè)CMS系統?,對熱門(mén)文章的定義是這樣的:每天被瀏覽的次數多 于1000次,被評論的次數多于100次,這樣的文章就是熱門(mén)文章。對于一個(gè)CMS來(lái)說(shuō),熱門(mén)文(wen)章這個(gè)詞無(wú)疑是一個(gè)重(′ω`)要的??領(lǐng)域概念,那么我(wo)們如何實(shí)現這個(gè) 邏輯的設計的?你可能會(huì )給出類(lèi)似下面的代碼:(′;ω;`)“SELECT … FROM … WHERE 瀏覽 > 1000 AND 評論 > 100”,沒(méi)錯,這是最簡(jiǎn)單的實(shí)現方式,但是這里需要注意的是“每天被瀏覽的次數多于1000次,被評論的次(ci)數多于100次”這個(gè)重要的領(lǐng)域邏輯被隱藏到 了SQL語(yǔ)句中,SQL語(yǔ)句顯然不屬于領(lǐng)域層的范疇,也就是說(shuō),我們的領(lǐng)域邏輯泄露了。
持久層
所謂持久層,就是指(′;д;`)把我們的領(lǐng)域模型保存到數據庫中。因為我們的程序代碼是面向對象風(fēng)格的,而數據庫一般是關(guān)系型的數據庫,所?????以我們需要把領(lǐng)域模型碾平,才能保存到數??據庫中,但是在PHP里,直到目前還沒(méi)有非??常好的ORM出現,所以(yi)這方面的解決方案不是特別多,參考Martin的企業(yè)應用架構模式一 書(shū),大致可以使用的方法有行數ヽ(′ー`)ノ據入口(Row Data Gateway)或者表數據入口(Table Data Gateway),或者把領(lǐng)域層和持久層合二為一變成活動(dòng)記錄(Active Recor??d)的方?式(shi)。
HTML靜態(tài)化
其實(shí)大家都知道,效率最高、消耗最小的(de)就是純靜態(tài)化的(╬?益?)html頁(yè)面,所以我們盡可能使我們的網(wǎng)站架構上的頁(yè)面采用??靜態(tài)頁(yè)面來(lái)實(shí)現,這個(gè)最簡(jiǎn)單的方法其實(shí)也是最有效的方法。但ヾ(′▽?zhuān)??是對于大量?jì)热莶⑶翌l繁更新的網(wǎng)站,我們無(wú)法全部手動(dòng)去挨個(gè)實(shí)現,于是出現了我們常見(jiàn)的信息發(fā)布系統CMS,像(xiang)我們常訪(fǎng)問(wèn)的各??個(gè)門(mén)戶(hù)站點(diǎn)的新聞頻道,甚至他們的其他頻道,都是通過(guò)信息??發(fā)布系統來(lái)管理和實(shí)現的,信息發(fā)布系統可以實(shí)現最簡(jiǎn)單的信息錄入自動(dòng)生成靜態(tài)頁(yè)面,還能具備頻道??管理、權限管理、自動(dòng)抓取等功能,對于一個(gè)大型網(wǎng)站來(lái)說(shuō),擁有一套高效、可管理的CM(′_ゝ`)S是必不可少的。
除了門(mén)戶(hù)和信息發(fā)布類(lèi)型的網(wǎng)站,對于交互性要求很高的社區類(lèi)型網(wǎng)站來(lái)(′?`)說(shuō),盡可能的靜??態(tài)化也是提高性能的必要手段,將社區內的帖子、文章進(jìn)行實(shí)時(shí)的靜態(tài)化,有更新的時(shí)候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區等也是如此。
同時(shí),h??tml靜態(tài)化也是某些緩存策略使用的手段,對??于系統中頻繁使用數據庫查詢(xún)但是內容更新很小的應用,可以考慮使用hヽ(′▽?zhuān)?ノtml靜態(tài)化來(lái)實(shí)現,比如論壇中論壇的公用設置信息,這些信息目前的主流論壇都可以進(jìn)行后臺管理并且存儲在數據庫中,這些信息其實(shí)大量被前臺程序調用,但是更新頻率很小,可以考慮將這部分??內容進(jìn)行后臺更新的時(shí)候(′_ゝ`)進(jìn)行靜態(tài)化,這樣避免了大量的數據庫訪(fǎng)問(wèn)請求。
大家知??道,對于Web服務(wù)器(qi)來(lái)說(shuō),不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要(yao)將圖片與頁(yè)面進(jìn)行分離,這是基本上大型網(wǎng)站都ヾ(^-^)ノ會(huì )采用的策略,他們都有獨立的圖片服務(wù)器,甚至很(hen)多臺圖片服務(wù)器。??這樣的架構可以降低提供頁(yè)面訪(fǎng)問(wèn)請求的服務(wù)器系統壓力,并且可以保證系統不會(huì )因為圖片問(wèn)題而崩潰,在應用服務(wù)器和圖片服務(wù)器上,可以進(jìn)行不同的配置優(yōu)化,比如apache在配置Con??tentType的時(shí)候可以盡量少支持,盡??可能少的LoadModule,保證更高的系統消耗和執行效率。
有時(shí),你會(huì )在線(xiàn)上傳圖片,而一些大型網(wǎng)站需要托管和傳送大量的圖ヽ(′▽?zhuān)?ノ片,這對于構建一個(gè)具有成本效益、高可用性并具有低延時(shí)(快速檢索)┐(′д`)┌的架構是一項挑戰。
在一個(gè)圖片系統中,用戶(hù)可以上傳圖片到一個(gè)(ge)中央服務(wù)器里,通過(guò)網(wǎng)絡(luò )??連接或API對這些圖片進(jìn)行請求,就像Flickr或者Picasa。簡(jiǎn)單點(diǎn),我們就假設這個(gè)應用程序只包(//ω//)含兩個(gè)核心(xin)部分:上傳(′?ω?`)((/ω\)寫(xiě))圖片和檢索圖片。圖片上傳時(shí)最好能夠做到高效,傳輸速度也是我們最關(guān)心的,當有人向圖片發(fā)出請求時(shí)(例如是一個(gè)Web頁(yè)面或其他應用程序)。這是非常相似的功能,提供Web服務(wù)或內容分發(fā)網(wǎng)絡(luò )(一個(gè)??CDN服務(wù)器可以在許多地方存儲內容,所以無(wú)論是在地理上還是物理上都更加??接近用戶(hù),從而導致更快的性能)邊緣服務(wù)器。
數據庫集群和庫表散列
大型網(wǎng)站都有復雜的應(′▽?zhuān)?用,這些應用必須使用數據庫,那么在面對大量訪(fǎng)問(wèn)的時(shí)候,數據庫的瓶頸很快就能顯現出來(lái),這時(shí)一臺數據庫將很快無(wú)法滿(mǎn)足應用,于是我們需要ヽ(′?`)ノ使用數據庫集群或者庫表散列。在數據庫集群方面,很多數據庫都有自己的解決方(??ヮ?)?*:???案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類(lèi)似的方案,您使用了什么樣的DB,就參考相應的解決方案來(lái)實(shí)施即可。
上面提到的數據庫集群由于在架構?、成本、擴張性方面都會(huì )受到所采用DB類(lèi)型的限制,于是我們需要從應用程序的角度來(lái)考慮改善系統架構,庫表散列是??常用并且最有效的解決方案。我們在應用程序中安裝業(yè)務(wù)ヽ(′ー`)ノ和應用或者功能ヾ(′▽?zhuān)??模塊將數據庫進(jìn)??行分離,不同的模塊對應不同的數據庫或者表,再按照一定的(de)策略對某個(gè)頁(yè)面或者功能進(jìn)行更小的數據庫散列(lie),比如用戶(hù)表,按照用戶(hù)ID進(jìn)行表散列,這樣就能夠低成本的提升ヽ(′▽?zhuān)?ノ系統的性能并且有很好的擴展性。sohu的論壇就是采用了這樣的架構,將論壇的用戶(hù)、設置、帖子等信息進(jìn)行數據庫分離,然后對帖(//ω//)子、用戶(hù)按照板塊和ID進(jìn)行散列數據庫和表,最終可以在配置文件中進(jìn)行簡(jiǎn)單的配置便能讓系統隨時(shí)增加一臺低成(cheng)本的數據庫進(jìn)來(lái)補充系統性能。
緩存
緩存一詞搞技術(shù)的都接觸過(guò),很多地方用到緩存。網(wǎng)站架構和網(wǎng)站開(kāi)發(fā)中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在后面講述。
架構方面的緩存,對Apache比較熟悉的人都能知道Apache提??供了自己的緩存模(╬?益?)塊,也可以使用外加的Squid模塊進(jìn)行緩存,這兩種方式均可以有效的提高Apache的訪(fǎng)問(wèn)響應能力。
網(wǎng)站程序開(kāi)發(fā)方面??的緩存,Linux上提供的MemoryCache是常用的緩存接口,可以在web開(kāi)發(fā)(fa)中使用,比(bi)如用Java開(kāi)發(fā)的時(shí)候就可以調用Mヽ(′?`)ノemoryCache對一些數據進(jìn)行(xing)緩存和通訊共享,一些大型社區使用了這樣的架構。另外,在使用web語(yǔ)言開(kāi)發(fā)的時(shí)候,各種語(yǔ)言基本都有自己的緩存模塊和方法,PHP有Pear的??Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。
鏡像是大型網(wǎng)站常采用的提高性能和數據安全性的方式,鏡像的技術(shù)可以解決不(bu)同網(wǎng)絡(luò )接入商和地域帶來(lái)的用戶(hù)訪(fǎng)問(wèn)速度差異,比如ChinaNet和EduNet之間的差異就促使了??很多網(wǎng)站在教育網(wǎng)內搭建鏡像站點(diǎn)(dian),數據進(jìn)行定時(shí)更新或者實(shí)時(shí)更新。在鏡像的細節技術(shù)方面,這里不闡述太深,有很多專(zhuān)業(yè)的現成的解決架構和產(chǎn)品可選。也有廉價(jià)的通過(guò)軟件實(shí)現的思路,??比如Linux上的rsync等工具。
負載均衡
負載均衡將是大型網(wǎng)站解決高負荷訪(fǎng)問(wèn)和大量并發(fā)請求采用的終極解決辦法。
負載均衡技術(shù)發(fā)展了多年(nian),有(you)很多專(zhuān)業(yè)的服務(wù)提供商和產(chǎn)品可以選擇,我個(gè)人接觸過(guò)一些解決方法,其中有兩個(gè)架構可以給大家做參考。
硬件四層交換
第四層交??換使用第三層和第四層信息包的報頭信息,根據應用區??間識別業(yè)務(wù)流,將整個(gè)區間段的業(yè)務(wù)流分配到合適的應用服務(wù)器進(jìn)行??處理。 第四層交換功能就象是虛IP,指向物理服務(wù)器。它傳輸的業(yè)務(wù)服從的協(xié)議多種(zhong)多樣,有HTTP、FTP、NFS、Telnet或其他協(xié)議。這??些(???)業(yè)務(wù)在物理服務(wù)器基礎上,需要復雜的載量平衡算法。在IP世界,業(yè)務(wù)類(lèi)型由終端TCP或UDP端口(′-ι_-`)地址來(lái)決定,在第四層交換中的應用區間則由源端和終端IP地址、TCP和UDP端口共同決定。
在硬件四層交換產(chǎn)品領(lǐng)域,有一些知名的產(chǎn)???品可以選擇,比如A(°□°)lteon、F5等,這些產(chǎn)品很昂貴,但??是物有所值,能夠提供非常優(yōu)秀的性能和很??靈活的管理能力。Y??ahoo中國當初接近2??000臺服務(wù)器使用了三四臺Alteon就搞定了。??
軟件四層交換
軟件四層交換我們可以使用Linux上常用的LVS來(lái)解決,LVS就是Linux VirtualServer,他提供了基于心跳線(xiàn)heartbeat的實(shí)時(shí)災難應對解決方案,提高系統的魯棒性,同時(shí)可供了靈活的虛擬VIP配置和管理功能,可以同時(shí)滿(mǎn)足多種應用需求,這對于分布式的系統來(lái)說(shuō)必不可少。
一個(gè)典型的使用負載均衡的策略就是,在軟件或者硬件四層交換的基礎上搭建squid集群,這種思路在很多大型??網(wǎng)站包括搜索引擎??上被采用,這樣的架構低成本、高性能還有很強的擴張性,隨時(shí)往架構里面增減節點(diǎn)??都非常容易。這樣的架構我準備空了專(zhuān)門(mén)詳細整理一下和大家探討。ヽ(′▽?zhuān)?ノ
對于大型網(wǎng)站來(lái)說(shuō),前面提到的每個(gè)方法可能都會(huì )被同時(shí)使用到,我這里介紹得比較淺顯,具體實(shí)現過(guò)程中很多細節還需要大家慢慢熟悉和體會(huì ),有時(shí)一個(gè)很小的squid參數??或者apache參數設置,對于系統性能的影響就會(huì )很大,希望大家一起討論,達到拋磚引玉(′_ゝ`)之效。