ILVS,是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目。LVS由用戶空間的ipvsadm和內核空間的IPVS組成,ipvsadm用來定義規則,IPVS利用ipvsadm定義的規則工做。如今LVS已是 Linux標準內核的一部分,在Linux2.4內核之前,使用LVS時必需要從新編譯內核以支持LVS功能模塊,可是從Linux2.4內核之後,已經徹底內置了LVS的各個功能模塊,無需給內核打任何補丁,能夠直接使用LVS提供的各類功能。php
經過LVS提供的負載均衡技術和Linux操做系統實現一個高性能、高可用的服務器羣集,它具備良好可靠性、可擴展性和可操做性。從而以低廉的成本實現最優的服務性能。LVS的主要特色有如下幾個方面:html
3、LVS常見術語
LVS中有一些常見的術語,以下表所示:前端
名稱 解釋 ipvsadm 用戶空間的命令行工具,用於管理集羣服務及集羣服務上的RS等; IPVS 工做於內核上的netfilter INPUT HOOK之上的程序,可根據用戶定義的集羣實現請求轉發; VS Virtual Server ,虛擬服務 Director, Balancer 負載均衡器、分發器 RS Real Server 後端請求處理服務器 CIP Client IP,客戶端IP VIP Director Virtual IP,負載均衡器虛擬IP DIP Director IP,負載均衡器IP RIP Real Server IP,後端請求處理服務器IP
若是對於iptables5條鏈不瞭解的同窗,麻煩先去看下這個知識點。這5條鏈是當數據包流向這臺服務器的時候,數據包在服務器內核中的流向。能夠參考下面這篇文章:
https://blog.csdn.net/gui951753/article/details/86619021mysql
LVS工做原理:
web
LVS有不少種模式來供咱們選擇,生產場景中通常使用的都是NAT模式和DR模式,固然,也並非說其餘模式並不會使用,仍是要根據實際的生產場景來決定選擇什麼樣的方案。算法
Virtual Server via NAT(VS-NAT):用地址翻譯實現虛擬服務器。地址轉換器有能被外界訪問到的合法IP地址,它修改來自專有網絡的流出包的地址。外界看起來包是來自地址轉換器自己,當外界包送到轉換器時,它能判斷出應該將包送到內部網的哪一個節點。優勢是節省IP 地址,能對內部進行假裝;缺點是效率低,由於返回給請求方的數據包通過調度器。sql
數據包流轉的過程如上圖所示:數據庫
(1)當用戶請求到達DirectorServer,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP 。vim
(2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈。windows
(3) IPVS比對數據包請求的服務是否爲集羣服務,如果,修改數據包的目標IP地址爲後端服務器IP,而後將數據包發至POSTROUTING鏈。 此時報文的源IP爲CIP,目標IP爲RIP ,在這個過程完成了目標IP的轉換。
(4) POSTROUTING鏈經過選路,將數據包發送給Real Server。
(5) Real Server比對發現目標爲本身的IP,開始構建響應報文發回給Director Server。 此時報文的源IP爲RIP,目標IP爲CIP 。
(6) Director Server在響應客戶端前,此時會將源IP地址修改成本身的VIP地址,而後響應給客戶端。 此時報文的源IP爲VIP,目標IP爲CIP。
以下圖所示,NAT模式中的一大缺點就是不管是請求的數據包,仍是返回的數據包,都必需要通過負載的這個點,請求的數據包通常內容較少,問題不是很大,而返回的數據包,通常都是圖片,視頻等等,這會給中間的調度器帶來巨大的負擔。font>
Virtual Server via Direct Routing(VS-DR):用直接路由技術實現虛擬服務器。當參與集羣的計算機和做爲控制管理的計算機在同一個網段時能夠用此方法,控制管理的計算機接收到請求包時直接送到參與集羣的節點。直接路由模式比較特別,很難說和什麼方面類似,前種模式基本上都是工做在網絡層上(三層),而直接路由模式則應該是工做在數據鏈路層上(二層)。
工做原理 :
如上圖所示,Director和REAL SERVER都配置同一個IP(VIP),Director將該IP配置到對外的網卡上,Real server將該IP配置到lo網卡上。配置arp_ignore爲1(目的是讓數據包發出apr請求時,只有Director會響應該arp請求),全部REAL SERVER對自己這個IP的ARP請求保持靜默。而Director收到數據包後根據調度算法,找出對應的 REAL SERVER,把目的MAC地址改成REAL SERVER的MAC併發給這臺REAL SERVER。這時REAL SERVER經過網卡eth0收到這個數據包,因爲Real Server上的lo網卡配置的也有VIP,因此RS接收該數據包。處理後直接返回給客戶端(這裏要配置arp_announce,目的是修改返回數據包的源ip地址。)。因爲DR要對二層包頭進行改換,因此DR和REAL SERVER之間必須在一個廣播域,也能夠簡單的理解爲在同一臺交換機上。
DR模式的特性
一、保證前端路由將目標地址爲VIP報文通通發給Director Server,而不是RS
二、RS可使用私有地址;也能夠是公網地址,若是使用公網地址,此時能夠經過互聯網對RIP進行直接訪問
三、RS跟Director Server必須在同一個物理網絡中
四、全部的請求報文經由Director Server,但響應報文必須不能進過Director Server
五、不支持地址轉換,也不支持端口映射
六、RS能夠是大多數常見的操做系統
七、RS的網關毫不容許指向DIP
八、RS上的lo接口配置VIP的IP地址
準備好三臺主機(分別爲lvs調度器、RS一、RS2)實現DR模式的調度效果。
1.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址爲VIP。
2.負載均衡器收到報文後,發現請求的是在規則裏面存在的地址,那麼它將在客戶端請求報文的首部再封裝一層IP報文,將源地址改成DIP,目標地址改成RIP,並將此包發送給RS。
3.RS收到請求報文後,會首先拆開第一層封裝,而後發現裏面還有一層IP首部的目標地址是本身lo接口上的VIP,因此會處理次請求報文,並將響應報文經過lo接口送給eth0網卡(這個網卡通常指和調度器在一個網段的網卡)直接發送給客戶端。注意:須要設置lo接口的VIP不能在公網上出現。
特色:
(1)RIP,DIP可使用私有地址;
(2)RIP和DIP能夠再也不同一個網絡中,且RIP的網關未必須要指向DIP;
(3)支持端口映射;
(4)RS的OS可使用任意類型;
(5)請求報文經由Director,響應報文也經由Director
LVS有兩種類型的調度算法,其一就是靜態的調度算法,這種算法一經實現,後續就不會發生變化,是既定的規則,後續數據包的流轉都會按照這種規則進行循序漸進的流轉;其二就是動態的調度算法,這種算法是基於網絡情況,或者後端服務器的情況,鏈接的情況等來進行實時的調整,算法的規則會根據實際狀況而發生必定的變化。
經常使用的靜態調度算法有如下幾種:
1.RR:輪叫調度(Round Robin)
調度器經過」輪叫」調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而無論服務器上實際的鏈接數和系統負載。
2.WRR:加權輪叫(Weight RR)
調度器經過「加權輪叫」調度算法根據真實服務器的不一樣處理能力來調度訪問請求。這樣能夠保證處理能力強的服務器處理更多的訪問流量。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。
3.DH:目標地址散列調度(Destination Hash )
根據請求的目標IP地址,做爲散列鍵(HashKey)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。
4.SH:源地址 hash(Source Hash)
源地址散列」調度算法根據請求的源IP地址,做爲散列鍵(HashKey)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。
經常使用的動態調度算法有下面這些
1.LC:最少連接(Least Connections)
調度器經過」最少鏈接」調度算法動態地將網絡請求調度到已創建的連接數最少的服務器上。若是集羣系統的真實服務器具備相近的系統性能,採用」最小鏈接」調度算法能夠較好地均衡負載。
2.WLC:加權最少鏈接(默認採用的就是這種)(Weighted Least Connections)
在集羣系統中的服務器性能差別較大的狀況下,調度器採用「加權最少連接」調度算法優化負載均衡性能,具備較高權值的服務器將承受較大比例的活動鏈接負載。調度器能夠自動問詢真實服務器的負載狀況,並動態地調整其權值。
3.SED:最短延遲調度(Shortest Expected Delay )
在WLC基礎上改進,Overhead = (ACTIVE+1)*256/加權,再也不考慮非活動狀態,把當前處於活動狀態的數目+1來實現,數目最小的,接受下次請求,+1的目的是爲了考慮加權的時候,非活動鏈接過多缺陷:當權限過大的時候,會倒置空閒服務器一直處於無鏈接狀態。
4.NQ永不排隊/最少隊列調度(Never Queue Scheduling NQ)
無需隊列。若是有臺 realserver的鏈接數=0就直接分配過去,不須要再進行sed運算,保證不會有一個主機很空間。在SED基礎上不管+幾,第二次必定給下一個,保證不會有一個主機不會很空閒着,不考慮非活動鏈接,才用NQ,SED要考慮活動狀態鏈接,對於DNS的UDP不須要考慮非活動鏈接,而httpd的處於保持狀態的服務就須要考慮非活動鏈接給服務器的壓力。
10、ipvsadm使用指南
在ipvsadm中有幾個常見術語須要解釋一下:
配置虛擬服務的語法:
ipvsadm 的用法和格式以下: ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask] #添加/編輯一條新的虛擬服務器記錄。 ipvsadm -D -t|u|f virtual-service-address #刪除一條記錄 ipvsadm -C #清除全部記錄 ipvsadm -R #恢復虛擬服務器規則 ipvsadm -S [-n] #保存虛擬服務器規則 命令選項解釋: -A --add-service 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也 就是增長一臺新的虛擬服務器。 -E --edit-service 編輯內核虛擬服務器表中的一條虛擬服務器記錄。 -D --delete-service 刪除內核虛擬服務器表中的一條虛擬服務器記錄。 -C --clear 清除內核虛擬服務器表中的全部記錄。 -R --restore 恢復虛擬服務器規則 -S --save 保存虛擬服務器規則,輸出爲-R 選項可讀的格式 -s --scheduler scheduler 使用的調度算法,有這樣幾個選項 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, -p --persistent [timeout] 持久穩固的服務。這個選項的意思是來自同一個客 戶的屢次請求,將被同一臺真實的服務器處理。timeout 的默認值爲300 秒。 -M --netmask netmask persistent granularity mask
配置real server的語法
ipvsadm 的用法和格式以下: ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] ipvsadm --stop-daemon ipvsadm -h 命令選項解釋: -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 顯示幫助信息 -t --tcp-service service-address 說明虛擬服務器提供的是tcp 的服務 [vip:port] or [real-server-ip:port] -u --udp-service service-address 說明虛擬服務器提供的是udp 的服務 [vip:port] or [real-server-ip:port] -f --fwmark-service fwmark 說明是通過iptables 標記過的服務類型。 -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 --daemon 顯示同步守護進程狀態 --stats 顯示統計信息 --rate 顯示速率信息 --sort 對虛擬服務器和真實服務器排序輸出 --numeric -n 輸出IP 地址和端口的數字形式
上述四種工做模式,DR模式和NAT模式是經常使用的兩種模式,本文就只闡述這兩種工做模式。
NAT模式的實現
在實現以前,要先對網段進行必定的規劃,每一臺服務器都去規劃好它的位置,和其所承擔的職責。
機器名稱 IP配置 服務角色 lvs VIP:192.168.31.100 DIP:172.25.0.1 負載均衡器 web1 RIP:172.25.0.31 後端服務器 web2 RIP:172.25.0.32 後端服務器 web3 RIP:172.25.0.33 後端服務器
其數據流轉的模型以下圖所示:
實現步驟:
安裝相關配置工具 [root@lvs1 ~]# yum install ipvsadm -y lvs-server配置: 一、ipvsadm -A -t 192.168.31.100:80 -s wrr #開啓一個基於80端口的虛擬服務,調度方式爲wrr 二、ipvsadm -a -t 192.168.31.100:80 -r 172.25.0.31 -m -w 1 #配置web1服務後端real server 爲nat工做方式 權重爲1 ipvsadm -a -t 192.168.31.100:80 -r 172.25.0.32 -m -w 1 #配置web2服務後端real server 爲nat工做方式 權重爲1 ipvsadm -a -t 192.168.31.100:80 -r 172.25.0.33 -m -w 1 #配置web3服務後端real server 爲nat工做方式 權重爲1 三、修改內核配置,開啓路由轉發 vim /etc/sysctl.conf 修改 net.ipv4.ip_forward=1 sysctl -p 使其生效 五、real server配置 配置網關指向172.25.0.11,開啓web、php-fpm、mysql服務
可分別在三個站點上面寫上不一樣的內容,而後進行測試,看是否可以進行調度。
注:windows中的瀏覽器中通常都會有緩存,其調度可能會失效,使用Linux中的curl等命令訪問則是沒有問題的。可以正常的實現調度。
DR模式的實現
機器名稱 IP配置 服務角色 lvs VIP:172.25.0.100 DIP:172.25.0.1 負載均衡器 web1 RIP:172.25.0.31 後端服務器 web2 RIP:172.25.0.32 後端服務器 web3 RIP:172.25.0.33 後端服務器
DR模式的配置是使用命令來實現的,故其中的一些配置在系統重啓以後是不存在的,若是要想下次開機啓動以後,可以自動的配置,能夠將配置的步驟寫成腳本,並設置開機自啓動。(上面NAT模式的實現也能夠設置開機自啓動腳原本實現。)
LVS調度器腳本
#!/bin/bash # chkconfig: 2345 90 10 #LVS script for DR . /etc/rc.d/init.d/functions VIP=172.25.0.100 DIP=172.25.0.11 RIP1=172.25.0.31 RIP2=172.25.0.32 RIP3=172.25.0.33 PORT=80 # #description: hhahahah case "$1" in start) /sbin/ifconfig ens34:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev ens34:0 # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # 開啓路由轉發功能 # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s wrr # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP3 -g -w 1 ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface /sbin/ifconfig ens34:0 down # echo "ipvs is stopped..." ;; *) echo "Usage: $0 {start|stop}" ;; esac
將上述內容保存在/etc/init.d/lvs-director文件中,而後添加到服務:
[root@lvs ~]# chmod +x /etc/init.d/lvs-director # 添加腳本執行權限 [root@lvs ~]# chkconfig --add lvs-director # 添加腳本到服務當中 [root@lvs ~]# chkconfig lvs-director on # 設置爲開機自啓動服務 [root@lvs ~]# /etc/init.d/lvs-director start # 啓動腳本
客戶端腳本 #!/bin/bash # # Script to start LVS DR real server. # chkconfig: - 90 10 # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=172.25.0.100 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore #只響應目的IP地址爲接收網卡上的本地地址的arp請求 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce # 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通訊的本地地址. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #配置全部網卡只響應本身接口上的ip的arp請求,其他的忽略。 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #必須避免將接口信息向非本網絡進行通告 /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ;; *) # Invalid entry. echo "$0: Usage: $0 {start||stop}" exit 1 ;; esac
保存至/etc/init.d/lvs-rs,並賦予執行權限,而後添加爲開機啓動:
[root@web1~]# chmod +x /etc/init.d/lvs-rs [root@web1 ~]# chkconfig --add lvs-rs [root@web1 ~]# chkconfig lvs-rs on [root@web1 ~]# /etc/init.d/lvs-rs start
web2和web3採用徹底相同的配置便可。
實驗測試
在web一、web2和web3上寫入不一樣的站點內容,而後訪問172.25.0.100。訪問調度器的網址,看是否每次訪問的站點內容都是不一樣的。(windows中的瀏覽器有緩存功能,若是站點內容有時候是相同的,那麼不必定是本身配錯了,多是緩存的緣由,避免的辦法就是使用Linux的curl命令去訪問站點的內容)
參考文獻
十3、WEB後端服務器配置
客戶端腳本
#!/bin/bash
. /etc/rc.d/init.d/functions
VIP=172.25.0.100
host=/bin/hostname
case "$1" in
start)
/sbin/ifconfig lo down /sbin/ifconfig lo up echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore #只響應目的IP地址爲接收網卡上的本地地址的arp請求 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce # 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通訊的本地地址. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #配置全部網卡只響應本身接口上的ip的arp請求,其他的忽略。 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #必須避免將接口信息向非本網絡進行通告 /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "$0: Usage: $0 {start||stop}" exit 1
;;
esac
保存至/etc/init.d/lvs-rs,並賦予執行權限,而後添加爲開機啓動:
[root@web1~]# chmod +x /etc/init.d/lvs-rs [root@web1 ~]# chkconfig --add lvs-rs [root@web1 ~]# chkconfig lvs-rs on [root@web1 ~]# /etc/init.d/lvs-rs start
web2和web3採用徹底相同的配置便可。
實驗測試
在web一、web2和web3上寫入不一樣的站點內容,而後訪問172.25.0.100。訪問調度器的網址,看是否每次訪問的站點內容都是不一樣的。(windows中的瀏覽器有緩存功能,若是站點內容有時候是相同的,那麼不必定是本身配錯了,多是緩存的緣由,避免的辦法就是使用Linux的curl命令去訪問站點的內容)
參考文獻
http://www.javashuo.com/article/p-sxgzfcbd-bc.html
http://www.javashuo.com/article/p-xfywiofz-be.html