LVS-NAT負載均衡(一)

LVS簡介:LVS(Linux Virtual Server)由中國的章文嵩博士開發,他就任於阿里巴巴集團。html

一、抗負載能力強。抗負載能力強、性能高,能達到F5硬件的60%;對內存和cpu資源消耗比較低前端

二、工做在網絡4層(傳輸層),經過vrrp協議轉發(僅做分發之用),具體的流量由linux內核處理,所以沒有流量的產生。node

三、穩定性、可靠性好,自身有完美的熱備方案;(如:LVS+Keepalived)linux

四、應用範圍比較廣,能夠對全部應用作負載均衡;由於他是經過修改網絡數據包中的端口號、IP地址來實現負載均衡的,跟上層應用無直接關係。nginx

五、不支持正則處理,不能作動靜分離。(只有應用層(即七層)的負載均衡才支持正則處理)web

六、支持負載均衡算法:rr(輪循、輪詢)、wrr(帶權輪循)、lc(最小鏈接)、wlc(權重最小鏈接)算法

七、配置複雜,對網絡依賴比較大,穩定性很高。(這裏說的配置複雜是跟nginx的負載均衡來作對比)後端

八、LVS是經過修改數據包中的端口號、IP地址、MAC地址來實現負載均衡。bash


LVS的相關術語:服務器

LVS的管理工具和內核模塊 ipvsadm/ipvs

ipvsadm:用戶空間的命令行工具,用於管理集羣服務及集羣服務上的RS等

ipvs:工做於內核上的netfilter INPUT鉤子之上的程序,可根據用戶定義的集羣實現請求轉發

DS:調度服務器,指的是前端負載均衡器節點(Directo Server)

RS:後端真實服務器(Real server)

CIP:客戶端的IP地址(client IP)

VIP:虛擬IP即用戶請求的目標IP地址(Virtual IP)

RIP:後端真實服務器IP地址(Real server IP)

DIP:調度服務器IP地址,即內網IP(Directo server IP)

IPVS:IP虛擬服務(IP Virtual service)


LVS-NAT的工做過程:

client(客戶機) --> DS(調度服務器) --> 內核空間(首先是preruoting鏈收到數據,對比IP後) --> input鏈(覈對由IP虛擬服務定義的集羣信息,若是是則將目標IP改爲後端服務器的IP) --> postrouting鏈(由IP尋址路由選擇根據RIP) --> RS(後端服務器)

LVS工做圖.png

解釋:

1. 當用戶向負載均衡調度器發起請求,調度器將請求發往至linux的內核(kernel)空間。

2. PREROUTING鏈首先會接收到用戶請求,判斷目標IP肯定是本機IP,將數據包發往INPUT鏈。

3. IPVS(ip  virtual  service)是工做在INPUT鏈上的,當用戶請求到達INPUT時,IPVS會將用戶請求和本身已定義好的集羣服務(即LVS上用ipvsadm命令定義的負載均衡列表)進行比對,若是用戶請求的就是定義的集羣服務,那麼此時IPVS會強行修改數據包裏的目標IP地址及端口,並將新的數據包發往POSTROUTING鏈(路由後)。

4. POSTROUTING連接收數據包後發現目標IP地址恰好是本身的後端服務器,那麼此時經過選路(即路由選擇),將數據包最終發送給後端的真實服務器。


實戰一:LVS/NAT 實現四層負載均衡

實驗環境:

將VMware調成NAT模式,準備三臺服務器,一臺作LVS的負載均衡器(由於LVS-server上須要設置DIP和VIP,因此須要兩塊網卡),另外兩臺爲web服務器。

192.168.11.132LVS

192.168.11.133web1

192.168.11.134web2

清空防火牆策略,關閉selinux

iptables -F (或者systemctl stop firewalld.service) && setenforce 0


1.更改主機名和/etc/hosts文件(選作):

hostnamectl --static set-hostname LVS

