分布式服务器搭建
【系統(tǒng)架構(gòu)】?jī)|級(jí)Web系統(tǒng)搭建(1):Web負(fù)載均衡
當(dāng)一個(gè)Web系統(tǒng)從日訪問(wèn)量10萬(wàn)逐步增長(zhǎng)到1000萬(wàn),甚至超過(guò)1億的過(guò)程中,Web系統(tǒng)承受的壓力會(huì)越來(lái)越大,在這個(gè)過(guò)程中,我們會(huì)遇到很多的問(wèn)題。為了解決這些性能壓力帶來(lái)問(wèn)題,我們需要通過(guò)搭建不同的服務(wù)和架構(gòu)來(lái)解決。
當(dāng)單機(jī)容量達(dá)到極限時(shí),我們需要考慮業(yè)務(wù)拆分和分布式部署,來(lái)解決大型網(wǎng)站訪問(wèn)量大,并發(fā)量高,海量數(shù)據(jù)的問(wèn)題。從單機(jī)到分布式,很重要的區(qū)別是業(yè)務(wù)拆分和分布式部署,將應(yīng)用拆分后,部署到不同的機(jī)器上,實(shí)現(xiàn)大規(guī)模分布式系統(tǒng)。分布式和業(yè)務(wù)拆分解決了,從集中到分布的問(wèn)題,但是每個(gè)部署的獨(dú)立業(yè)務(wù)還存在單點(diǎn)的問(wèn)題和訪問(wèn)統(tǒng)一入口問(wèn)題,為解決單點(diǎn)故障,我們可以采取冗余的方式。將相同的應(yīng)用部署到多臺(tái)機(jī)器上。解決訪問(wèn)統(tǒng)一入口問(wèn)題,我們可以在集群前面增加負(fù)載均衡設(shè)備,實(shí)現(xiàn)流量分發(fā)。
Web負(fù)載均衡(Load Balancing),簡(jiǎn)單地說(shuō)就是將負(fù)載(工作任務(wù),訪問(wèn)請(qǐng)求)進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元(服務(wù)器,組件)上進(jìn)行執(zhí)行。對(duì)于保護(hù)處于后端的Web服務(wù)器來(lái)說(shuō),非常重要,是解決高性能,單點(diǎn)故障(高可用),擴(kuò)展性(水平伸縮)的終極解決方案。
負(fù)載均衡的策略有很多,我們從簡(jiǎn)單的講起哈。
?
?
HTTP負(fù)載均衡
當(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,如下圖:
如果使用PHP代碼來(lái)實(shí)現(xiàn)這個(gè)功能,方式如下:
這個(gè)重定向非常容易實(shí)現(xiàn),并且可以自定義各種策略。但是,它在大規(guī)模訪問(wèn)量下,性能不佳。而且,給用戶的體驗(yàn)也不好,實(shí)際請(qǐng)求發(fā)生重定向,增加了網(wǎng)絡(luò)延時(shí)。
?
?
反向代理負(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)題。
解決方案主要有兩種:
?
1、配置反向代理的轉(zhuǎn)發(fā)規(guī)則,讓同一個(gè)用戶的請(qǐng)求一定落到同一臺(tái)機(jī)器上(通過(guò)分析cookie),復(fù)雜的轉(zhuǎn)發(fā)規(guī)則將會(huì)消耗更多的CPU,也增加了代理服務(wù)器的負(fù)擔(dān)。
2、將session這類的信息,專門用某個(gè)獨(dú)立服務(wù)來(lái)存儲(chǔ),例如redis/memchache,這個(gè)方案是比較推薦的。
反向代理服務(wù),也是可以開啟緩存的,如果開啟了,會(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)的瓶頸。
?
?
IP負(fù)載均衡
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-RD(直接路由),LVS-TUN(IP隧道),三者之間都屬于LVS的方式,但是有一定的區(qū)別,篇幅問(wèn)題,不贅敘。
IP負(fù)載均衡的性能要高出Nginx的反向代理很多,它只處理到傳輸層為止的數(shù)據(jù)包,并不做進(jìn)一步的組包,然后直接轉(zhuǎn)發(fā)給實(shí)際服務(wù)器。不過(guò),它的配置和搭建比較復(fù)雜。
?
?
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)題。
?
?
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)之間的跳躍消耗。
圖中的“向上尋找”,實(shí)際過(guò)程是LDNS(Local DNS)先向根域名服務(wù)(Root Name Server)獲取到頂級(jí)根的Name Server(例如.com的),然后得到指定域名的授權(quán)DNS,然后再獲得實(shí)際服務(wù)器IP。
CDN在Web系統(tǒng)中,一般情況下是用來(lái)解決大小較大的靜態(tài)資源(html/Js/Css/圖片等)的加載問(wèn)題,讓這些比較依賴網(wǎng)絡(luò)下載的內(nèi)容,盡可能離用戶更近,提升用戶體驗(yàn)。
例如,我訪問(wèn)了一張imgcache.gtimg.cn上的圖片(騰訊的自建CDN,不使用qq.com域名的原因是防止http請(qǐng)求的時(shí)候,帶上了多余的cookie信息),我獲得的IP是183.60.217.90。
這種方式,和前面的DNS負(fù)載均衡一樣,不僅性能極佳,而且支持配置多種策略。但是,搭建和維護(hù)成本非常高。互聯(lián)網(wǎng)一線公司,會(huì)自建CDN服務(wù),中小型公司一般使用第三方提供的CDN。
負(fù)載均衡就總結(jié)到這,下篇會(huì)總結(jié)web系統(tǒng)緩存機(jī)制的建立和優(yōu)化。
總結(jié)
- 上一篇: python 中 __name__ 的使
- 下一篇: H264编码 封装成MP4格式 视频流