1.總覽
- LVS 的排程算法
- LVS 的 四種模式的實作
- 四層負載均衡和七層 的差別
2.LVS 排程算法
總共八種方法, 最腦殘暴力的就是直接平均輪叫。
-
輪叫排程
排程器通過外部請求的順序輪流的配置設定到叢集中的真實伺服器上,對每台伺服器都是均等的。但是這樣排程器不會考慮伺服器上實際的連接配接數和系統負載,導緻伺服器處理請求慢,系統負載增大。
-
權重輪叫
排程器通過一個算法根據真實伺服器的不同處理能力來配置設定通路請求,這樣可以保證伺服器的處理能力。
-
最少連接配接
排程器将通路請求自動的配置設定到已建立連接配接最少的伺服器上,如果在叢集中每台伺服器的性能差不多的話,則這種算法可以較好的均衡負載。
-
權重最少連接配接
主要用于叢集中伺服器性能差異大的情況下,排程器可以優化負載性能,具有較高權值的伺服器可以将承受較大的活動連接配接。
-
基于局部性的最少連接配接
主要是針對目标IP位址的負載均衡,将請求的目标IP位址找到離其最近的伺服器進行使用,如果伺服器不存在或者滿載的話,就會繼續尋找下一個伺服器。
-
帶複制的基于局部性的最少連接配接
主要是針對目标IP位址的負載均衡,根據請求的目标IP位址找出該位址所對應的伺服器,如果伺服器不存在或者滿載的話,就會繼續尋找下一個伺服器。當伺服器有一段時間沒有被修改,則會從最忙的伺服器組中删除。
-
目标位址散列
根據請求的目标IP位址從靜态配置設定的散清單中超出對應的伺服器,如果找到可用的伺服器且沒有滿載,則傳回空。
-
源位址散列
根據請求的源IP位址從靜态配置設定的散清單中超出對應的伺服器,如果找到可用的伺服器且沒有滿載,則傳回空。
3.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 來簡單介紹一下。
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 模式是性能最好的一種模式。
3.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 的存在。
3.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.四層負載均衡和七層 的差別
4.1. 四層負責均衡:
是通過封包中的目标位址和端口,再加上負載均衡裝置設定的伺服器選擇方式,決定最終選擇的内部伺服器與請求用戶端建立TCP連接配接,然後發送Client請求的資料。
由上圖可知:在四層負載裝置中,把client發送的封包目标位址(原來是負載均衡裝置的IP位址),根據均衡裝置設定的選擇web伺服器的規則選擇對應的web伺服器IP位址,這樣client就可以直接跟此伺服器建立TCP連接配接并發送資料。
4.2. 七層負載均衡裝置
也稱内容交換,也就是主要通過封包中的真正有意義的應用層内容,再加上負載均衡裝置設定的伺服器選擇方式,決定最終選擇的伺服器。
由上圖可知,其實七層負載均衡伺服器起了一個代理伺服器的作用,我們知道建立一次TCP連接配接要三次握手;而client要通路webserver要先與七層負載裝置進行三次握手後建立TCP連接配接,把要通路的封包資訊發送給七層負載均衡;然後七層負載均衡再根據設定的均衡規則選擇特定的webserver,然後通過三次握手與此台webserver建立TCP連接配接,然後webserver把需要的資料發送給七層負載均衡裝置,負載均衡裝置再把資料發送給client;是以,七層負載均衡裝置起到了代理伺服器的作用。
4.3. 七層的負責均衡裝置的優點:
(1) 使整個網絡更“智能化”,能把對圖檔類的請求轉發到圖檔伺服器,對文字的請求轉發到文字伺服器
(2) 可以有效防止 SYN Flood攻擊,是網站更安全
4.4. 七層負載均衡裝置的缺點:
因為七層負載均衡裝置其實是一個代理伺服器,則對此裝置的要求也很高。