服務(wù)器之負(fù)載均衡

負(fù)載均衡

所謂負(fù)載均衡,就是將任務(wù)分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行,因?yàn)槎嗯_(tái)服務(wù)器的承載能力各不相同,這可能體現(xiàn)在硬件配置、網(wǎng)絡(luò)帶寬的差異,也可能因?yàn)槟撑_(tái)服務(wù)器身兼多職,我們所說(shuō)的“均衡”,也就是希望所有服務(wù)器都不要過(guò)載,并且能夠最大程度地發(fā)揮作用。下面談?wù)勀壳傲餍械膸追Nweb負(fù)載均衡的策略。

一、HTTP重定向

當(dāng)用戶發(fā)來(lái)請(qǐng)求的時(shí)候,Web服務(wù)器通過(guò)修改HTTP響應(yīng)頭中的Location標(biāo)記來(lái)返回一個(gè)新的url,然后瀏覽器再繼續(xù)請(qǐng)求這個(gè)新url,實(shí)際上就是頁(yè)面重定向。通過(guò)重定向,來(lái)達(dá)到“負(fù)載均衡”的目標(biāo)。例如,我們?cè)谙螺dPHP源碼包的時(shí)候,點(diǎn)擊下載鏈接時(shí),為了解決不同國(guó)家和地域下載速度的問(wèn)題,它會(huì)返回一個(gè)離我們近的下載地址。重定向的HTTP返回碼是302。重定向非常容易實(shí)現(xiàn),并且可以自定義各種策略。但是,它在大規(guī)模訪問(wèn)量下,性能不佳。而且,給用戶的體驗(yàn)也不好,實(shí)際請(qǐng)求發(fā)生重定向,增加了網(wǎng)絡(luò)延時(shí)。

性能缺陷:

  • 吞吐率限制
    主站點(diǎn)服務(wù)器的吞吐率平均分配到了被轉(zhuǎn)移的服務(wù)器?,F(xiàn)假設(shè)使用RR(Round Robin)調(diào)度策略,子服務(wù)器的最大吞吐率為1000reqs/s,那么主服務(wù)器的吞吐率要達(dá)到3000reqs/s才能完全發(fā)揮三臺(tái)子服務(wù)器的作用,那么如果有100臺(tái)子服務(wù)器,那么主服務(wù)器的吞吐率可想而知得有大?相反,如果主服務(wù)的最大吞吐率為6000reqs/s,那么平均分配到子服務(wù)器的吞吐率為2000reqs/s,而現(xiàn)子服務(wù)器的最大吞吐率為1000reqs/s,因此就得增加子服務(wù)器的數(shù)量,增加到6個(gè)才能滿足。

  • 重定向訪問(wèn)深度不同
    有的重定向一個(gè)靜態(tài)頁(yè)面,有的重定向相比復(fù)雜的動(dòng)態(tài)頁(yè)面,那么實(shí)際服務(wù)器的負(fù)載差異是不可預(yù)料的,而主站服務(wù)器卻一無(wú)所知。因此整站使用重定向方法做負(fù)載均衡不太好。

我們需要權(quán)衡轉(zhuǎn)移請(qǐng)求的開(kāi)銷和處理實(shí)際請(qǐng)求的開(kāi)銷,前者相對(duì)于后者越小,那么重定向的意義就越大,例如下載。你可以去很多鏡像下載網(wǎng)站試下,會(huì)發(fā)現(xiàn)基本下載都使用了Location做了重定向。

二、反向代理負(fù)載均衡

反向代理服務(wù)的核心工作主要是轉(zhuǎn)發(fā)HTTP請(qǐng)求,扮演了瀏覽器端和后臺(tái)Web服務(wù)器中轉(zhuǎn)的角色。因?yàn)樗ぷ髟贖TTP層(應(yīng)用層),也就是網(wǎng)絡(luò)七層結(jié)構(gòu)中的第七層,因此也被稱為“七層負(fù)載均衡”??梢宰龇聪虼淼能浖芏啵容^常見(jiàn)的一種是Nginx。

Nginx是一種非常靈活的反向代理軟件,可以自由定制化轉(zhuǎn)發(fā)策略,分配服務(wù)器流量的權(quán)重等。反向代理中,常見(jiàn)的一個(gè)問(wèn)題,就是Web服務(wù)器存儲(chǔ)的session數(shù)據(jù),因?yàn)橐话阖?fù)載均衡的策略都是隨機(jī)分配請(qǐng)求的。同一個(gè)登錄用戶的請(qǐng)求,無(wú)法保證一定分配到相同的Web機(jī)器上,會(huì)導(dǎo)致無(wú)法找到session的問(wèn)題。

