- 鳳凰架構(gòu):構(gòu)建可靠的大型分布式系統(tǒng)
- 周志明
- 1901字
- 2021-06-24 11:31:01
4.5.2 網(wǎng)絡(luò)層負(fù)載均衡
根據(jù)OSI七層模型,在第三層網(wǎng)絡(luò)層傳輸?shù)膯挝皇欠纸M數(shù)據(jù)包(Packet),這是一種在分組交換網(wǎng)絡(luò)(Packet Switching Network,PSN)中傳輸?shù)慕Y(jié)構(gòu)化數(shù)據(jù)單位。以IP協(xié)議為例,一個(gè)IP數(shù)據(jù)包由頭部(Header)和荷載(Payload)兩部分組成,Header的長(zhǎng)度最大為60字節(jié),其中包括20字節(jié)的固定數(shù)據(jù)和最長(zhǎng)不超過(guò)40字節(jié)的可選數(shù)據(jù)。按照IPv4標(biāo)準(zhǔn),一個(gè)典型的分組數(shù)據(jù)包的Header部分具有如表4-3所示的結(jié)構(gòu)。
表4-3 分組數(shù)據(jù)包的Header部分說(shuō)明

在本節(jié),無(wú)須過(guò)多關(guān)注表格中的其他信息,只要知道在IP分組數(shù)據(jù)包的Header中帶有源和目標(biāo)的IP地址即可。源和目標(biāo)IP地址說(shuō)明了數(shù)據(jù)是從分組交換網(wǎng)絡(luò)中哪臺(tái)機(jī)器發(fā)送到哪臺(tái)機(jī)器的,我們可以沿用與二層改寫MAC地址相似的思路,通過(guò)改變這里面的IP地址來(lái)實(shí)現(xiàn)數(shù)據(jù)包的轉(zhuǎn)發(fā)。具體有兩種常見(jiàn)的修改方式。
第一種是保持原數(shù)據(jù)包不變,新創(chuàng)建一個(gè)數(shù)據(jù)包,把原數(shù)據(jù)包的Header和Payload整體作為新數(shù)據(jù)包的Payload,并在這個(gè)新數(shù)據(jù)包的Header中寫入真實(shí)服務(wù)器的IP作為目標(biāo)地址,然后把它發(fā)送出去。經(jīng)過(guò)三層交換機(jī)的轉(zhuǎn)發(fā),真實(shí)服務(wù)器收到數(shù)據(jù)包后,必須在接收入口處設(shè)計(jì)一個(gè)針對(duì)性的拆包機(jī)制,把由負(fù)載均衡器自動(dòng)添加的那層Header扔掉,還原出原數(shù)據(jù)包來(lái)進(jìn)行使用。這樣,真實(shí)服務(wù)器就同樣拿到了一個(gè)原本不是發(fā)給它(目標(biāo)IP不是它)的數(shù)據(jù)包,達(dá)到了流量轉(zhuǎn)發(fā)的目的。當(dāng)時(shí)還沒(méi)有流行起“禁止套娃”的梗,所以設(shè)計(jì)者將這種“套娃式”的傳輸稱為“IP隧道”(IP Tunnel)傳輸,也是相當(dāng)?shù)男蜗蟆?/p>
盡管因?yàn)橐庋b新的數(shù)據(jù)包,IP隧道轉(zhuǎn)發(fā)模式的效率比直接路由模式的效率低,但由于并沒(méi)有修改原數(shù)據(jù)包中的任何信息,所以IP隧道轉(zhuǎn)發(fā)模式仍然具備三角傳輸?shù)奶匦裕簇?fù)載均衡器轉(zhuǎn)發(fā)來(lái)的請(qǐng)求,可以由真實(shí)服務(wù)器去直接應(yīng)答,無(wú)須經(jīng)過(guò)負(fù)載均衡器原路返回。而且由于IP隧道工作在網(wǎng)絡(luò)層,所以可以跨越VLAN,因此擺脫了直接路由模式中網(wǎng)絡(luò)側(cè)的約束。此模式從請(qǐng)求到響應(yīng)的過(guò)程如圖4-9所示。

