負載均衡(LVS安裝部署篇)html
LVS的IP負載均衡技術是經過IPVS(IP Virtual Server,IP虛擬服務)模塊實現的。IPVS模塊是LVS集羣的核心軟件模塊,它安裝在LVS集羣做爲負載均衡的主節點上,虛擬出一個IP地址和端口對外提供服務。
用戶經過訪問這個虛擬服務,而後訪問請求由負載均衡器調度到後端真實服務器中,由後端真實服務器處理用戶的請求並返回響應。前端
IPVS 在Linux內核中實現傳輸層負載均衡,即所謂的第4層交換。
在主機上運行的IPVS充當真實服務器集羣前端的負載均衡器,它能夠將對基於TCP/UDP的服務的請求定向到真實服務器,並使真實服務器的服務在虛擬服務上顯示爲虛擬服務。node
Linux內核2.4版本開始默認支持LVS。要使用LVS的能力,只需安裝一個LVS的管理工具:ipvsadmlinux
下載 ipvsadm: https://mirrors.edge.kernel.org/pub/linux/utils/kernel/ipvsadm算法
目前最新版本是ipvsadm-1.29.tar.gzvim
直接安裝會報錯,須要安裝一下依賴包,gcc是必須的。後端
查看下系統內核版本
[root@node1 ~]# uname -r
2.6.32-573.el6.x86_64瀏覽器
[root@node1 ~]# ls /usr/src/kernels/
2.6.32-696.16.1.el6.x86_64bash
若是發現沒有安裝當前系統的內核源碼在/usr/src/kernels/目錄下,其實咱們是少安裝了一個rpm包;
使用yum安裝kernel-devel
[root@node1 ~]# yum -y install kernel-devel服務器
[root@node1 ~]# ln -s /usr/src/kernels/2.6.32-696.16.1.el6.x86_64 /usr/src/linux
由於/usr/src/kernels/目錄下可能有多個目錄,若是不建立這個鏈接文件,在編譯時可能會報錯。
咱們還須要安裝幾個依賴包
[root@node1 ~]# yum -y install gcc popt-static libnl* libpopt*
[root@node1 ~]# wget https://mirrors.edge.kernel.org/pub/linux/utils/kernel/ipvsadm/ipvsadm-1.29.tar.gz
[root@node1 ~]# tar -xf ipvsadm-1.29.tar.gz
[root@node1 ~]# cd ipvsadm-1.29
[root@node1 ipvsadm-1.29]# make && make install
從make install 的輸出,咱們能夠看到生成了幾個可執行文件:
/sbin/ipvsadm
/sbin/ipvsadm-save
/sbin/ipvsadm-restore
/etc/rc.d/init.d/ipvsadm
安裝完成後,模塊ipvs並無自動加載入內核,須要手動執行ipvsadm,由於尚未作配置,所以沒有數據輸出。再執行命令,就能夠看到ipvs已加載到內核了。
咱們已經成功安裝了 ipvs,接下來咱們開始部署使用。
實驗環境:
三臺服務器在通一個內網
設備角色 IP地址
VIP 172.16.10.10
負載均衡 172.16.10.251
後端服務器1 172.16.10.252
後端服務器2 172.16.10.253
負載均衡上安裝好ipvs,後端服務器安用yum安裝httpd
yum -y install httpd
service httpd start
在後兩臺端服務器上添加頁面,方便區分轉發後請求到了哪一個後端服務器。
後端服務器1
echo '<h1>This is Back-end Web Server 252 </h1>' > /var/www/html/index.html
後端服務器2
echo '<h1>This is Back-end Web Server 253 </h1>' > /var/www/html/index.html
測試訪問結果
爲了方便維護,vip的綁定通常都是用腳原本實現的。讓這個腳本隨系統開機啓動。
vim /etc/init.d/lvsreal
#! /bin/bash
# chkconfig: 2345 55 25
# Description : Start Real Server ,https://blog.51cto.com/xmomo
VIP=172.16.10.10
# /etc/rc.d/init.d/functions //腳本在/etc/init.d/目錄下,註釋這一行
case "$1" in
start)
echo "Start LVS Of Real Server"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "Stop LVS Of Real Server"
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 "Usage: $0 {start|stop}"
exit 1
esac
# chmod +x /etc/init.d/lvsreal
# chkconfig --add lvsreal
# /etc/init.d/lvsreal start
LVS後端提供服務的服務器都要使用這個VIP,在其餘服務器上作一樣的操做。
這個VIP被綁定到 lo:0 上,廣播地址是自己,子網掩碼是 255.255.255.255。
這是與標準的網絡地址設置有很大的不一樣,
採用這種可變長的子網掩碼方式把網段劃分紅只含一個主機地址,這樣作的目的是避免IP地址衝突。
echo "1" ,echo "2" 是爲了防止arp廣播。
運行腳本後看下咱們vip是否配置成功。
如今就輪到負載均衡器的配置了,因爲沒有配置keepalived一塊兒使用,所以只須要一個服務器作負載均衡器。
vim /usr/local/bin/lvsserver.sh
#! /bin/bash
# Description : Start Load Balance ,https://blog.51cto.com/xmomo
ip addr add 172.16.10.10/32 dev lo:0
ipvsadm -C
ipvsadm -A -t 172.16.10.10:80 -s wlc
ipvsadm -a -t 172.16.10.10:80 -r 172.16.10.252 -g -w 1
ipvsadm -a -t 172.16.10.10:80 -r 172.16.10.253 -g -w 1
chmod +x /usr/local/bin/lvsserver.sh
/usr/local/bin/lvsserver.sh
讓這個腳本隨系統開機啓動,咱們把這個腳本路徑添加到/etc/rc.local
echo '/bin/bash /usr/local/bin/lvsserver.sh' >> /etc/rc.local
檢查VIP地址是否配置成功,以及查看轉發規則是生效。
確認沒問題後,咱們來驗證一下:
用客戶端瀏覽器訪問: http://172.16.10.10/index.html 多刷新幾下。
從輸出信息能夠看到,客戶端請求都被轉發到後端服務器了。
客戶端172.16.10.22的請求被轉發到172.16.10.252和172.16.10.253。
LVS集羣的負載調度主要是由工做在內核當中的IPVS IP負載均衡軟件負責進行調度的,IPVS在內核中的負載均衡調度是以鏈接爲粒度的,在內核中的鏈接調度算法上,IPVS已實現瞭如下八種調度算法.
靜態算法:只根據算法進行調度 而不考慮後端服務器的實際鏈接狀況和負載狀況
這種算法就是以輪叫的方式依次將請求調度不一樣的服務器,算法的優勢是其簡潔性,它無需記錄當前全部鏈接的狀態,因此它是一種無狀態調度。輪叫調度算法假設全部服務器處理性能均相同,無論服務器的當前鏈接數和響應速度。該算法相對簡單,不適用於服務器組中處理性能不一的狀況,並且當請求服務時間變化比較大時,輪叫調度算法容易致使服務器間的負載不平衡。
這種算法能夠解決服務器間性能不一的狀況,它用相應的權值表示服務器的處理性能,服務器的缺省權值爲1。假設服務器A的權值爲1,B的 權值爲2,則表示服務器B的處理性能是A的兩倍。加權輪叫調度算法是按權值的高低和輪叫方式分配請求到各服務器。權值高的服務器先收到的鏈接,權值高的服 務器比權值低的服務器處理更多的鏈接,相同權值的服務器處理相同數目的鏈接數。
此算法先根據請求的目標IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。
此算法根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。它採用的散列函數與目標地址散列調度算法 的相同。它的算法流程與目標地址散列調度算法的基本類似。
動態算法:前端的調度器會根據後端真實服務器的實際鏈接狀況來分配請求
這種算法是把新的鏈接請求分配到當前鏈接數最小的服務器。最小鏈接調度是一種動態調度算法,它經過服務器當前所活躍的鏈接數來估計服務 器的負載狀況。調度器須要記錄各個服務器已創建鏈接的數目,當一個請求被調度到某臺服務器,其鏈接數加1;當鏈接停止或超時,其鏈接數減一。當各個服務器有相同的處理性能時,最小鏈接調度算法能把負載變化大的請求分佈平滑到各個服務器上,全部處理時間比較長的請求不可能被髮送到同一臺服 務器上。可是,當各個服務器的處理能力不一樣時,該算法並不理想,由於TCP鏈接處理請求後會進入TIME_WAIT狀態,TCP的TIME_WAIT通常 爲2分鐘,此時鏈接還佔用服務器的資源,因此會出現這樣情形,性能高的服務器已處理所收到的鏈接,鏈接處於TIME_WAIT狀態,而性能低的服務器已經 忙於處理所收到的鏈接,還不斷地收到新的鏈接請求。
這種算法是最小鏈接調度的超集,各個服務器用相應的權值表示其處理性能。服務器的缺省權值爲1,系統管理員能夠動態地設置服務器的權 值。加權最小鏈接調度在調度新鏈接時儘量使服務器的已創建鏈接數和其權值成比例。
這種算法是請求數據包的目標 IP 地址的一種調度算法,該算法先根據請求的目標 IP 地址尋找最近的該目標 IP 地址全部使用的服務器,若是這臺服務器依然可用,而且有能力處理該請求,調度器會盡可能選擇相同的服務器,不然會繼續選擇其它可行的服務器
這種算法先根據請求的目標IP地址找出該目標IP地址對應的服務器組;按「最小鏈接」原則從該服務器組中選出一臺服務器,若服務器沒有超載, 將請求發送到該服務器;若服務器超載;則按「最小鏈接」原則從整個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該 服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。