解決方案主要有兩種:

  • 配置反向代理的轉(zhuǎn)發(fā)規(guī)則,讓同一個(gè)用戶的請(qǐng)求一定落到同一臺(tái)機(jī)器上(通過(guò)分析cookie),復(fù)雜的轉(zhuǎn)發(fā)規(guī)則將會(huì)消耗更多的CPU,也增加了代理服務(wù)器的負(fù)擔(dān)。
  • 將session這類的信息,專門用某個(gè)獨(dú)立服務(wù)來(lái)存儲(chǔ),例如redis/memchache,這個(gè)方案是比較推薦的。
    反向代理服務(wù),也是可以開(kāi)啟緩存的,如果開(kāi)啟了,會(huì)增加反向代理的負(fù)擔(dān),需要謹(jǐn)慎使用。這種負(fù)載均衡策略實(shí)現(xiàn)和部署非常簡(jiǎn)單,而且性能表現(xiàn)也比較好。但是,它有“單點(diǎn)故障”的問(wèn)題,如果掛了,會(huì)帶來(lái)很多的麻煩。而且,到了后期Web服務(wù)器繼續(xù)增加,它本身可能成為系統(tǒng)的瓶頸。

特性

調(diào)度策略豐富。例如可以為不同的實(shí)際服務(wù)器設(shè)置不同的權(quán)重,以達(dá)到能者多勞的效果。

對(duì)反向代理服務(wù)器的并發(fā)處理能力要求高,因?yàn)樗ぷ髟贖TTP層面。

反向代理服務(wù)器進(jìn)行轉(zhuǎn)發(fā)操作本身是需要一定開(kāi)銷的,比如創(chuàng)建線程、與后端服務(wù)器建立TCP連接、接收后端服務(wù)器返回的處理結(jié)果、分析HTTP頭部信息、用戶空間和內(nèi)核空間的頻繁切換等,雖然這部分時(shí)間并不長(zhǎng),但是當(dāng)后端服務(wù)器處理請(qǐng)求的時(shí)間非常短時(shí),轉(zhuǎn)發(fā)的開(kāi)銷就顯得尤為突出。例如請(qǐng)求靜態(tài)文件,更適合使用前面介紹的基于DNS的負(fù)載均衡方式。

反向代理服務(wù)器可以監(jiān)控后端服務(wù)器,比如系統(tǒng)負(fù)載、響應(yīng)時(shí)間、是否可用、TCP連接數(shù)、流量等,從而根據(jù)這些數(shù)據(jù)調(diào)整負(fù)載均衡的策略。
反射代理服務(wù)器可以讓用戶在一次會(huì)話周期內(nèi)的所有請(qǐng)求始終轉(zhuǎn)發(fā)到一臺(tái)特定的后端服務(wù)器上(粘滯會(huì)話),這樣的好處一是保持session的本地訪問(wèn),二是防止后端服務(wù)器的動(dòng)態(tài)內(nèi)存緩存的資源浪費(fèi)。

三、IP負(fù)載均衡(LVS-NAT)

因?yàn)榉聪虼矸?wù)器工作在HTTP層,其本身的開(kāi)銷就已經(jīng)嚴(yán)重制約了可擴(kuò)展性,從而也限制了它的性能極限。那能否在HTTP層面以下實(shí)現(xiàn)負(fù)載均衡呢?答案當(dāng)然是能。IP負(fù)載均衡服務(wù)是工作在網(wǎng)絡(luò)層(修改IP)和傳輸層(修改端口,第四層),比起工作在應(yīng)用層(第七層)性能要高出非常多。原理是,他是對(duì)IP層的數(shù)據(jù)包的IP地址和端口信息進(jìn)行修改,達(dá)到負(fù)載均衡的目的。這種方式,也被稱為“四層負(fù)載均衡”。常見(jiàn)的負(fù)載均衡方式,是LVS(Linux Virtual Server,Linux虛擬服務(wù)),通過(guò)IPVS(IP Virtual Server,IP虛擬服務(wù))來(lái)實(shí)現(xiàn)。

在負(fù)載均衡服務(wù)器收到客戶端的IP包的時(shí)候,會(huì)修改IP包的目標(biāo)IP地址或端口,然后原封不動(dòng)地投遞到內(nèi)部網(wǎng)絡(luò)中,數(shù)據(jù)包會(huì)流入到實(shí)際Web服務(wù)器。實(shí)際服務(wù)器處理完成后,又會(huì)將數(shù)據(jù)包投遞回給負(fù)載均衡服務(wù)器,它再修改目標(biāo)IP地址為用戶IP地址,最終回到客戶端。

