Web基礎架構 負載均衡和LVS

2022-04-02 07:01:17 字數 3689 閱讀 4757

投遞人 itwriter

[收藏]

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

一、負載均衡的作用

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

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

二、負載均衡的型別

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

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

三、軟負載——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 來簡單介紹一下。

請求由 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 模式是效能最好的一種模式。

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 的存在。

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 上將不再有任何限制,大大提高了運維部署的便利性。

4、session

客戶端與服務端的通訊,一次請求可能包含多個 tcp 包,lvs 必須保證同一連線的 tcp 包,必須被**到同一臺 rs,否則就亂套了。為了確保這一點,lvs 內部維護著乙個 session 的 hash 表,通過客戶端的某些資訊可以找到應該**到哪一台 rs 上。

5、lvs 集群化

採用 full-nat 模式後,可以搭建 lvs 的集群,拓撲結構如下圖:

6、容災

容災分為 rs 的容災和 lvs 的容災。

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

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

容災主要是靠 keepalived 來做的。

更多參考資料:吳佳明 – lvs 在大規模網路環境下的應用 – o』reilly velocity china 2012

Web基礎架構 負載均衡和LVS

在大規模網際網路應用中,負載均衡裝置是必不可少的乙個節點,源於網際網路應用的高併發和大流量的衝擊壓力,我們通常會在服務端部署多個無狀態的應用伺服器和若干有狀態的儲存伺服器 資料庫 快取等等 一 負載均衡的作用 負載均衡裝置的任務就是作為應用伺服器流量的入口,挑選最合適的一台伺服器,將客戶端的請求 給...

Web基礎架構 負載均衡和LVS

在大規模網際網路應用中,負載均衡裝置是必不可少的乙個節點,源於網際網路應用的高併發和大流量的衝擊壓力,我們通常會在服務端部署多個無狀態的應用伺服器和若干有狀態的儲存伺服器 資料庫 快取等等 一 負載均衡的作用 負載均衡裝置的任務就是作為應用伺服器流量的入口,挑選最合適的一台伺服器,將客戶端的請求 給...

Web基礎架構 負載均衡和LVS

在大規模網際網路應用中,負載均衡裝置是必不可少的乙個節點,源於網際網路應用的高併發和大流量的衝擊壓力,我們通常會在服務端部署多個無狀態的應用伺服器和若干有狀態的儲存伺服器 資料庫 快取等等 負載均衡裝置的任務就是作為應用伺服器流量的入口,首先挑選最合適的一台伺服器,然後將客戶端的請求 給這台伺服器處...