1. 負載均衡概述
負載均衡的基本思路是:在一個伺服器叢集中盡可能的平衡負載量。通常的做法是在伺服器前端設定一個負載均衡器(一般是專門的硬體裝置)。然後負載均衡器将請求的連接配接路由到最空閑的可用伺服器。下圖顯示了一個典型的大型網站負載均衡設定,其中一個負載均衡器用于HTTP流量,另一個用于MySQL通路。
負載均衡有5個常見的目的。
(1)可擴充性:負載均衡對于某些擴充政策有所幫助,例如讀寫分離時從備庫讀資料。
(2)高效性:負載均衡有助于更有效的使用資源,因為它能夠控制請求被路由到何處。
(3)可用性:一個靈活的負載均衡解決方案能夠使用時刻保持可用的伺服器。
(4)透明性:用戶端無須知道是否存在負載均衡設定,也不需要關心在負載均衡器的背後有多少機器,名字是什麼。負載均衡器給用戶端看到的隻是一個虛拟的伺服器。
(5)一緻性:如果應用是有狀态的(資料庫事務、網站會話等),那麼負載均衡器就應将相關的查詢指向同一個伺服器,以防止資料丢失。應用無須去跟蹤到底連接配接哪一個伺服器。
2. 四層/七層負載均衡
伺服器負載均衡,顧名思義就是對一組伺服器提供負載均衡業務。這一組伺服器一般來說都處于同一個區域網路絡内,并同時對外提供一組(或多組)相同(或相似)的服務。伺服器負載均衡是資料中心最常見的組網模型。
伺服器負載均衡分為四層(L4)伺服器負載均衡和七層(L7)伺服器負載均衡兩種:
L4伺服器負載均衡支援IPv4協定和IPv6協定,是基于流的伺服器負載均衡,對封包進行逐流分發,将同一條流的封包分發給同一個伺服器。L4伺服器負載均衡對基于HTTP的7層業務無法做到按内容進行分發,限制了負載均衡業務的适用範圍。依據轉發方式,L4伺服器負載均衡分為NAT方式和DR方式。
L7伺服器負載均衡隻支援IPv4協定,是基于内容的伺服器負載均衡,對封包的承載内容進行深度解析,包括HTTP協定、RTSP協定等,根據其中的内容進行逐包分發,按既定政策将連接配接導向指定的伺服器,實作了業務使用範圍更廣泛的伺服器負載均衡。L7伺服器負載均衡僅支援NAT方式。
NAT方式L4伺服器負載均衡的組網靈活,後端伺服器可以位于不同的實體位置,不同的區域網路内。NAT方式下,LB裝置分發服務請求時,進行目的IP位址轉換(目的IP位址為實服務的IP),通過路由将封包轉發給各個實服務。NAT方式L4伺服器負載均衡的典型組網如圖所示。
NAT方式L4伺服器負載均衡包括以下幾個基本元素:
LB
Device:負責分發各種服務請求到多個Server的裝置。
Server:負責響應和處理各種服務請求的伺服器。
VSIP:對外提供的虛拟IP,供使用者請求服務時使用。
Server IP:伺服器的IP位址,供LB
Device分發服務請求時使用。
用戶端将到VSIP的請求發送給伺服器群前端的負載均衡裝置,負載均衡裝置上的虛服務接收用戶端請求,依次根據持續性功能、ACL政策、排程算法,選擇真實的伺服器,再通過網絡位址轉換,用真實伺服器位址重寫請求封包的目标位址後,将請求發送給標明的真實伺服器;真實伺服器的響應封包通過負載均衡裝置時,封包的源位址被還原為虛服務的VSIP,再傳回給用戶端,完成整個負載排程過程。
NAT方式L4伺服器負載均衡的工作流程圖如圖所示。
流程簡述如下:
步驟
說明
備注
(1)
Host發送服務請求封包
源IP為Host
IP、目的IP為VSIP
(2)
Device接收到請求封包後,借助持續性功能或排程算法計算出應該将請求分發給哪台Server
-
(3)
Device使用DNAT技術分發封包
IP、目的IP為Server IP
(4)
Server接收并處理請求封包,傳回響應封包
源IP為Server
IP、目的IP為Host IP
(5)
Device接收響應封包,轉換源IP後轉發
源IP為VSIP、目的IP為Host
IP
從以上一系列的說明可以看出——在負載均衡時使用網絡位址轉換技術,NAT方式是以而得名。
組網靈活,對伺服器沒有額外要求,不需要修改伺服器配置,适用于各種組網。
相對于NAT方式,DR方式L4伺服器負載均衡中隻有用戶端的請求封包通過LB,伺服器的響應封包不經過LB,進而減少了LB的負載,有效的避免了LB成為網絡瓶頸。DR方式下,LB裝置分發服務請求時,不改變目的IP位址,而将封包的目的MAC替換為實服務的MAC後直接把封包轉發給實服務。DR方式L4伺服器負載均衡的典型組網如圖所示。
DR方式L4伺服器負載均衡包括以下幾個基本元素:
Device分發服務請求時使用。
DR方式L4伺服器負載均衡時,除了LB裝置上配置了VSIP,真實伺服器也都配置了VSIP,配置的VSIP要求不能響應ARP請求,例如在環回接口上配置VSIP。實服務除了VSIP,還需要配置一個真實IP,用于和LB通信,LB裝置和真實伺服器在同一個鍊路域内。發送給VSIP的封包,由LB分發給相應的真實伺服器,從真實伺服器傳回給用戶端的封包直接通過交換機傳回。
DR方式L4伺服器負載均衡的工作流程圖如圖所示。
General
Device收到請求後轉發給LB Device
Server上的VSIP不會響應ARP請求
Device分發封包
IP,目的IP為VSIP,目的MAC為Server的MAC位址
(6)
Device收到響應封包後,直接将封包轉發給Host
從以上一系列的說明可以看出——負載均衡裝置沒有采用傳統的轉發方式(查找路由表)來分發請求封包,而是通過修改目的MAC直接路由給伺服器,DR方式也是以而得名。
隻有單邊封包經過負載均衡裝置,負載均衡裝置負擔小,不易成為瓶頸,轉發性能更強。
L7伺服器負載均衡的典型組網如圖所示。
L7伺服器負載均衡包括以下幾個基本元素:
Service
group:實服務組是一個邏輯概念,是指依據多個伺服器的一些公共屬性,将伺服器劃分成不同的組。例如:可以按照不同的功用劃分為靜态資料存儲伺服器組和動态交換伺服器組;還可以按照不同的内容劃分為歌曲伺服器組、視訊伺服器組或圖檔伺服器組等。
用戶端首先與伺服器群前端的負載均衡裝置建立TCP連接配接,然後将到VSIP的請求發送給負載均衡裝置。負載均衡裝置上的虛服務接收用戶端請求,依次根據持續性功能、實服務組比對政策、排程算法,選擇真實的伺服器。然後,負載均衡裝置先用用戶端位址與真實伺服器建立TCP連接配接,再用真實伺服器位址重寫用戶端請求封包的目标位址,并将請求發送給真實伺服器。真實伺服器的響應封包通過負載均衡裝置時,封包的源位址被還原為虛服務的VSIP,再傳回給用戶端,完成整個負載排程過程。
L7伺服器負載均衡的工作流程圖如圖所示。
流程簡述如下:
(1)~(3)
Host發起TCP連接配接請求,與LB
Device建立TCP連接配接
TCP連接配接請求的源IP為Host
Device收到請求後,根據比對政策為該請求選擇一個合适的實服務組,再借助排程算法計算出應該将請求分發給該實服務組中的哪台Server,并緩存該請求封包
device向Server發SYN封包,序列号為Host的SYN封包序列号
(7)
Server發送SYN
ACK封包
(8)
LB device接收Server的SYN
ACK封包後,回應ACK封包
(9)
修改步驟(5)中緩存的請求封包的目的IP和TCP序列号,然後發給Server
(10)
Server發送響應封包到LB
device
(11)
device修改響應封包的源位址和TCP序列号後轉發給Host
技術特點
對封包進行深度解析擷取封包載荷中攜帶的資訊,實作按内容進行分發,拓寬了負載均衡業務的适用範圍。适用于不同的伺服器提供不同功能的組網。
3. LVS
基于LVS的伺服器叢集主要由兩部分組成,即負載排程器(Load
Balancer,簡稱LB)和真正提供服務的伺服器(Real
Server,簡稱RS)。RS對外是不可見的,使用者需要通過通路LB來獲得服務,是以LB也稱為虛拟伺服器(Virtual
Server),它對外公開的IP稱為VIP(Virtual IP)。
LB接收到使用者的請求後,會根據設定的轉發模式和負載均衡排程算法将請求轉發給RS,RS再将結果傳回給LB或使用者(傳回給誰跟轉發模式有關)。
3.1 轉發模式
LVS的轉發模式主要有三種:網絡位址轉換(NAT,Network Address
Translation)、IP隧道(TUN,IP Tunneling)和直接路由(DR,Direct Routing)。
NAT模式
網絡位址轉換技術應該都不陌生,就是将一個IP位址轉換為另一個IP位址的技術。通常當一個内部網絡中的主要要通路Internet或被Internet通路時,就需要采用NAT技術,将内部位址(10.0.0.0/255.0.0.0、172.16.0.0/255.240.0.0、192.168.0.0/255.255.0.0)轉化為在Internet上可用的外部位址。
下面是LVS采用NAT模式的部署圖:
假設一個IP為200.200.200.2的使用者來通路我們的虛拟伺服器,VIP為200.200.200.1。叢集使用的内部IP是10.10.10.0網段。那麼請求和響應的過程可以用下圖表示:
DR模式
NAT模式中,請求和響應的資料包都需要通過LB,當RS的數目過多時,LB可能成為整個叢集的新瓶頸。因為大多數Internet服務都有這樣的特點:請求封包較短而響應封包往往包含大量的資料。如果能将請求和響應分開處理,即LB隻負責排程請求而響應直接傳回給客戶,将極大地提高整個叢集的吞吐量。
DR模式的部署圖
DR模式有幾點和NAT不同:
1. 不僅LB上配置了VIP,RS上也都配置了VIP
2. LB和RS都隻需要一個真實網卡,LB的VIP配置在eth0:0上,RS的VIP配置在lo:0上
3. LB和RS上真實網卡的IP都需要是公網IP
4. LB不需要開啟路由轉發功能
5. 響應封包不經過LB
當使用者通過VIP通路叢集時,LB會收到這個請求,再按照設定的排程算法選擇一個RS,并在一個hash表中存儲這次連接配接。然後将請求封包的目的MAC位址改為所選擇的RS的MAC并轉發給它。RS收到請求後,發現封包的目的IP為VIP,而自己的lo:0上配置了這個IP,RS就處理這個請求并将響應封包直接發送給使用者。當該使用者再次發送請求時,LB就根據hash表找到對應的RS,并再次将請求轉發給它。
TUN模式
IP隧道技術是将一個IP資料報封裝成另一個IP資料報的技術,使得被封裝的資料報可以被轉發到另一個IP位址。
TUN模式與DR模式基本相同。不同的是:
1. TUN模式中,LB和RS必須支援“IP Tunneling”或者“IP
Encapsulation”協定
2. LB和RS的VIP配置在tunl0虛拟網卡上
3. LB将請求封包封裝成一個新的IP封包,新的IP包的目的IP是某一RS的IP,然後轉發給RS,RS收到封包後解封裝,取出使用者的請求封包,發現目的IP是VIP,而自己的tunl0網卡上配置了這個IP,進而處理請求并将結果直接發送給客戶。DR模式中LB修改的是目的MAC
4. LB與真實伺服器不必在同一網段,隻要路由可達即可。如果不再同一網段,不會存在arp問題
3.2 排程政策
現在LVS已實作了10種排程政策(man ipvsadm可以檢視)。
(1)輪詢排程(Round Robin,rr)
排程器通過“輪詢”排程算法将外部請求按順序輪流配置設定到叢集中的真實伺服器上,它均等地對待每一台伺服器,而不管伺服器上實際的連接配接數和系統負載。
(2)權重輪詢(Weighted Round Robin,wrr)
排程器通過“權重輪詢”排程算法根據真實伺服器的不同處理能力來排程通路請求。這樣可以保證處理能力強的伺服器能處理更多的通路流量。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。
(3)最少連結(Least Connections,lc)
排程器通過“最少連接配接”排程算法動态地将網絡請求排程到已建立的連結數最少的伺服器上。如果叢集系統的真實伺服器具有相近的系統性能,采用“最小連接配接”排程算法可以較好地均衡負載。
(4)權重最少連結(Weighted Least
Connections,wlc)
在叢集系統中的伺服器性能差異較大的情況下,排程器采用“權重最少連結”排程算法優化負載均衡性能,具有較高權值的伺服器将承受較大比例的活動連接配接負載。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。
(5)基于局部性的最少連結(Locality-Based Least
Connections,lblc)
“基于局部性的最少連結”排程算法是針對目标IP位址的負載均衡,目前主要用于Cache叢集系統。該算法根據請求的目标IP位址找出該目标IP位址最近使用的伺服器,若該伺服器是可用的且沒有超載,将請求發送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處于一半的工作負載,則用“最少連結”
的原則選出一個可用的伺服器,将請求發送到該伺服器。
(6)帶複制的基于局部性最少連結(Locality-Based Least
Connections with Replication,lblcr)
“帶複制的基于局部性最少連結”排程算法也是針對目标IP位址的負載均衡,目前主要用于Cache叢集系統。它與LBLC算法的不同之處是它要維護從一個目标IP位址到一組伺服器的映射,而LBLC算法維護從一個目标IP位址到一台伺服器的映射。該算法根據請求的目标IP位址找出該目标IP位址對應的伺服器組,按“最小連接配接”原則從伺服器組中選出一台伺服器,若伺服器沒有超載,将請求發送到該伺服器;若伺服器超載,則按“最小連接配接”原則從這個叢集中選出一台伺服器,将該伺服器加入到伺服器組中,将請求發送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,将最忙的伺服器從伺服器組中删除,以降低複制的程度。
(7)目标位址散列(Destination Hashing,dh)
“目标位址散列”排程算法根據請求的目标IP位址,作為散列鍵(Hash
Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。
(8)源位址散列(Source Hashing,sh)
“源位址散列”排程算法根據請求的源IP位址,作為散列鍵(Hash
(9)最短的期望的延遲(Shortest Expected Delay Scheduling
SED,sed)
基于wlc算法。這個必須舉例來說了
ABC三台機器分别權重123,連接配接數也分别是123。那麼如果使用WLC算法的話一個新請求進入時它可能會分給ABC中的任意一個。使用sed算法後會進行這樣一個運算
A(1+1)/1
B(1+2)/2
C(1+3)/3
根據運算結果,把連接配接交給C。
(10)最少隊列排程(Never Queue
Scheduling,nq)
如果有台real
server的連接配接數=0就直接配置設定過去,不需要在進行sed運算
參考文獻:
1. 《高性能MySQL》第11章 可擴充的MySQL
2.
《負載均衡技術白皮書》杭州華三通信技術有限公司
http://www.h3c.com.cn/Products___Technology/Technology/Dependability/Other_technology/Technology_book/200906/637219_30003_0.htm