上述的方式叫LVS-NAT,除此之外,還有LVS-DR(直接路由),LVS-TUN(IP隧道),三者之間都屬于LVS的方式,但是有一定的區(qū)別。

IP負(fù)載均衡的性能要高出Nginx的反向代理很多,它只處理到傳輸層為止的數(shù)據(jù)包,并不做進(jìn)一步的組包,然后直接轉(zhuǎn)發(fā)給實(shí)際服務(wù)器。不過(guò),它的配置和搭建比較復(fù)雜。

實(shí)驗(yàn)證明使用基于NAT的負(fù)載均衡系統(tǒng),作為調(diào)度器的NAT服務(wù)器可以將吞吐率提升到一個(gè)新的高度,幾乎是反向代理服務(wù)器的兩倍以上,這大多歸功于在內(nèi)核中進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)的較低開(kāi)銷。但是一旦請(qǐng)求的內(nèi)容過(guò)大時(shí),不論是基于反向代理還是NAT,負(fù)載均衡的整體吞吐量都差距不大,這說(shuō)明對(duì)于一睦開(kāi)銷較大的內(nèi)容,使用簡(jiǎn)單的反向代理來(lái)搭建負(fù)載均衡系統(tǒng)是值考慮的。

這么強(qiáng)大的系統(tǒng)還是有它的瓶頸,那就是NAT服務(wù)器的網(wǎng)絡(luò)帶寬,包括內(nèi)部網(wǎng)絡(luò)和外部網(wǎng)絡(luò)。當(dāng)然如果你不差錢,可以去花錢去購(gòu)買千兆交換機(jī)或萬(wàn)兆交換機(jī),甚至負(fù)載均衡硬件設(shè)備,但如果你是個(gè)屌絲,咋辦?

一個(gè)簡(jiǎn)單有效的辦法就是將基于NAT的集群和前面的DNS混合使用,比如5個(gè)100Mbps出口寬帶的集群,然后通過(guò)DNS來(lái)將用戶請(qǐng)求均衡地指向這些集群,同時(shí),你還可以利用DNS智能解析實(shí)現(xiàn)地域就近訪問(wèn)。這樣的配置對(duì)于大多數(shù)業(yè)務(wù)是足夠了,但是對(duì)于提供下載或視頻等服務(wù)的大規(guī)模站點(diǎn),NAT服務(wù)器還是不夠出色。

四、直接路由(LVS-DR)

NAT是工作在網(wǎng)絡(luò)分層模型的傳輸層(第四層),而直接路由是工作在數(shù)據(jù)鏈路層(第二層),貌似更屌些。它通過(guò)修改數(shù)據(jù)包的目標(biāo)MAC地址(沒(méi)有修改目標(biāo)IP),將數(shù)據(jù)包轉(zhuǎn)發(fā)到實(shí)際服務(wù)器上,不同的是,實(shí)際服務(wù)器的響應(yīng)數(shù)據(jù)包將直接發(fā)送給客戶羰,而不經(jīng)過(guò)調(diào)度器。

LVS-DR 相較于LVS-NAT的最大優(yōu)勢(shì)在于LVS-DR不受調(diào)度器寬帶的限制,例如假設(shè)三臺(tái)服務(wù)器在WAN交換機(jī)出口寬帶都限制為10Mbps,只要對(duì)于連接調(diào)度器和兩臺(tái)實(shí)際服務(wù)器的LAN交換機(jī)沒(méi)有限速,那么,使用LVS-DR理論上可以達(dá)到20Mbps的最大出口寬帶,因?yàn)樗膶?shí)際服務(wù)器的響應(yīng)數(shù)據(jù)包可以不經(jīng)過(guò)調(diào)度器而直接發(fā)往用戶端啊,所以它與調(diào)度器的出口寬帶沒(méi)有關(guān)系,只能自身的有關(guān)系。而如果使用LVS-NAT,集群只能最大使用10Mbps的寬帶。所以,越是響應(yīng)數(shù)據(jù)包遠(yuǎn)遠(yuǎn)超過(guò)請(qǐng)求數(shù)據(jù)包的服務(wù),就越應(yīng)該降低調(diào)度器轉(zhuǎn)移請(qǐng)求的開(kāi)銷,也就越能提高整體的擴(kuò)展能力,最終也就越依賴于WAN出口寬帶。

