1. 程式人生 > >Lvs四層負載均衡和排程演算法

Lvs四層負載均衡和排程演算法

lvs四層負載均衡

nat模式
後端伺服器支援數量10-20臺
使用最少兩個網段
可以說是3層負載均衡

dr模式
後端伺服器支援數量100+臺
使用一個網段
可以說是2層負載均衡

隧道模式
後端伺服器支援數量100左右
異地負載均衡 realserver必須使用公網Ip,還得需要伺服器支援ip隧道協議

full-nat

↓↑↵→←↔

nat:資料流向從client-->dr--->rs rs-->dr--->client
client cip
↑↓
↑↓------->vip
dr
↑↓------->dip
-------------
↑↓ ↓
rs1 rs2----->rip

dr模式:流量從client-->dr-->rs rs-->client



→→→→→→ client cip 23
↑ ↓
↑ ↓------->vip 30
dr


↑ ↓------->dip 20
↑ +----------+
←←←←↓ ↓
rs1 rs2----->rip
21 22
設定vip30/32 設定vip30/32

路由資料包:源Ip不會發生變化 目標IP發生變化
源和目標MAC都會發生變化

23--->30
30--->23

1.來回資料包不一致
1)在rs的lo網絡卡設定vip/32
2)在rs上拒絕arp迴應
3)設定讓更好的IP迴應資料包

2.在同一臺機器上出現兩塊同一網段的網絡卡,資料包出去的時候,誰的路由條目在上面,就走哪塊網絡卡

dr --- rs
s ip 23
d ip 30

s ip 30
d ip 23

信 要發給小明

#ipvsadm -A -t vip:80 -s rr
#ipvsadm -a -t vim:80 -r rip1:80 -g
#ipvsadm -a -t vim:80 -r rip2:80 -g

#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

dr模式問題:
arp廣播
1.9 ping 192.168.1.8

1. 客戶端要找vip訪問80埠,因為是在同一個網段,所以發arp廣播找vip的mac地址通訊
2. 因為有rs上也有vip,我們不能直接讓rs上的vip迴應客戶端的廣播,所以設定檔案arp_ignore的內容為1
1的意思是如果發來的廣播包裡面目標地址不是我的“進口地址”-->也就是“eth0”(對應的是非進口地址本地迴環介面lo),那我就不迴應這個arp廣播)。
3. 當dr的vip收到這個廣播之後,迴應mac地址,然後得到客戶端發來的80埠請求,再通過lvs分發到一個rs
4. 那麼dr如何分發到一個rs?
dip發出arp廣播詢問rs的ip地址所對應的mac地址,然後發出一個目標ip為rs_vip,目標mac為rs_eth0_mac的包到rs
5. 這個rs必須要使用他lo設定的vip把迴應包發出去(這樣client收到之後一看源地址是vip,他就會相信這是正確的地址發來的包)
6. 那麼怎樣讓rs使用lo的vip而不使用eth0?
設定arp_announce檔案的內容為2, 2的意思是使用本機最好的本地IP地址把迴應包發出去
7. 最後怎麼算是最好的本地IP地址?
同一個網段下,使用可變長度子網掩碼最長的IP地址被認為是好IP,因為他更精確

dr模式


資料鏈路層負載均衡
顧名思義,資料鏈路層負載均衡是指在通訊協議的資料鏈路層修改mac地址進行負載均衡。
這種資料傳輸方式又稱作三角傳輸模式,負載均衡資料分發過程中不修改IP地址,只修改目的mac地址,通過配置真實物理伺服器叢集所有機器虛擬IP和負載均衡伺服器IP地址一致,從而達到不修改資料包的源地址和目的地址就可以進行資料分發的目的,由於實際處理請求的真實物理伺服器IP和資料請求目的IP一致,不需要通過負載均衡伺服器進行地址轉換,可將相應資料包直接返回給使用者瀏覽器,避免負載均衡伺服器網絡卡頻寬成為瓶頸。這種負載均衡方式又稱作直接路由方式(DR)。

使用三角傳輸模式的鏈路層負載均衡時目前大型網站使用最廣的一種負載均衡手段。在linux平臺上最好的鏈路層負載均衡開源產品是LVS(linux virtual server)

3臺機器
10.0.0.20 dr1 負載均衡器
10.0.0.21 rs1 web1
10.0.0.22 rs2 web2

1.兩個rs上部署web服務
#yum install nginx -y
修改主機內容
啟動服務:
#systemctl start nginx

