1. 程式人生 > > LVS負載均衡介紹和配置

LVS負載均衡介紹和配置

start 外部 響應 數據接收 網通 eal 方便 ive ucc

負載均衡群集介紹? ??

開源的負載均衡軟件LVS、keepalived、haproxy和nginx等
keepalived除了可以實現高可用外,也可以拿來做負載均衡功能
LVS是基於4層負載均衡,網絡OSI7層模型中的第四層。nginx屬於第七層,haproxy既可以在4層工作,也可以在7層工作
lvs支持tcp數據轉發,除了實現80的web端口轉發外,也支持其他端口數據通信轉發的,lvs只做協議上的通信端口數據轉發,對數據內容不做監聽:如域名頭、主機報文頭部信息
nginx只支持http、https、mail的轉發,nginx可以針對網站的目錄進行負載均衡,nginx在7層可以對後端區分目錄,針對不同的網站目錄來解析到不同的主機,haproxy也支持mysql負載均衡
比較lvs和nginx來說,lvs這種負載均衡在轉發4層協議數據上更加穩定,能夠處理更多的數據請求,而nginx這種負載均衡的方式更加靈活,可以針對不同級別的域名訪問分配到不同的主機以及目錄上,能夠實現更多特定的需求

LVS介紹

LVS有三種常見模式:NAT、DR和IP Tunnel模式
LVS中有一個核心角色叫做分發器(Load balance),主要用於分發用戶請求,還有諸多用戶請求的服務器(Real Server,簡稱RS)

LVS-NAT模式:
LVS-nat模式借助iptables規則來實現,用戶請求到達分發器後,通過預設的iptables規則,會把數據轉發到後端的RS上去
rs需要設定網關為分發器的內網ip,用戶請求和返回的數據包全部經過分發器,所以這裏的分發器會造成一個瓶頸
在nat模式中,只需要分發器擁有公網ip即可,所以比較節省公網ip資源
但是這種模式不能承受較大的請求量,訪問量較大的請求可能會無法正常處理,因為數據接收和發送到客戶端都需要經過Load balance。因此LB角色的服務器處理請求的壓力很大

技術分享圖片
LVS IP Tunnel模式
需要有一個公共ip配置在分發器和所有rs角色上,公用的ip稱做為VIP
客戶端請求目標IP為vip,分發器接收請求數據包後,會對數據包的ip報頭進行再次封裝,會把目標ip的報頭外再加上一層rs的ip報頭(根據算法來選擇封裝成的rs的IP報頭),這樣用戶請求的數據包就會被發送到rs角色上
rs接收數據包後,會解包數據包,所有報頭解開後,原始IP報頭為VIP,因為所有的rs上都配置有VIP,所以tcp協議會認為數據傳輸正確,然後交給rs處理。而每個rs又都配有公網ip,當數據請求完成後,rs會直接通過自己的IP+封裝VIP報頭把數據直接返回給客戶端,這樣數據返回給客戶端時不需要經過Load Balancer了,減小了分發器的處理壓力
技術分享圖片

LVS DR模式
需要一個公共公用的IP設置為VIP,同樣所有的rs上都配置這個VIP
和IP Tunnel不同的是,它會把數據包的MAC地址修改為RS的MAC地址,rs接收到數據包後,會處理數據包,解析出原始的ip報頭得出原始的IP,因為rs上配置了這個VIP,所以rs會處理該數據包的請求
技術分享圖片

LVS算法

輪詢分發 ?Round-Robin ?rr
加權輪詢 Weight Round-Robin wrr
最小鏈接 Least-Connection lc
加權最小鏈接 Weight?Least-Connection wlc
基於局部性的最小連接 ?Locality-Based Least Connection lblc
帶復制的基於局部性最小鏈接 Locality-Based Least Connection with Replication lblcr
目標地址散列調度 Destination Hashing dh
原地址散列調度 Source Hashing ?sh
最常用的是前面四種,根據服務器實際情況,加權分配可以對配置高處理請求能力強的服務器分配更多的請求數,這樣可以充分利用服務器的資源,避免資源空閑

LVS NAT模式

分發器內網:192.168.1.220 ?外網192.168.182.130 ?
rs1內網192.168.1.223
rs2內網192.168.1.234
rs角色設置網卡的網關為192.168.1.220,用於NAT內網通信
所有角色上執行關閉防火墻規則,並保存配置的操作,防止因防火墻規則造成的無法訪問站點的問題