總的來(lái)說(shuō),LVS-DR適合搭建可擴(kuò)展的負(fù)載均衡系統(tǒng),不論是Web服務(wù)器還是文件服務(wù)器,以及視頻服務(wù)器,它都擁有出色的性能。前提是你必須為實(shí)際器購(gòu)買一系列的合法IP地址。

五、IP隧道(LVS-TUN)

基于IP隧道的請(qǐng)求轉(zhuǎn)發(fā)機(jī)制:將調(diào)度器收到的IP數(shù)據(jù)包封裝在一個(gè)新的IP數(shù)據(jù)包中,轉(zhuǎn)交給實(shí)際服務(wù)器,然后實(shí)際服務(wù)器的響應(yīng)數(shù)據(jù)包可以直接到達(dá)用戶端。目前Linux大多支持,可以用LVS來(lái)實(shí)現(xiàn),稱為L(zhǎng)VS-TUN,與LVS-DR不同的是,實(shí)際服務(wù)器可以和調(diào)度器不在同一個(gè)WANt網(wǎng)段,調(diào)度器通過(guò) IP隧道技術(shù)來(lái)轉(zhuǎn)發(fā)請(qǐng)求到實(shí)際服務(wù)器,所以實(shí)際服務(wù)器也必須擁有合法的IP地址。

總體來(lái)說(shuō),LVS-DR和LVS-TUN都適合響應(yīng)和請(qǐng)求不對(duì)稱的Web服務(wù)器,如何從它們中做出選擇,取決于你的網(wǎng)絡(luò)部署需要,因?yàn)長(zhǎng)VS-TUN可以將實(shí)際服務(wù)器根據(jù)需要部署在不同的地域,并且根據(jù)就近訪問(wèn)的原則來(lái)轉(zhuǎn)移請(qǐng)求,所以有類似這種需求的,就應(yīng)該選擇LVS-TUN。

六、DNS負(fù)載均衡

DNS(Domain Name System)負(fù)責(zé)域名解析的服務(wù),域名url實(shí)際上是服務(wù)器的別名,實(shí)際映射是一個(gè)IP地址,解析過(guò)程,就是DNS完成域名到IP的映射。而一個(gè)域名是可以配置成對(duì)應(yīng)多個(gè)IP的。因此,DNS也就可以作為負(fù)載均衡服務(wù)。

這種負(fù)載均衡策略,配置簡(jiǎn)單,性能極佳。但是,不能自由定義規(guī)則,而且,變更被映射的IP或者機(jī)器故障時(shí)很麻煩,還存在DNS生效延遲的問(wèn)題。

特性

可以根據(jù)用戶IP來(lái)進(jìn)行智能解析。DNS服務(wù)器可以在所有可用的A記錄中尋找離用記最近的一臺(tái)服務(wù)器。

動(dòng)態(tài)DNS:在每次IP地址變更時(shí),及時(shí)更新DNS服務(wù)器。當(dāng)然,因?yàn)榫彺?,一定的延遲不可避免。

七、DNS/GSLB負(fù)載均衡

我們常用的CDN(Content Delivery Network,內(nèi)容分發(fā)網(wǎng)絡(luò))實(shí)現(xiàn)方式,其實(shí)就是在同一個(gè)域名映射為多IP的基礎(chǔ)上更進(jìn)一步,通過(guò)GSLB(Global Server Load Balance,全局負(fù)載均衡)按照指定規(guī)則映射域名的IP。一般情況下都是按照地理位置,將離用戶近的IP返回給用戶,減少網(wǎng)絡(luò)傳輸中的路由節(jié)點(diǎn)之間的跳躍消耗。

CDN在Web系統(tǒng)中,一般情況下是用來(lái)解決大小較大的靜態(tài)資源(html/Js/Css/圖片等)的加載問(wèn)題,讓這些比較依賴網(wǎng)絡(luò)下載的內(nèi)容,盡可能離用戶更近,提升用戶體驗(yàn)。

這種方式,和前面的DNS負(fù)載均衡一樣,不僅性能極佳,而且支持配置多種策略。但是,搭建和維護(hù)成本非常高。互聯(lián)網(wǎng)一線公司,會(huì)自建CDN服務(wù),中小型公司一般使用第三方提供的CDN。

參考

http://developer.51cto.com/art/201410/454951.htm
http://blog.jobbole.com/91738/
http://www.open-open.com/lib/view/open1416924842581.html
http://voidy.net/web_load_balance

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容