一、基本概覽介紹
二、LVS的類型及原理
三、LVS調度算法
四、利用DR及NAT實現web負載均衡
一、基本概覽介紹
LVS是一個工作在傳輸層面上的一個負載均衡軟件,它是由用戶空間的ipvsadm和內核空間的ipvs兩個組件組成。其中ipvsadm是用戶空間的命令行工具,主要是用於管理集羣服務及集羣服務上的RS。ipvs是工作與內核上的netfilter的INPUT鏈上的程序,可以根據用戶事先定義的集羣實現轉發。
二、LVS的類型及原理
LVS的類型可以分爲:NAT、DR、TUN、FULLNAT四中類型
LVS-NAT模型:需要將RS的網關指向LVS的DIP地址
原理: 通過將請求報文中的目標地址和目標端口修改爲挑選出來的某RS的RIP和PORT,從而實現轉發
流程:
①客戶端將請求發往前端的負載均衡器,請求報文的源地址是CIP,目標地址是VIP
②負載均衡器收到報文後,正常情況報文是進入用戶空間的,但是發現請求是規則裏面存在的地址,那麼將報文的目標地址改爲後端RS服務器的RIP地址,原CIP不變,然後將報文發走。
③報文送到RS服務器後,由於報文的目標地址是自己,所有會響應客戶端的請求,並將包文返回給調度器,此時原地址爲RIP,目標地址爲CIP
④ 調度器收到報文後,將此報文的源地址改爲VIP,然後將報文返回給客戶端。
LVS-DR模型:
原理:源和目標的ip及端口都不發送改變,通過將請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP接口的MAC,目標MAC是RS服務器的RIP接口的MAC
流程:
①客戶端將請求報文發往lvs調度器,請求報文源地址是CIP,目標地址爲VIP,源MAC是CMAC,目標MAC是LVS的VIP接口的MAC
②LVS收到報文後,發現請求是定義規則中的,那麼它將客戶端的請求報文的源MAC地址重新封裝爲自己DIP,目標MAC 改爲挑選出來的RS的VIP接口的MAC地址。
③RS收到報文後,發現報文中目的MAC是自己VIP接口的MAC,就會接下報文出來後,將直接回應給客戶端
LSV-TUN模型:
原理:不修改請求報文中的IP首部(源ip爲CIP,目標IP爲VIP),而是在原IP首部之外再封裝一個IP首部(源ip爲DIP,目標IP爲挑選出來的RS的RIP),然後將報文發往挑選出來的目標RS
LSV-FULLNAT模型:
原理:通過同時修改請求報文中的源IP地址和目標IP地址進行轉發
三、LVS調度算法
根據其調度時是否考慮後端主機的當前負載情況,可以分爲靜態方法和動態方法:
靜態算法:調度器僅僅是根據算法本身來進行調度,而不考慮後的那RS的實際連接和負載情況,注重的是起點公平
RR:輪詢調度
WRR:加權輪詢
SH:源地址哈希,將來自同一IP地址的請求始終發往第一次挑中的Rs中,可以實現會話綁定
DH:目標地址哈希:將發往同一個目標地址的請求,始終轉發到第一次挑中的Rs
動態算法:
LC:最少連接
WLC:加權最少連接
SED:最短期望延遲
NQ:永不排隊的連接
LBLC:基於本地最少連接,動態DH算法
LBLCR:帶複製功能的LBLC
四、利用DR及NAT實現web負載均衡
基於NAT模型的web負載:
配置Real Server
RS1:
###配置IP地址和網關,網關指向DIP: [root@pxe132 ~]# route add default gw 192.168.100.100 ###配置一個httpd測試網頁: [root@pxe132 ~]# yum -y install httpd [root@pxe132 ~]# echo "Rserver 1" >/var/www/html/index.html [root@pxe132 ~]# systemctl start httpd.service
RS2
###配置IP地址和網關,網關指向DIP: [root@pxe132 ~]# route add default gw 192.168.100.100 ###配置一個httpd測試網頁: [root@pxe132 ~]# yum -y install httpd [root@pxe132 ~]# echo "Rserver 2" >/var/www/html/index.html [root@pxe132 ~]# systemctl start httpd.service
配置Director
##配置IP地址省略: ##配置路由轉發功能: [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward ###測試下我們環境是否正常: [root@localhost ~]# curl http://192.168.1.10 Rserver 1 [root@localhost ~]# curl http://192.168.1.20 Rserver 2
添加規則:
[root@localhost ~]# ipvsadm -A -t 172.16.100.1:80 -s rr [root@localhost ~]# ipvsadm -a -t 172.16.100.1:80 -r 192.168.1.10:80 -m -w 1 [root@localhost ~]# ipvsadm -a -t 172.16.100.1:80 -r 192.168.1.20:80 -m -w 1
查看規則信息:
[root@localhost ~]# ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.100.1:http rr -> 192.168.1.10:http Masq 1 0 0 -> 192.168.1.20:http Masq 1 0 0
基於LVS-DR模型的web負載
[root@bogon ~]# ifconfig eno16777736:1 192.168.1.100/32 broadcast 192.168.1.100 up [root@bogon ~]# route add -host 192.168.1.100 dev eno16777736:1 [root@bogon ~]# ipvsadm -A -t 192.168.1.100:80 -s rr [root@bogon ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.105:80 -g -w 1 [root@bogon ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.106:80 -g -w 2
配置RealServer1
[root@bogon ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@bogon ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@bogon ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@bogon ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@rs1 ~]# ifconfig lo:0 192.168.1.100/32 broadcast 192.168.1.100 up [root@rs1 ~]# route add -host 192.168.1.100 dev lo:0
配置RealServer2
[root@bogon ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@bogon ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@bogon ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@bogon ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@rs1 ~]# ifconfig lo:0 192.168.1.100/32 broadcast 192.168.1.100 up [root@rs1 ~]# route add -host 192.168.1.100 dev lo:0