hostnamectl --static set-hostname web1

hostnamectl --static set-hostname web2

bash

cat /etc/hosts

192.168.11.132   LVS-server.com            LVS

192.168.11.133   web1.tianbin.com        web1

192.168.11.134   web2.tianbin.com        web2


1.在兩臺web服務器上安裝httpd,而且寫入不一樣的頁面,而後啓動httpd並設置開機自啓,測試。

web一、2:yum -y install httpd 

web1:echo node1.com > /var/www/html/index.html

web2:echo node2.com > /var/www/html/index.html

web一、2:systemctl enable httpd --now

curl 192.168.11.133/134


2.在LVS上開啓路由轉發功能,而且作VIP的新網卡:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

#在虛擬機上添加一塊新網卡,使用NAT模式。

yum -y install net-tools NetworkManager > /dev/null && systemctl start NetworkManager-dispatcher.service

nmcli connection#查看UUID,如下是查詢結果。

NAME                UUID                                  TYPE      DEVICE

eth0                099d988e-ab29-492c-933f-b3f73178f144  ethernet  eth0

eth1                ae146a73-de8b-47b6-8950-0dad86471114  ethernet  eth1


route -n #查看路由信息,主要看網關信息。如下是查詢結果

Kernel IP routing table

Destination     Gateway         Genmask            Flags   Metric Ref    Use Iface

0.0.0.0              192.168.11.2    0.0.0.0              UG      100       0       0 eth0

0.0.0.0              172.16.0.2        0.0.0.0              UG      101       0       0 eth1

172.16.0.0        0.0.0.0              255.255.0.0      U        101       0       0 eth1

192.168.11.0    0.0.0.0              255.255.255.0  U        100       0       0 eth0

route del default gw 192.168.11.2 #臨時刪除網關或者更改網卡的配置文件來刪除網關。推薦改配置文件,改前先備份。

cd /etc/sysconfig/network-scripts#備份並修改網卡配置文件,如圖:

cp -av ifcfg-eth0{,.bak}


eth0.bak.png        ============>eth0.png


cp -av ifcfg-eth0 ifcfg-eth1#生成新網卡的配置文件,將網卡模式改成NAT模式,而且進行的修改以下:


eth1.png



#如上圖對web1,2的網卡信息進行修改,再將的網關改成192.168.11.132。



3.在LVS上安裝LVS管理軟件,而且定義LVS的分發策略(輪詢調度rr):

yum -y install ipvsadm#對於ipvsadm命令怎麼使用,在下面有詳細解釋。

ipvsadm -A -t 172.16.11.132:80 -s rr

ipvsadm -a -t 172.16.11.132:80 -r 192.168.11.133 -m

ipvsadm -a -t 172.16.11.132:80 -r 192.168.11.134 -m


4.訪問測試,在虛擬機外邊,也就是本身電腦系統的命令提示符界面進行測試,此時須要更改虛擬網絡編輯器的NAT模式的網段,不然測試不成功。




虛擬網絡編輯器1.png----------->虛擬網絡編輯器2.png


測試結果.png



如上圖,結果表示測試成功,這只是進行LVS的輪詢調度,也就是調度器經過「輪詢」調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而無論服務器上實際的鏈接數和系統負載。也就是說兩臺相同硬件配置的服務器輪流提供服務,下降負載。


附加:關於LVS的加權算法(wrr):

 ipvsadm -C

 ipvsadm -A -t 172.16.11.132:80 -s wrr

 ipvsadm -a -t 172.16.11.132:80 -r 192.168.11.133 -m -w 2

 ipvsadm -a -t 172.16.11.132:80 -r 192.168.11.134 -m -w 3

測試以下:web1和web2的訪問次數由於設置了權重值,因此訪問次數比爲2:3,這裏訪問了10次進行測試: 

 

測試2.png


這裏介紹一下LVS的調度算法:

