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(後端服務器)
解釋:
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}
============>
cp -av ifcfg-eth0 ifcfg-eth1#生成新網卡的配置文件,將網卡模式改成NAT模式,而且進行的修改以下:
#如上圖對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模式的網段,不然測試不成功。
----------->
如上圖,結果表示測試成功,這只是進行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次進行測試:
這裏介紹一下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地址和端口的數字形式