2. 給兩個web伺服器的lo網絡卡設定子網掩碼為32位vip
rs1:
# ifconfig lo:0 10.0.0.30/32
rs2:
# ifconfig lo:0 10.0.0.30/32

3.給兩個web伺服器設定核心引數
為了讓vip發包出去
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

忽略arp響應
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

4.保證dr這臺機器資料包是從dip發出去的
如何判斷:兩塊網絡卡
誰的路由條目在上面,誰就是dip,另一個就是vip

5.在dr上設定lvs路由條目
# yum install ipvsadm -y
# ipvsadm -A -t 10.0.0.30:80 -s rr
# ipvsadm -a -t 10.0.0.30:80 -r 10.0.0.21:80 -g
# ipvsadm -a -t 10.0.0.30:80 -r 10.0.0.22:80 -g



-A 新增virtual server
-t 指定使用tcp協議
-s 指定排程策略為rr
-a 新增realserver
-r 指定realserver是誰


讓配置永久生效:
# ipvsadm-save > /etc/sysconfig/ipvsadm
# systemctl enable ipvsadm


命令選項解釋:

-A --add-service 在核心的虛擬伺服器表中新增一條新的虛擬伺服器記錄。也就是增加一臺新的虛擬伺服器。
-E --edit-service 編輯核心虛擬伺服器表中的一條虛擬伺服器記錄。
-D --delete-service 刪除核心虛擬伺服器表中的一條虛擬伺服器記錄。
-C --clear 清除核心虛擬伺服器表中的所有記錄。
-R --restore 恢復虛擬伺服器規則
-S --save 儲存虛擬伺服器規則,輸出為-R 選項可讀的格式
-a --add-server 在核心虛擬伺服器表的一條記錄裡新增一條新的真實伺服器記錄。也就是在一個虛擬伺服器中增加一臺新的真實伺服器
-e --edit-server 編輯一條虛擬伺服器記錄中的某條真實伺服器記錄
-d --delete-server 刪除一條虛擬伺服器記錄中的某條真實伺服器記錄
-L|-l --list 顯示核心虛擬伺服器表
-Z --zero 虛擬服務表計數器清零(清空當前的連線數量等)
--set tcp tcpfin udp 設定連線超時值
--start-daemon 啟動同步守護程序。他後面可以是master 或backup,用來說明LVS Router 是master 或是backup。在這個功能上也可以採用keepalived 的VRRP 功能。
--stop-daemon 停止同步守護程序
-h --help 顯示幫助資訊
-p --persistent [timeout] 持久穩固的服務(永續性連線)。這個選項的意思是來自同一個客戶的多次請求,將被同一臺真實的伺服器處理。timeout 的預設值為300 秒。
-t --tcp-service service-address 說明虛擬伺服器提供的是tcp 的服務[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark 說明是經過iptables 標記過的服務型別。
-u --udp-service service-address 說明虛擬伺服器提供的是udp 的服務[vip:port] or [real-server-ip:port]

-s --scheduler scheduler 使用的排程演算法,有這樣幾個選項 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,預設的排程演算法是: wlc.

-M --netmask netmask persistent granularity mask
-r --real-server server-address 真實的伺服器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式為直接路由模式(也是LVS 預設的模式)
-i --ipip 指定LVS 的工作模式為隧道模式
-m --masquerading 指定LVS 的工作模式為NAT 模式
-w --weight weight 真實伺服器的權值
--mcast-interface interface 指定組播的同步介面
-c --connection 顯示LVS 目前的連線 如:ipvsadm -L -c
--timeout 顯示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemotcpdump -i ens33 tcp and port 80 -v -nnn 顯示同步守護程序狀態
--stats 顯示統計資訊
--rate 顯示速率資訊
--sort 對虛擬伺服器和真實伺服器排序輸出
-n --numeric 輸出IP地址和埠的數字形式

抓包:
#tcpdump -i ens33 tcp and port 80 -v -nn
-i 指定網絡卡
tcp 抓tcp協議的資料包
port 指定要抓哪個埠的包
-v 顯示詳細資訊
-nn 以數字的形式顯示ip和埠


--------------------
檢視
#ip a
#ip a l dev ens33
新增IP:
# ip a a 192.168.1.8/24 dev ens33
刪除IP:
# ip a d 192.168.1.8/24 dev ens33

#ifconfig
#ifconfig ens33
#ifconfig ens33 192.168.1.8

#ifconfig ens33:0 192.168.1.9
 

LVS排程演算法

=================================================================================
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集群系統,因為在Cache叢集中客戶請求報文的目標IP地址是變化的。該演算法根據請求的目標IP地址找出該目標IP地址最近使用的伺服器,若該伺服器是可用的且沒有超載,將請求傳送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處於一半的工作負載,則用“最少連結” 的原則選出一個可用的伺服器,將請求傳送到該伺服器。


A B C D E A1 B1 C1 D1 E1 A2 B2 C2 D2 E2
1
2
3

6. 帶複製的基於區域性性最少連結(Locality-Based Least Connections with Replication)(LBLCR)
“帶複製的基於區域性性最少連結”排程演算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。它與LBLC演算法的不同之處是它要維護從一個目標
IP地址到一組伺服器的對映,而LBLC演算法維護從一個目標IP地址到一臺伺服器的對映。該演算法根據請求的目標IP地址找出該目標IP地址對應的伺服器組,按
“最小連線”原則從伺服器組中選出一臺伺服器,若伺服器沒有超載,將請求傳送到該伺服器;若伺服器超載,則按“最小連線”原則從這個叢集中選出一臺
伺服器,將該伺服器加入到伺服器組中,將請求傳送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,將最忙的伺服器從伺服器組中刪除,以降低復
制的程度。

7. 最短的期望的延遲(Shortest Expected Delay Scheduling SED)(SED)
基於wlc演算法。這個必須舉例來說了

A B C
1 2 3
1 2 3



ABC三臺機器分別權重123 ,連線數也分別是123。那麼如果使用WLC演算法的話一個新請求進入時它可能會分給ABC中的任意一個。使用sed演算法後會進行這樣一個運算
A(1+1)/1
B(1+2)/2
C(1+3)/3
根據運算結果,把連線交給C。
注:前面的1是給所有連線數加1,後面的除數是權重
我本來負載就小,所以才連線數少,假如我這點負載再新增一個連線,我可能就掛了,但是你負載高的再新增1個連線,掛的可能小就比較小

8.最少佇列排程(Never Queue Scheduling NQ)(NQ)
無需佇列。如果有臺 realserver的連線數=0就直接分配過去,不需要在進行sed運算

9. 目標地址雜湊(Destination Hashing)(DH) 特點是查詢速度快
“目標地址雜湊”排程演算法根據請求的目標IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。

10. 源地址雜湊(Source Hashing)(SH)
“源地址雜湊”排程演算法根據請求的源IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。
=================================================================================
外翻:
目標地址雜湊排程(Destination Hashing Scheduling)演算法
是針對目標IP地址的負載均衡,但它是一種靜態對映演算法,通過一個雜湊(Hash)函式將一個目標IP地址對映到一臺伺服器。
目標地址雜湊排程演算法先根據請求的目標IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。該演算法的流程如下:
目標地址雜湊排程演算法流程

假設有一組伺服器S = {S0, S1, ..., Sn-1},W(Si)表示伺服器Si的權值,
C(Si)表示伺服器Si的當前連線數。ServerNode[]是一個有256個桶(Bucket)的
Hash表,一般來說伺服器的數目會小於256,當然表的大小也是可以調整的。
演算法的初始化是將所有伺服器順序、迴圈地放置到ServerNode表中。若伺服器的
連線數目大於2倍的權值,則表示伺服器已超載。

n = ServerNode[hashkey(dest_ip)];
if ((n is dead) OR
(W(n) == 0) OR
(C(n) > 2*W(n))) then
return NULL;
return n;
在實現時,我們採用素數乘法Hash函式,通過乘以素數使得雜湊鍵值儘可能地達到較均勻的分佈。所採用的素數乘法Hash函式如下:
素數乘法Hash函式

static inline unsigned hashkey(unsigned int dest_ip)
{
return (dest_ip* 2654435761UL) & HASH_TAB_MASK;
}
其中,2654435761UL是2到2^32 (4294967296)間接近於黃金分割的素數,
(sqrt(5) - 1) / 2 = 0.618033989
2654435761 / 4294967296 = 0.618033987


源地址雜湊排程(Source Hashing Scheduling)演算法正好與目標地址雜湊排程演算法相反,它根據請求的源IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。它採用的雜湊函式與目標地址雜湊排程演算法 的相同。它的演算法流程與目標地址雜湊排程演算法的基本相似,除了將請求的目標IP地址換成請求的源IP地址,所以這裡不一一敘述。
在實際應用中,源地址雜湊排程和目標地址雜湊排程可以結合使用在防火牆叢集中,它們可以保證整個系統的唯一出入口。

=====================================
散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。給定表M,存在函式f(key),對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的地址,則稱表M為雜湊(Hash)表,函式f(key)為雜湊(Hash) 函式。