LVS的調度算法分爲靜態與動態兩類。

一、靜態算法(4種),只根據算法進行調度 而不考慮後端服務器的實際鏈接狀況和負載狀況

① RR:輪詢調度(Round Robin)

調度器經過」輪詢」調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而無論服務器上實際的鏈接數和系統負載。

② WRR:加權輪叫(Weight RR) 調度器經過「加權輪叫」調度算法根據真實服務器的不一樣處理能力來調度訪問請求。這樣能夠保證處理能力強的服務器處理更多的訪問流量。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。

③ DH:目標地址散列調度(Destination Hash )

根據請求的目標IP地址,做爲散列鍵(HashKey)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。

④ SH:源地址 hash(Source Hash)

源地址散列」調度算法根據請求的源IP地址,做爲散列鍵(HashKey)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。


二、動態算法(6種)前端的調度器會根據後端真實服務器的實際鏈接狀況來分配請求

① LC:最少連接(Least Connections)

調度器經過」最少鏈接」調度算法動態地將網絡請求調度到已創建的連接數最少的服務器上。若是集羣系統的真實服務器具備相近的系統性能,採用」最小鏈接」調度算法能夠較好地均衡負載。

② WLC:加權最少鏈接(默認採用的就是這種)(Weighted Least Connections)

在集羣系統中的服務器性能差別較大的狀況下,調度器採用「加權最少連接」調度算法優化負載均衡性能,具備較高權值的服務器將承受較大比例的活動鏈接負載。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。

③ SED:最短時間望延遲調度(Shortest Expected Delay )

在WLC基礎上改進,Overhead =  (ACTIVE+1)256/加權,再也不考慮非活動狀態,把當前處於活動狀態的數目+1來實現,數目最小的,接受下次請求,+1的目的是爲了考慮加權的時候,非活動鏈接過多缺陷:當權限過大的時候,會倒置空閒服務器一直處於無鏈接狀態。

④ NQ:永不排隊/最少隊列調度(Never Queue Scheduling NQ)

無需隊列。若是有臺  realserver的鏈接數=0就直接分配過去,不須要再進行sed運算,保證不會有一個主機很空間。在SED基礎上不管+幾,第二次必定給下一個,保證不會有一個主機不會很空閒着,不考慮非活動鏈接,才用NQ,SED要考慮活動狀態鏈接,對於DNS的UDP不須要考慮非活動鏈接,而httpd的處於保持狀態的服務就須要考慮非活動鏈接給服務器的壓力。

⑤ LBLC:基於局部性的最少連接(locality-Based Least Connections)  基於局部性的最少連接」調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工做負載,則用「最少連接」的原則選出一個可用的服務器,將請求發送到該服務器。

⑥ LBLCR:帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication) 帶複製的基於局部性最少連接」調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不一樣之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按」最小鏈接」原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按「最小鏈接」原則從這個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。



這裏有關於ipvsadm命令的選項解釋:

    -A --add-service 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也就是增長一臺新的虛擬服務器(VIP)。

    -E --edit-service 編輯內核虛擬服務器表中的一條虛擬服務器記錄。

    -D --delete-service 刪除內核虛擬服務器表中的一條虛擬服務器記錄。

    -C --clear 清除內核虛擬服務器表中的全部記錄。

    -R --restore 恢復虛擬服務器規則

    -S --save 保存虛擬服務器規則,備份輸出爲-R 選項可讀的格式

    -a --add-server 在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄(RIP)。也就是在一個虛擬服務器中增長一臺新的真實服務器

    -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 的默認值爲360 秒。

    -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 的工做模式爲DR直接路由模式(也是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

    --daemon 顯示同步守護進程狀態

    --stats 顯示統計信息

    --rate 顯示速率信息

    --sort 對虛擬服務器和真實服務器排序輸出

    -n --numeric  輸出IP地址和端口的數字形式

相關文章
相關標籤/搜索