在大規?;ヂ?lián)網(wǎng)應用中,負載均衡設備是必不可少的一個(gè)節點(diǎn),源于互聯(lián)網(wǎng)應用的高并發(fā)和大流量的沖擊壓力,我們通常會(huì )在服務(wù)端部署多個(gè)無(wú)狀態(tài)的應用服務(wù)器和若干有狀態(tài)的存儲服務(wù)器(數據庫、緩存等等)。
一、負載均衡的作用
負載均衡設備的任務(wù)就是作為應用服務(wù)器流量的入口,挑選最合適的一臺服務(wù)器,將客戶(hù)端的請求轉發(fā)給它處理,實(shí)現客戶(hù)端到真實(shí)服務(wù)端的透明轉發(fā)。最近幾年很火的「云計算」以及分布式架構,本質(zhì)上也是將后端服務(wù)器作為計算資源、存儲資源,由某臺管理服務(wù)器封裝成一個(gè)服務(wù)對外提供,客戶(hù)端不需要關(guān)心真正提供服務(wù)的是哪臺機器,在它看來(lái),就好像它面對的是一臺擁有近乎無(wú)限能力的服務(wù)器,而本質(zhì)上,真正提供服務(wù)的,是后端的集群。
一個(gè)典型的互聯(lián)網(wǎng)應用的拓撲結構是這樣的:
二、負載均衡的類(lèi)型
負載均衡可以采用硬件設備,也可以采用軟件負載。
商用硬件負載設備成本通常較高(一臺幾十萬(wàn)上百萬(wàn)很正常),所以在條件允許的情況下我們會(huì )采用軟負載,軟負載解決的兩個(gè)核心問(wèn)題是:選誰(shuí)、轉發(fā),其中最著(zhù)名的是LVS(Linux Virtual Server)。
三、軟負載——LVS
LVS是四層負載均衡,也就是說(shuō)建立在OSI模型的第四層——傳輸層之上,傳輸層上有我們熟悉的TCP/UDP,LVS支持TCP/UDP的負載均衡。
LVS的轉發(fā)主要通過(guò)修改IP地址(NAT模式,分為源地址修改SNAT和目標地址修改DNAT)、修改目標MAC(DR模式)來(lái)實(shí)現。
那么為什么LVS是在第四層做負載均衡?
首先LVS不像HAProxy等七層軟負載面向的是HTTP包,所以七層負載可以做的URL解析等工作,LVS無(wú)法完成。其次,某次用戶(hù)訪(fǎng)問(wèn)是與服務(wù)端建立連接后交換數據包實(shí)現的,如果在第三層網(wǎng)絡(luò )層做負載均衡,那么將失去「連接」的語(yǔ)義。軟負載面向的對象應該是一個(gè)已經(jīng)建立連接的用戶(hù),而不是一個(gè)孤零零的IP包。后面會(huì )看到,實(shí)際上LVS的機器代替真實(shí)的服務(wù)器與用戶(hù)通過(guò)TCP三次握手建立了連接,所以L(fǎng)VS是需要關(guān)心「連接」級別的狀態(tài)的。
LVS的工作模式主要有4種:
DR
NAT
TUNNEL
Full-NAT
這里挑選常用的DR、NAT、Full-NAT來(lái)簡(jiǎn)單介紹一下。
1、DR
請求由LVS接受,由真實(shí)提供服務(wù)的服務(wù)器(RealServer, RS)直接返回給用戶(hù),返回的時(shí)候不經(jīng)過(guò)LVS。
DR模式下需要LVS和綁定同一個(gè)VIP(RS通過(guò)將VIP綁定在loopback實(shí)現)。
一個(gè)請求過(guò)來(lái)時(shí),LVS只需要將網(wǎng)絡(luò )幀的MAC地址修改為某一臺RS的MAC,該包就會(huì )被轉發(fā)到相應的RS處理,注意此時(shí)的源IP和目標IP都沒(méi)變,LVS只是做了一下移花接木。
RS收到LVS轉發(fā)來(lái)的包,鏈路層發(fā)現MAC是自己的,到上面的網(wǎng)絡(luò )層,發(fā)現IP也是自己的,于是這個(gè)包被合法地接受,RS感知不到前面有LVS的存在。
而當RS返回響應時(shí),只要直接向源IP(即用戶(hù)的IP)返回即可,不再經(jīng)過(guò)LVS。
DR模式是性能最好的一種模式。
2、NAT
NAT(Network Address Translation)是一種外網(wǎng)和內網(wǎng)地址映射的技術(shù)。
NAT模式下,網(wǎng)絡(luò )報的進(jìn)出都要經(jīng)過(guò)LVS的處理。LVS需要作為RS的網(wǎng)關(guān)。
當包到達LVS時(shí),LVS做目標地址轉換(DNAT),將目標IP改為RS的IP。RS接收到包以后,仿佛是客戶(hù)端直接發(fā)給它的一樣。
RS處理完,返回響應時(shí),源IP是RS IP,目標IP是客戶(hù)端的IP。
這時(shí)RS的包通過(guò)網(wǎng)關(guān)(LVS)中轉,LVS會(huì )做源地址轉換(SNAT),將包的源地址改為VIP,這樣,這個(gè)包對客戶(hù)端看起來(lái)就仿佛是LVS直接返回給它的??蛻?hù)端無(wú)法感知到后端RS的存在。
3、Full-NAT
無(wú)論是DR還是NAT模式,不可避免的都有一個(gè)問(wèn)題:LVS和RS必須在同一個(gè)VLAN下,否則LVS無(wú)法作為RS的網(wǎng)關(guān)。
這引發(fā)的兩個(gè)問(wèn)題是:
1、同一個(gè)VLAN的限制導致運維不方便,跨VLAN的RS無(wú)法接入。
2、LVS的水平擴展受到制約。當RS水平擴容時(shí),總有一天其上的單點(diǎn)LVS會(huì )成為瓶頸。
Full-NAT由此而生,解決的是LVS和RS跨VLAN的問(wèn)題,而跨VLAN問(wèn)題解決后,LVS和RS不再存在VLAN上的從屬關(guān)系,可以做到多個(gè)LVS對應多個(gè)RS,解決水平擴容的問(wèn)題。
Full-NAT相比NAT的主要改進(jìn)是,在SNAT/DNAT的基礎上,加上另一種轉換,轉換過(guò)程如下:
在包從LVS轉到RS的過(guò)程中,源地址從客戶(hù)端IP被替換成了LVS的內網(wǎng)IP。
內網(wǎng)IP之間可以通過(guò)多個(gè)交換機跨VLAN通信。
當RS處理完接受到的包,返回時(shí),會(huì )將這個(gè)包返回給LVS的內網(wǎng)IP,這一步也不受限于VLAN。
LVS收到包后,在NAT模式修改源地址的基礎上,再把RS發(fā)來(lái)的包中的目標地址從LVS內網(wǎng)IP改為客戶(hù)端的IP。
Full-NAT主要的思想是把網(wǎng)關(guān)和其下機器的通信,改為了普通的網(wǎng)絡(luò )通信,從而解決了跨VLAN的問(wèn)題。采用這種方式,LVS和RS的部署在VLAN上將不再有任何限制,大大提高了運維部署的便利性。
4、Session
客戶(hù)端與服務(wù)端的通信,一次請求可能包含多個(gè)TCP包,LVS必須保證同一連接的TCP包,必須被轉發(fā)到同一臺RS,否則就亂套了。為了確保這一點(diǎn),LVS內部維護著(zhù)一個(gè)Session的Hash表,通過(guò)客戶(hù)端的某些信息可以找到應該轉發(fā)到哪一臺RS上。
5、LVS集群化
采用Full-NAT模式后,可以搭建LVS的集群,拓撲結構如下圖:
原文轉自:http://blog.hesey.net/2013/02/introduce-to-load-balance-and-lvs-briefly.html