天天看點

從一個開發的角度看負載均衡和LVS 一、負載均衡的作用 二、負載均衡的類型 三、軟負載——LVS

在大規模網際網路應用中,負載均衡裝置是必不可少的一個節點,源于網際網路應用的高并發和大流量的沖擊壓力,我們通常會在服務端部署多個無狀态的應用伺服器和若幹有狀态的存儲伺服器(資料庫、緩存等等)。

https://www.atatech.org/articles/1437#0 一、負載均衡的作用

負載均衡裝置的任務就是作為應用伺服器流量的入口,挑選最合适的一台伺服器,将用戶端的請求轉發給它處理,實作用戶端到真實服務端的透明轉發。最近幾年很火的「雲計算」以及分布式架構,本質上也是将後端伺服器作為計算資源、存儲資源,由某台管理伺服器封裝成一個服務對外提供,用戶端不需要關心真正提供服務的是哪台機器,在它看來,就好像它面對的是一台擁有近乎無限能力的伺服器,而本質上,真正提供服務的,是後端的叢集。

一個典型的網際網路應用的拓撲結構是這樣的:

https://www.atatech.org/articles/1437#1 二、負載均衡的類型

負載均衡可以采用硬體裝置,也可以采用軟體負載。

商用硬體負載裝置成本通常較高(一台幾十萬上百萬很正常),是以在條件允許的情況下我們會采用軟負載,軟負載解決的兩個核心問題是:選誰、轉發,其中最著名的是LVS(Linux Virtual Server)。

https://www.atatech.org/articles/1437#2 三、軟負載——LVS

LVS是四層負載均衡,也就是說建立在OSI模型的第四層——傳輸層之上,傳輸層上有我們熟悉的TCP/UDP,LVS支援TCP/UDP的負載均衡。

LVS的轉發主要通過修改IP位址(NAT模式,分為源位址修改SNAT和目标位址修改DNAT)、修改目标MAC(DR模式)來實作。

那麼為什麼LVS是在第四層做負載均衡?

首先LVS不像HAProxy等七層軟負載面向的是HTTP包,是以七層負載可以做的URL解析等工作,LVS無法完成。其次,某次使用者通路是與服務端建立連接配接後交換資料包實作的,如果在第三層網絡層做負載均衡,那麼将失去「連接配接」的語義。軟負載面向的對象應該是一個已經建立連接配接的使用者,而不是一個孤零零的IP包。後面會看到,實際上LVS的機器代替真實的伺服器與使用者通過TCP三向交握建立了連接配接,是以LVS是需要關心「連接配接」級别的狀态的。
LVS的工作模式主要有4種:

DR

NAT

TUNNEL

Full-NAT

這裡挑選常用的DR、NAT、Full-NAT來簡單介紹一下。

https://www.atatech.org/articles/1437#3 1、DR

請求由LVS接受,由真實提供服務的伺服器(RealServer, RS)直接傳回給使用者,傳回的時候不經過LVS。

DR模式下需要LVS和綁定同一個VIP(RS通過将VIP綁定在loopback實作)。

一個請求過來時,LVS隻需要将網絡幀的MAC位址修改為某一台RS的MAC,該包就會被轉發到相應的RS處理,注意此時的源IP和目标IP都沒變,LVS隻是做了一下移花接木。

RS收到LVS轉發來的包,鍊路層發現MAC是自己的,到上面的網絡層,發現IP也是自己的,于是這個包被合法地接受,RS感覺不到前面有LVS的存在。

而當RS傳回響應時,隻要直接向源IP(即使用者的IP)傳回即可,不再經過LVS。

DR模式是性能最好的一種模式。

https://www.atatech.org/articles/1437#4 2、NAT

NAT(Network Address Translation)是一種外網和内網位址映射的技術。

NAT模式下,網絡報的進出都要經過LVS的處理。LVS需要作為RS的網關。

當包到達LVS時,LVS做目标位址轉換(DNAT),将目标IP改為RS的IP。RS接收到包以後,仿佛是用戶端直接發給它的一樣。

RS處理完,傳回響應時,源IP是RS IP,目标IP是用戶端的IP。

這時RS的包通過網關(LVS)中轉,LVS會做源位址轉換(SNAT),将包的源位址改為VIP,這樣,這個包對用戶端看起來就仿佛是LVS直接傳回給它的。用戶端無法感覺到後端RS的存在。

https://www.atatech.org/articles/1437#5 3、Full-NAT

無論是DR還是NAT模式,不可避免的都有一個問題:LVS和RS必須在同一個VLAN下,否則LVS無法作為RS的網關。

這引發的兩個問題是:

1、同一個VLAN的限制導緻運維不友善,跨VLAN的RS無法接入。

2、LVS的水準擴充受到制約。當RS水準擴容時,總有一天其上的單點LVS會成為瓶頸。

Full-NAT由此而生,解決的是LVS和RS跨VLAN的問題,而跨VLAN問題解決後,LVS和RS不再存在VLAN上的從屬關系,可以做到多個LVS對應多個RS,解決水準擴容的問題。

Full-NAT相比NAT的主要改進是,在SNAT/DNAT的基礎上,加上另一種轉換,轉換過程如下:

在包從LVS轉到RS的過程中,源位址從用戶端IP被替換成了LVS的内網IP。

内網IP之間可以通過多個交換機跨VLAN通信。

當RS處理完接受到的包,傳回時,會将這個包傳回給LVS的内網IP,這一步也不受限于VLAN。

LVS收到包後,在NAT模式修改源位址的基礎上,再把RS發來的包中的目标位址從LVS内網IP改為用戶端的IP。

Full-NAT主要的思想是把網關和其下機器的通信,改為了普通的網絡通信,進而解決了跨VLAN的問題。采用這種方式,LVS和RS的部署在VLAN上将不再有任何限制,大大提高了運維部署的便利性。

https://www.atatech.org/articles/1437#6 4、Session

用戶端與服務端的通信,一次請求可能包含多個TCP包,LVS必須保證同一連接配接的TCP包,必須被轉發到同一台RS,否則就亂套了。為了確定這一點,LVS内部維護着一個Session的Hash表,通過用戶端的某些資訊可以找到應該轉發到哪一台RS上。

https://www.atatech.org/articles/1437#7 5、LVS叢集化

采用Full-NAT模式後,可以搭建LVS的叢集,拓撲結構如下圖:

https://www.atatech.org/articles/1437#8 6、容災

容災分為RS的容災和LVS的容災。

RS的容災可以通過LVS定期健康檢測實作,如果某台RS失去心跳,則認為其已經下線,不會在轉發到該RS上。

LVS的容災可以通過主備+心跳的方式實作。主LVS失去心跳後,備LVS可以作為熱備立即替換。

容災主要是靠KeepAlived來做的。

繼續閱讀