圖4-9 IP隧道模式的負(fù)載均衡
當(dāng)然,這種轉(zhuǎn)發(fā)模式也有缺點(diǎn)。第一個(gè)缺點(diǎn)是它要求真實(shí)服務(wù)器必須支持“IP隧道協(xié)議”(IP Encapsulation),即它得學(xué)會(huì)自己拆包扔掉一層Header,這個(gè)其實(shí)并不是什么大問(wèn)題,現(xiàn)在幾乎所有的Linux系統(tǒng)都支持IP隧道協(xié)議。另外一個(gè)缺點(diǎn)是這種模式仍必須通過(guò)專門的配置,必須保證所有的真實(shí)服務(wù)器與負(fù)載均衡器有相同的虛擬IP地址,因?yàn)榛貜?fù)該數(shù)據(jù)包時(shí),需要使用這個(gè)虛擬IP作為響應(yīng)數(shù)據(jù)包的源地址,這樣客戶端收到這個(gè)數(shù)據(jù)包時(shí)才能正確解析。這個(gè)限制就相對(duì)麻煩一些,它與“透明”的原則沖突,需由系統(tǒng)管理員介入。
而且,對(duì)服務(wù)器進(jìn)行虛擬IP的配置并不是在任何情況下都可行的,尤其是當(dāng)幾個(gè)服務(wù)共用一臺(tái)物理服務(wù)器的時(shí)候,此時(shí)就必須考慮第二種修改方式——改變目標(biāo)數(shù)據(jù)包:直接修改數(shù)據(jù)包Header中的目標(biāo)地址,修改后原本由用戶發(fā)給負(fù)載均衡器的數(shù)據(jù)包也會(huì)被三層交換機(jī)轉(zhuǎn)發(fā)到真實(shí)服務(wù)器的網(wǎng)卡上,而且因?yàn)闆](méi)有經(jīng)過(guò)IP隧道的額外包裝,也就無(wú)須再拆包了。但問(wèn)題是這種模式是通過(guò)修改目標(biāo)IP地址才到達(dá)真實(shí)服務(wù)器的,如果真實(shí)服務(wù)器直接將應(yīng)答包返回客戶端,即這個(gè)應(yīng)答數(shù)據(jù)包的源IP是真實(shí)服務(wù)器的IP,也即均衡器修改以后的IP地址,則客戶端不可能認(rèn)識(shí)該IP,自然就無(wú)法正常處理這個(gè)應(yīng)答了。因此,只有讓應(yīng)答流量繼續(xù)回到負(fù)載均衡器,由負(fù)載均衡器把應(yīng)答包的源IP改回自己的IP,再發(fā)給客戶端,才能保證客戶端與真實(shí)服務(wù)器之間的正常通信。如果你對(duì)網(wǎng)絡(luò)知識(shí)有些了解的話,肯定會(huì)覺(jué)得這種處理似曾相識(shí),這不就是在家里、公司、學(xué)校上網(wǎng)時(shí),由一臺(tái)路由器帶著一群內(nèi)網(wǎng)機(jī)器上網(wǎng)的“網(wǎng)絡(luò)地址轉(zhuǎn)換”(Network Address Translation,NAT)操作嗎?這種負(fù)載均衡模式的確被稱為NAT模式,此時(shí),負(fù)載均衡器就相當(dāng)于家里、公司、學(xué)校的上網(wǎng)路由器。對(duì)NAT模式的負(fù)載均衡器的運(yùn)維十分簡(jiǎn)單,只要機(jī)器將自己的網(wǎng)關(guān)地址設(shè)置為均衡器地址,就無(wú)須再進(jìn)行任何額外設(shè)置了。此模式從請(qǐng)求到響應(yīng)的過(guò)程如圖4-10所示。

圖4-10 NAT模式的負(fù)載均衡
在流量壓力比較大的時(shí)候,NAT模式的負(fù)載均衡會(huì)帶來(lái)較大的性能損失,比起直接路由和IP隧道模式,甚至?xí)霈F(xiàn)數(shù)量級(jí)上的下降。這點(diǎn)是顯而易見(jiàn)的,由負(fù)載均衡器代表整個(gè)服務(wù)集群來(lái)進(jìn)行應(yīng)答,各個(gè)服務(wù)器的響應(yīng)數(shù)據(jù)都會(huì)互相爭(zhēng)搶均衡器的出口帶寬,這就與在家里用NAT上網(wǎng),若有人在下載,你打游戲可能會(huì)覺(jué)得卡頓是一個(gè)道理,此時(shí)整個(gè)系統(tǒng)的瓶頸很容易就出現(xiàn)在負(fù)載均衡器上。
還有一種更加徹底的NAT模式:即負(fù)載均衡器在轉(zhuǎn)發(fā)時(shí),不僅會(huì)修改目標(biāo)IP地址,還會(huì)修改源IP地址,這樣源地址就改成負(fù)載均衡器自己的IP,稱作Source NAT(SNAT)。這樣做的好處是真實(shí)服務(wù)器無(wú)須配置網(wǎng)關(guān)就能夠讓應(yīng)答流量經(jīng)過(guò)正常的三層路由回到負(fù)載均衡器上,做到徹底的透明。但是缺點(diǎn)是由于做了SNAT,真實(shí)服務(wù)器處理請(qǐng)求時(shí)就無(wú)法拿到客戶端的IP地址,從真實(shí)服務(wù)器的視角來(lái)看,所有的流量都來(lái)自于負(fù)載均衡器,這樣有一些需要根據(jù)目標(biāo)IP進(jìn)行控制的業(yè)務(wù)邏輯就無(wú)法進(jìn)行了。
- Containerization with LXC
- Linux內(nèi)核完全注釋(20周年版·第2版)
- 混沌工程:復(fù)雜系統(tǒng)韌性實(shí)現(xiàn)之道
- Alfresco 4 Enterprise Content Management Implementation
- Windows Server 2019 Administration Fundamentals
- 嵌入式系統(tǒng)原理及開(kāi)發(fā)
- Learning Bootstrap
- Linux內(nèi)核設(shè)計(jì)的藝術(shù):圖解Linux操作系統(tǒng)架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理
- Windows 7應(yīng)用入門與技巧
- OpenSolaris設(shè)備驅(qū)動(dòng)原理與開(kāi)發(fā)
- INSTANT Galleria Howto
- Cassandra 3.x High Availability(Second Edition)
- Hands-On GPU Programming with Python and CUDA
- Learn CUDA Programming
- Windows 7使用詳解(修訂版)