[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
[[email protected] ~]# systemctl start iptables
[[email protected] ~]# iptables -F
[[email protected] ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 確定 ]

在分發器dir上安裝ipvsadm

[email protected] ~]# yum install -y ipvsadm
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
base | 3.6 kB 00:00:00 ? ? 
epel | 3.2 kB 00:00:00 ? ? 
extras ? ? ? 
-----------------省略
Downloading packages:
ipvsadm-1.27-7.el7.x86_64.rpm | 45 kB 00:00:00 ? ? 
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安裝 : ipvsadm-1.27-7.el7.x86_64 1/1 
  驗證中 : ipvsadm-1.27-7.el7.x86_64 1/1 

已安裝:
  ipvsadm.x86_64 0:1.27-7.el7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

完畢!

在dir分發器上編寫路由轉發的內核配置和iptables配置,內核開啟路由轉發需要指定對應的網卡,這裏需要註意服務器實際的網卡名稱

#! /bin/bash
#在系統內核配置中開啟路由轉發,轉發需要註意自己服務器真實網卡名稱
echo 1 > /proc/sys/net/ipv4/ip_forward 
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens36/send_redirects
#清空iptables規則,並配置nat表在POSTROUTING鏈中對192.168.1.0網段進行數據包的轉發
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE ?
#配置ipvsadm,這裏設置的是加權最少鏈接輪詢的方式。ipvsadm配置指定dir外網ip對應內網的rs角色ip,-w並指定被輪詢的次數
IPVSADM=‘/usr/sbin/ipvsadm‘
$IPVSADM -C 
$IPVSADM -A -t 192.168.182.130:80 -s wlc -p 3
$IPVSADM -a -t 192.168.182.130:80 -r 192.168.1.223:80 -m -w 1
$IPVSADM -a -t 192.168.182.130:80 -r 192.168.1.234:80 -m -w 1

查看ipvsadm的輪詢配置

[[email protected] src]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 ?-> RemoteAddress:Port ? ? ? ? ? Forward Weight ActiveConn InActConn
TCP ?192.168.182.130:http wlc persistent 3
 ?-> 192.168.1.223:http ? ? ? ? ? Masq ? ?1 ? ? ?0 ? ? ? ? ?0 ? ? ? ? 
 ?-> 192.168.1.234:http ? ? ? ? ? Masq ? ?1 ? ? ?0 ? ? ? ? ?0 ? ?

在rs上將網卡的網關設置為dir的內網ip,這樣就能讓iptables規則從192.168.249.129把訪問請求轉發給192.168.1.0網段的80服務器端口
如rs1的修改操作

[[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=enp0s3
UUID=bf8adc16-a9c3-494a-b47e-f572fad38639
DEVICE=enp0s3
ONBOOT=yes
IPADDR=192.168.1.234
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.220
DNS2=119.29.29.29

rs的網關設置為dir的ip後,rs不能夠鏈接外部網絡了,需要配置iptables轉發規則,對內網數據進行轉發,dir分發器對內網的數據進行轉發處理。處理完的數據發送給dir分發器,再由分發器返回給用戶端進行響應

訪問測試

先在dir上對後端的兩臺web服務進行測試訪問,dir到後端web是屬於一個網段的,這裏必須要保證dir到web之間的鏈路要通信正常

[[email protected] src]# curl -I 192.168.1.223
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sun, 09 Sep 2018 02:52:48 GMT
Content-Type: text/html
Content-Length: 3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
Connection: keep-alive
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
?
[[email protected] src]# curl -I 192.168.1.234
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sun, 09 Sep 2018 10:53:10 GMT
Content-Type: text/html
Content-Length: 3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
Connection: keep-alive
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes

dir到web間的網絡正常後,再測試ipvsadm的負載均衡轉發,這裏需要保證dir測試的機器和客戶端間是可以訪問的,可以在瀏覽器中訪問,為了區分負載均衡,這裏將1.223和1.234寫入不同的網頁顯示內容,方便區分

[[email protected] src]# curl 192.168.182.130
host2
[[email protected] src]# curl 192.168.182.130
host1
[[email protected] src]# curl 192.168.182.130
host2
[[email protected] src]# curl 192.168.182.130
host1

測試時ipvsadm的-p選項是指定多長時間內同一用戶訪問分配到同一臺服務器進行處理,測試時去掉-p參數,也就是讓訪問不同web服務器的時候沒有等待時間及緩存

LVS負載均衡介紹和配置