在互聯(lián)網(wǎng)+不斷滲透到生活中的今天,各種各樣的網(wǎng)絡(luò)服務(wù)存在在我們身邊,他們的訪問(wèn)流量也是大得驚人。一個(gè)大型網(wǎng)站(百萬(wàn)PV以上)想要正常訪問(wèn),單單靠一臺(tái)服務(wù)器是不可能提供穩(wěn)定服務(wù)的。這時(shí)候就需要用負(fù)載均衡技術(shù)將海量的接口請(qǐng)求平均分發(fā)到各個(gè)服務(wù)器上,以減少每臺(tái)服務(wù)器的壓力。
上面的流程圖展示了從用戶請(qǐng)求和響應(yīng)的整個(gè)路程。用戶按下一個(gè)按鈕,一個(gè)請(qǐng)求通過(guò)網(wǎng)絡(luò)轉(zhuǎn)發(fā)到運(yùn)營(yíng)商網(wǎng)絡(luò),運(yùn)營(yíng)商對(duì)其進(jìn)行DNS解析。如果請(qǐng)求所對(duì)應(yīng)的域名配置了DNS輪詢,那么運(yùn)營(yíng)商將會(huì)隨機(jī)返回域名對(duì)應(yīng)的一個(gè)服務(wù)器IP,之后將請(qǐng)求轉(zhuǎn)發(fā)到該服務(wù)器上。當(dāng)請(qǐng)求到達(dá)服務(wù)器時(shí),首先會(huì)達(dá)到LVS虛擬服務(wù)器,虛擬服務(wù)器再根據(jù)具體算法轉(zhuǎn)發(fā)給后邊的Nginx服務(wù)器。當(dāng)Nginx接收到請(qǐng)求時(shí),Nginx服務(wù)器會(huì)根據(jù)其配置將請(qǐng)求再次轉(zhuǎn)發(fā)給其后端配置的應(yīng)用服務(wù)器,應(yīng)用服務(wù)器才是最終處理業(yè)務(wù)請(qǐng)求的地方。
在整個(gè)請(qǐng)求過(guò)程中,有三種負(fù)載均衡技術(shù):第一次是DNS輪詢,第二次是LVS負(fù)載均衡,第三次是Nginx負(fù)載均衡。
DNS輪詢指的是服務(wù)提供者在運(yùn)營(yíng)商針對(duì)某一域名配置了多個(gè)提供服務(wù)的服務(wù)器IP,當(dāng)用戶請(qǐng)求改域名的接口時(shí),運(yùn)營(yíng)商將隨機(jī)挑選出一個(gè)服務(wù)器響應(yīng)用戶請(qǐng)求。下圖的例子是:有3臺(tái)聯(lián)通服務(wù)器、3臺(tái)電信服務(wù)器,要實(shí)現(xiàn)“聯(lián)通用戶流量分?jǐn)偟?臺(tái)聯(lián)通服務(wù)器、其他用戶流量分?jǐn)偟诫娦欧?wù)器”這個(gè)效果的設(shè)置。
DNS由于成本較低,所以一般在小型的網(wǎng)站用的比較多。但是大型的網(wǎng)站一般也會(huì)將用它和其他負(fù)載均衡的方式結(jié)合起來(lái)一起使用,DNS輪詢方式提供的IP地址,在大型網(wǎng)站中往往是一個(gè)集群的地址,可能是均衡交換機(jī)也可能是均衡服務(wù)器。我們可以通過(guò)nslookup
命令來(lái)查詢域名的DNS配置情況:
C:\Users\Administrator>nslookup www.baidu.com服務(wù)器: UnKnownAddress: 10.10.121.11非權(quán)威應(yīng)答:名稱: www.a.shifen.comAddresses: 58.217.200.113 58.217.200.112Aliases: www.baidu.com
DNS輪詢的優(yōu)點(diǎn)是成本低、操作簡(jiǎn)單,但是其缺點(diǎn)也是明顯的:
正是因?yàn)樯鲜龃嬖诘娜秉c(diǎn),所以DNS一般不會(huì)單獨(dú)使用,而是配合其他負(fù)載均衡方式一起使用。
LVS服務(wù)器接收到網(wǎng)絡(luò)請(qǐng)求后,會(huì)根據(jù)配置的算法將請(qǐng)求轉(zhuǎn)發(fā)給后邊的服務(wù)器處理。為了實(shí)現(xiàn)高可用,一般情況下都會(huì)有至少兩臺(tái)LVS服務(wù)器,它們之間用KeepAlive定時(shí)通信。當(dāng)備用LVS服務(wù)器無(wú)法接收到主LVS服務(wù)器的信息時(shí),備用LVS服務(wù)器就認(rèn)為主LVS已經(jīng)宕機(jī)了,這時(shí)候備用LVS將自動(dòng)切換為主LVS提供服務(wù)。
使用LVS架設(shè)的服務(wù)器集群系統(tǒng)有三個(gè)部分組成:最前端的負(fù)載均衡層(Loader Balancer),中間的服務(wù)器群組層,用Server Array表示,最底層的數(shù)據(jù)共享存儲(chǔ)層,用Shared Storage表示。在用戶看來(lái)所有的應(yīng)用都是透明的,用戶只是在使用一個(gè)虛擬服務(wù)器提供的高性能服務(wù)。LVS的體系架構(gòu)如圖:
LVS的各個(gè)層次的詳細(xì)介紹:
Load Balancer層:位于整個(gè)集群系統(tǒng)的最前端,有一臺(tái)或者多臺(tái)負(fù)載調(diào)度器(Director Server)組成,LVS模塊就安裝在Director Server上,而Director的主要作用類(lèi)似于一個(gè)路由器,它含有完成LVS功能所設(shè)定的路由表,通過(guò)這些路由表把用戶的請(qǐng)求分發(fā)給Server Array層的應(yīng)用服務(wù)器(Real Server)上。同時(shí),在Director Server上還要安裝對(duì)Real Server服務(wù)的監(jiān)控模塊Ldirectord,此模塊用于監(jiān)測(cè)各個(gè)Real Server服務(wù)的健康狀況。在Real Server不可用時(shí)把它從LVS路由表中剔除,恢復(fù)時(shí)重新加入。
Server Array層:由一組實(shí)際運(yùn)行應(yīng)用服務(wù)的機(jī)器組成,Real Server可以是WEB服務(wù)器、MAIL服務(wù)器、FTP服務(wù)器、DNS服務(wù)器、視頻服務(wù)器中的一個(gè)或者多個(gè),每個(gè)Real Server之間通過(guò)高速的LAN或分布在各地的WAN相連接。在實(shí)際的應(yīng)用中,Director Server也可以同時(shí)兼任Real Server的角色。
Shared Storage層:是為所有Real Server提供共享存儲(chǔ)空間和內(nèi)容一致性的存儲(chǔ)區(qū)域,在物理上,一般有磁盤(pán)陣列設(shè)備組成,為了提供內(nèi)容的一致性,一般可以通過(guò)NFS網(wǎng)絡(luò)文件系統(tǒng)共享數(shù) 據(jù),但是NFS在繁忙的業(yè)務(wù)系統(tǒng)中,性能并不是很好,此時(shí)可以采用集群文件系統(tǒng),例如Red hat的GFS文件系統(tǒng),oracle提供的OCFS2文件系統(tǒng)等。
從整個(gè)LVS結(jié)構(gòu)可以看出,Director Server是整個(gè)LVS的核心,目前,用于Director Server的操作系統(tǒng)只能是Linux和FreeBSD,linux2.6內(nèi)核不用任何設(shè)置就可以支持LVS功能,而FreeBSD作為 Director Server的應(yīng)用還不是很多,性能也不是很好。對(duì)于Real Server,幾乎可以是所有的系統(tǒng)平臺(tái),Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
LVS 的IP負(fù)載均衡技術(shù)是通過(guò)IPVS模塊來(lái)實(shí)現(xiàn)的,IPVS是LVS集群系統(tǒng)的核心軟件,它的主要作用是:安裝在Director Server上,同時(shí)在Director Server上虛擬出一個(gè)IP地址,用戶必須通過(guò)這個(gè)虛擬的IP地址訪問(wèn)服務(wù)。這個(gè)虛擬IP一般稱為L(zhǎng)VS的VIP,即Virtual IP。訪問(wèn)的請(qǐng)求首先經(jīng)過(guò)VIP到達(dá)負(fù)載調(diào)度器,然后由負(fù)載調(diào)度器從Real Server列表中選取一個(gè)服務(wù)節(jié)點(diǎn)響應(yīng)用戶的請(qǐng)求。
當(dāng)用戶的請(qǐng)求到達(dá)負(fù)載調(diào)度器后,調(diào)度器如何將請(qǐng)求發(fā)送到提供服務(wù)的Real Server節(jié)點(diǎn),而Real Server節(jié)點(diǎn)如何返回?cái)?shù)據(jù)給用戶,是IPVS實(shí)現(xiàn)的重點(diǎn)技術(shù),IPVS實(shí)現(xiàn)負(fù)載均衡機(jī)制有三種:DR模式、NAT模式、Full-NAT模式、Tunnel模式,其中DR模式是使用最廣泛的一種。
特點(diǎn):工作在數(shù)據(jù)鏈路層,由LVS修改請(qǐng)求報(bào)文的Mac地址,由RS服務(wù)器直接返回響應(yīng)給客戶端。
這種方式是三種負(fù)載調(diào)度機(jī)制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網(wǎng)卡連在同一物理網(wǎng)段上。
特點(diǎn):工作在網(wǎng)絡(luò)層,由LVS修改請(qǐng)求報(bào)文的目標(biāo)IP地址以及響應(yīng)報(bào)文的源IP地址,必須經(jīng)LVS返回給客戶端。
NAT模式要求LVS和RS服務(wù)器必須在同一網(wǎng)段內(nèi),因此會(huì)導(dǎo)致運(yùn)維上的困難。另外因?yàn)槊看握?qǐng)求都需要經(jīng)過(guò)LVS服務(wù)器,所以LVS服務(wù)器的壓力會(huì)比較大。
特點(diǎn):工作在網(wǎng)絡(luò)層,在LVS修改請(qǐng)求報(bào)文以及響應(yīng)報(bào)文的源IP地址、目標(biāo)IP地址,必須經(jīng)LVS返回給客戶端。
Full-NAT模式是在NAT基礎(chǔ)上為了解決跨子網(wǎng)問(wèn)題而誕生的,其通過(guò)在網(wǎng)絡(luò)層修改源IP地址和目標(biāo)IP地址來(lái)達(dá)到不同子網(wǎng)的通信。
特點(diǎn):工作在網(wǎng)絡(luò)層,在原有IP報(bào)文外多封裝一層IP報(bào)文,由RS服務(wù)器直接返回響應(yīng)給客戶端。
工作模式 | 所處OSI層級(jí) | 模式特點(diǎn) | 缺陷 |
---|---|---|---|
DR模式 | 數(shù)據(jù)鏈路層 | 由LVS修改請(qǐng)求報(bào)文的Mac地址,由RS服務(wù)器直接返回響應(yīng)給客戶端 | LVS服務(wù)器和RS服務(wù)器必須要在同一級(jí)房 |
NAT模式 | 網(wǎng)絡(luò)層 | 由LVS修改請(qǐng)求報(bào)文的目標(biāo)IP地址以及響應(yīng)報(bào)文的源IP地址,必須經(jīng)LVS返回給客戶端 | LVS和RS服務(wù)器必須在同一網(wǎng)段內(nèi) |
Full-NAT模式 | 網(wǎng)絡(luò)層 | 在LVS修改請(qǐng)求報(bào)文以及響應(yīng)報(bào)文的源IP地址、目標(biāo)IP地址,必須經(jīng)LVS返回給客戶端 | - |
Tunnel模式 | 網(wǎng)絡(luò)層 | 在原有IP報(bào)文外多封裝一層IP報(bào)文,由RS服務(wù)器直接返回響應(yīng)給客戶端 | - |
其實(shí)與LVS相似的流量轉(zhuǎn)發(fā)方案還有HAProxy。LVS與HAProxy都適合用來(lái)放在負(fù)載均衡的最前端,用于海量流量轉(zhuǎn)發(fā)。在高可用支持上,他們都有對(duì)應(yīng)的高可用方案,LVS與KeepAlive結(jié)合實(shí)現(xiàn)高可用,而HAProxy與heartbeat實(shí)現(xiàn)高可用。在配置難度上,LVS配置比較復(fù)雜,而HAProxy相對(duì)簡(jiǎn)單。在系統(tǒng)支持上,Linux系統(tǒng)對(duì)LVS有內(nèi)核級(jí)別的支持,而HAProxy則沒(méi)有。在性能上,LVS因?yàn)橛邢到y(tǒng)內(nèi)核級(jí)別的支持,所以其可以實(shí)現(xiàn)響應(yīng)數(shù)據(jù)包不經(jīng)過(guò)LVS,而HAProxy的響應(yīng)數(shù)據(jù)包則必須經(jīng)過(guò)HAProxy,這就導(dǎo)致了HAProxy的壓力會(huì)比較大,也就是HAProxy性能沒(méi)有LVS好。
當(dāng)請(qǐng)求經(jīng)過(guò)LVS服務(wù)器轉(zhuǎn)發(fā)到達(dá)Nginx服務(wù)器后,Nginx會(huì)根據(jù)其負(fù)載配置文件將請(qǐng)求轉(zhuǎn)發(fā)到具體的應(yīng)用服務(wù)器進(jìn)行處理。
與Nginx相似的軟件還有apche、squid、lighttpd等負(fù)載均衡軟件,但apache和squid屬于同步模式的反向代理,在大文件的傳輸上會(huì)出現(xiàn)阻塞,導(dǎo)致后端服務(wù)器連接數(shù)過(guò)多,最終導(dǎo)致服務(wù)器壓力過(guò)大。而Nginx和lighttpd則是使用異步模式的反向代理,代理在接受完數(shù)據(jù)之前不會(huì)與后端服務(wù)器建立連接,這樣就避免了對(duì)后端服務(wù)器造成過(guò)大壓力。
舉個(gè)例子:當(dāng)用戶上傳一個(gè)100M大的文件時(shí),如果用戶網(wǎng)速慢,需要半個(gè)小時(shí)才能上傳完。如果采用apache、squid這種同步模式的反向代理,那么在接收過(guò)程中代理不僅會(huì)與客戶端建立連接,還會(huì)有后臺(tái)服務(wù)器建立連接。如果上傳大文件的用戶一多,那么后端服務(wù)器的壓力就很大。而且因?yàn)閺V域網(wǎng)(WAN)和局域網(wǎng)(LAN)的傳輸速度差別很大,因此同步方式的反向代理會(huì)造成連接資源的浪費(fèi)。而nginx和lighttpd異步模式的反向代理則是等代理完全接收完數(shù)據(jù)之后,才與后端服務(wù)器建立連接,這樣就大大減少了后端的服務(wù)器的壓力。
而nginx和lighttpd的異步模式也略有不同,lighttpd是先收完再轉(zhuǎn)向客戶瀏覽器,而nginx是邊收數(shù)據(jù)邊轉(zhuǎn)向用戶瀏覽器。因此nginx的異步代理模型可以更好地提供高性能的負(fù)載均衡,所以現(xiàn)在nginx也是許多企業(yè)級(jí)網(wǎng)站的首選。
軟件名稱 | 代理特性 | 工作細(xì)節(jié) |
---|---|---|
apache、squid | 同步模式 | 在與客戶端連接的同時(shí),也與后端的服務(wù)器建立連接 |
lighttpd | 異步模式 | 等待客戶端傳輸完成才與后端服務(wù)器建立連接,同時(shí)不會(huì)返回?cái)?shù)據(jù)給客戶端 |
nginx | 異步模式 | 等待客戶端傳輸完成才與后端服務(wù)器建立連接,同時(shí)會(huì)返回?cái)?shù)據(jù)給客戶端 |
既然LVS和Nginx都能實(shí)現(xiàn)負(fù)載均衡,那為什么要將Nginx作為L(zhǎng)VS后端機(jī)器,而不是LVS作為Nginx的后端機(jī)器,他們之間到底有什么區(qū)別呢?
LVS設(shè)計(jì)就是用來(lái)進(jìn)行流量轉(zhuǎn)發(fā)的,功能比較單一,所以其在流量轉(zhuǎn)發(fā)上性能更高、更穩(wěn)定。LVS在流量轉(zhuǎn)發(fā)的性能基本達(dá)到了F5硬件設(shè)備的60%性能,其他幾個(gè)10%都有點(diǎn)困難。但也正是因?yàn)槠湫矢?、穩(wěn)定,所以導(dǎo)致了其功能單一,在應(yīng)用場(chǎng)景方面比較單一。而Nginx功能強(qiáng)大,支持對(duì)域名、目錄的解析,這使得其應(yīng)用場(chǎng)景廣泛。
簡(jiǎn)單地說(shuō):lvs只做簡(jiǎn)單轉(zhuǎn)發(fā),能做的事情也就很少,nginx功能全面,能滿足很多的業(yè)務(wù)場(chǎng)景。
所以我們才說(shuō)LVS更加適合做最前端的流量轉(zhuǎn)發(fā),擋住海量流量。而Nginx則適合放在應(yīng)用服務(wù)器的上層,用來(lái)針對(duì)不同的請(qǐng)求進(jìn)行目錄識(shí)別或域名識(shí)別,從而達(dá)到功能模塊的垂直分割。
聯(lián)系客服