LB(負載均衡)叢集之LVS詳解
LB:Load Balancing:負載均衡叢集
- 負載均衡叢集中有一個分發器或者叫排程器,我們將其稱之為Director,它處在多臺伺服器的上面,分發器根據內部鎖定義的規則或排程方式從下面的伺服器群中選擇一個以此來響應客戶端傳送的請求。
LB 分類:
1、硬體LB(比較出名的)
F5 公司的 BIG-IP系列
Citrix 公司的 NetScaler系列
A10 公司的 AX系列
2、軟體LB
四層:LVS(Linux Virtual Server)注:國人開發的
七層:Nginx,HAProxy
LVS定義
- 一般來說,LVS採用三層結構:負載排程器、伺服器池、共享儲存。
- 工作在TCP/IP協議的四層,其轉發是依賴於四層協議的特徵進行轉發的,由於其轉發要依賴於協議的特徵進行轉發,因此需要在核心的TCP/IP協議棧進行過濾篩選。
- 可想而知,這就需要在核心的模組來完成,而這樣的過濾轉發規則又是由管理員進行定義的。所以,LVS就是兩段式的架構設計,在核心空間中工作的是
"ipvs"
,而在使用者空間中工作的,用來定義叢集服務規則的是"ipvsadm"
。這就很容易想到iptables而LVS正好工作在iptables的input鏈上。
LVS組成
ipvsadm:用於管理叢集服務的命令列工具,工作於Linux系統中的使用者空間。
ipvs:為lvs提供服務的核心模組,工作於核心空間 (相對於是框架,通過ipvsadm新增規則,來實現ipvs功能)。
注:在linux核心2.4.23之前的核心中模組預設是不存在的,需要自己手動打補丁,然後把此模組編譯進核心才可以使用此功能。
LVS中每個主機IP地址的定義
VIP:Director用來向客戶端提供服務的IP地址,也是DNS解析的IP。
RIP:叢集節點(後臺真正提供服務的伺服器)所使用的IP地址。
DIP:Director用來和RIP進行互動的IP地址。
CIP:公網IP,客戶端使用的IP。
LVS的三種轉發模式
LVS-NAT:網路地址轉換 Network address translation。
LVS-DR:直接路由 Direct routing。
LVS-TUN:IP隧道 IP tunneling。
LVS的三種轉發模式特點
NAT:
- 叢集節點跟director必須在同一個網段上面
- RIP通常是私有地址,僅用於個叢集
- 支援口對映
- real sever可以使用任意OS(作業系統)
- 較大規模應用場景中director已成為系統瓶頸
DR:
- 叢集節點跟director必須在同一個物理網路中
- RIP可以使用公網地址.實現便捷的遠端控制伺服器
- director只負責處理入站請求,相應報文則有realserver直接發往客戶端
- real server不能將閘道器指向DIP
- director不支援埠對映
- 大多數作業系統都能應用在real server上
- DR比NAT能處理更多的real server
TUN:
- 各叢集節點可以跨越不同的網路
- RIP必須是公網地址
- director只負責處理入站請求,相應報文則有realserver直接發往客戶端
- real server網管不能指向director
- 只有支援隧道共跟那個的os才能使用者real server
- 不支援埠對映
注:在實際應用中用的不多。
LVS的排程演算法
靜態排程演算法(4種):
1、rr : round robin :輪叫,輪詢
說明:輪詢排程演算法的原理是每一次把來自使用者的請求輪流分配給內部中的伺服器,從1開始,直到N(內部伺服器個數),然後重新開始迴圈。演算法的優點是其簡潔性,它無需記錄當前所有連線的狀態,所以它是一種無狀態排程。缺點:是不考慮每臺伺服器的處理能力。
2、wrr: weight round robin :加權輪詢(以權重之間的比例實現在各主機之間進行排程)
說明:由於每臺伺服器的配置、安裝的業務應用等不同,其處理能力會不一樣。所以,我們根據伺服器的不同處理能力,給每個伺服器分配不同的權值,使其能夠接受相應權值數的服務請求。
3、sh : source hashing : 源地址hash 實現會話繫結session affinity
說明:簡單的說就是有將同一客戶端的請求發給同一個real server,源地址雜湊排程演算法正好與目標地址雜湊排程演算法相反,它根據請求的源IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的並且沒有超負荷,將請求傳送到該伺服器,否則返回空。它採用的雜湊函式與目標地址雜湊排程演算法的相同。它的演算法流程與目標地址雜湊排程演算法的基本相似,除了將請求的目標IP地址換成請求的源IP地址。
4、dh : destination hashing : 目標地址hash
說明:將同樣的請求傳送給同一個server,一般使用者於快取伺服器說,簡單的說,LB集群后面又加了一層,在LB與real server之間加了一層快取伺服器,當一個客戶端請求一個頁面時,LB發給cache1,當第二個客戶端請求同樣的頁面時,LB還是發給cache1,這就是我們所說的,將同樣的請求發給同一個server,來提高快取的命中率。目標地址雜湊排程演算法也是針對目標IP地址的負載均衡,它是一種靜態對映演算法,通過一個雜湊(Hash)函式將一個目標IP地址對映到一臺伺服器。目標地址雜湊排程演算法先根據請求的目標IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。
動態排程演算法(6種):
1、lc :leash-connection 最少連線
說明:最少連線排程演算法是把新的連線請求分配到當前連線數最小的伺服器,最小連線排程是一種動態排程短演算法,它通過伺服器當前所活躍的連線數來估計伺服器的負載均衡,排程器需要記錄各個伺服器已建立連線的數目,當一個請求被排程到某臺伺服器,其連線數加1,當連線中止或超時,其連線數減一,在系統實現時,我們也引入當伺服器的權值為0時,表示該伺服器不可用而不被排程。此演算法忽略了伺服器的效能問題,有的伺服器效能好,有的伺服器效能差,通過加權重來區分效能,所以有了下面演算法wlc。
簡單演算法:active*256+inactive (誰的小,挑誰)
2、wlc :加權最少連線
加權最小連線排程演算法是最小連線排程的超集,各個伺服器用相應的權值表示其處理效能。伺服器的預設權值為1,系統管理員可以動態地設定伺服器的許可權,加權最小連線排程在排程新連線時儘可能使伺服器的已建立連線數和其權值成比例。由於伺服器的效能不同,我們給效能相對好的伺服器,加大權重,即會接收到更多的請求。
簡單演算法:(active*256+inactive)/weight(誰的小,挑誰)
3、sed :最少期望延遲
說明:不考慮非活動連線,誰的權重大,我們優先選擇權重大的伺服器來接收請求,但會出現問題,就是權重比較大的伺服器會很忙,但權重相對較小的伺服器很閒,甚至會接收不到請求,所以便有了下面的演算法nq。
基於wlc演算法,簡單演算法:(active+1)*256/weight (誰的小選誰)
4、nq :never queue 永不排隊
說明:在上面我們說明了,由於某臺伺服器的權重較小,比較空閒,甚至接收不到請求,而權重大的伺服器會很忙,所此演算法是sed改進,就是說不管你的權重多大都會被分配到請求。簡單說,無需佇列,如果有臺real server的連線數為0就直接分配過去,不需要在進行sed運算。
5、LBLC :基於區域性性的最少連線
說明:基於區域性性的最少連線演算法是針對請求報文的目標IP地址的負載均衡排程,主要用於Cache集群系統,因為Cache叢集中客戶請求報文的目標IP地址是變化的,這裡假設任何後端伺服器都可以處理任何請求,演算法的設計目標在伺服器的負載基本平衡的情況下,將相同的目標IP地址的請求排程到同一個臺伺服器,來提高伺服器的訪問區域性性和主存Cache命中率,從而調整整個集群系統的處理能力。
6、LBLCR :基於區域性性的帶複製功能的最少連線
說明:基於區域性性的帶複製功能的最少連線排程演算法也是針對目標IP地址的負載均衡,該演算法根據請求的目標IP地址找出該目標IP地址對應的伺服器組,按“最小連線”原則從伺服器組中選出一臺伺服器,若伺服器沒有超載,將請求傳送到該伺服器;若伺服器超載,則按“最小連線”原則從這個叢集中選出一臺伺服器,將該伺服器加入到伺服器組中,將請求傳送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,將最忙的伺服器從伺服器組中刪除,以降低複製的程度。
注:LVS預設排程演算法是 wlc 。
定義叢集服務規則的ipvsadm命令
1、管理叢集服務
新增
ipvsadm -A -t|u|f server-adddress [-s scheduler]
-t :tcp協議的叢集 service-address後面必須寫成ip:port
-u :udp協議的叢集 service-address後面必須寫成ip:port
-f :fwm 防火牆的標記 service-address後面必須寫成mark number
-s :指定除錯演算法
修改
ipvsadm -E -t|u|f server-adddress
刪除
ipvsadm -D -t|u|f server-adddress
2、管理叢集服務中的real server
新增
ipvsadm -a -t|u|f server-adddress -r server-address [-g|i|m] [-w weight]
-t|u|f service-address 實現定義好的某叢集服務
-r server-address 某rs的地址在nat模型中可使用ip:port實現埠對映
[-g|i|m] lvs型別:
-g : DR
-i : TUN
-m : NAT
[-w weight] 指定權重
修改
ipvsadm -e -t|u|f server-adddress
刪除
ipvsadm -d -t|u|f server-adddress
3、檢視
ipvsadm -L | ipvsadm -l ….
-n 顯示主機地址和埠為數字格式
–stats 顯示進出站資料
–rate 顯示速率
–timeout 顯示每一個tcp tcpfin udp 的超時時間值
–deamon 顯示程序資訊
–sort 顯示排序規則 預設是升序的
-c 顯示多少個客戶連線進來
4、刪除所有叢集服務:
清空ipvs規則
ipvsadm -C
5、儲存定義的規則:
service ipvsadm save
ipvsadm -S > /path/to/somefile
6、載入此前的規則
ipvsadm -R
ipvsadm -R < /path/to/somefile
LVS 持久連線
說明:儘管我們選擇了LVS的分發方法,但是大多時候我們要保證返回給客戶端的所有響應請求必須來自於同一臺Real Server
,這裡我們就要用到LVS Persistence(永續性)
。
1、持久連線和型別
PCC同一客戶端所有服務的請求都被重定向到同一臺Real Server上,以IP地址為準。
PPC自同一服務的請求都被重定向到同一臺Real Server上,以埠號為準。
PNMP 基於防火牆標記的持久連線,根據iptables 的規則,將對於某類服務幾個不同埠的訪問定義為一類。
2、持久連線命令
ipvsadm -A|E … -p timeout
-p timeout 持久連線時長,預設為300秒,單位是秒!
PCC 演示
- PCC是一個虛擬服務沒有埠號(或者埠號為0),以”-p” 來標識服務。
- 缺陷:定向所有服務,期望訪問不同的Real Server無法實現。
ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600
ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2
ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2
PPC 演示
例如:client—->LVS(80,22)——>RS1 client—–>LVS(23)—–>RS2
- 缺陷:期望訪問不同的埠到同一臺RS上,無法實現。
ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600
ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2
ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2
PNMP 演示
先對某一特定型別的資料包打上標記,然後再將基於某一類標記的服務送到後臺的Real Server上去,後臺的Real Server 並不識別這些標記。將持久和防火牆標記結合起來就能夠實現埠姻親功能,只要是來自某一客戶端的對某一特定服務(需要不同的埠)的訪問都定義到同一臺Real Server上去。假設這樣一種場景:一個使用者在訪問購物網站時同時使用HTTP(80)和HTTPS(443)兩種協議,我們需要將其定義到同一臺Real Server上,而其他的服務不受限制。
iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp –dport 80 -j MARK –set-mark 8
iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp –dport 443 -j MARK –set-mark 8
ipvsadm -A -f 8 -s rr -p 600
ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2
ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1
END