一、簡介
LVS:Linux Virtual Server,負載調度器,內核集成,章文嵩,阿里的四層SLB(Server LoadBalance)是基 于LVS+keepalived實現
LVS 官網: http://www.linuxvirtualserver.org/
二、LVS運行原理
2.1LVS 的集群結構
2.2lvs相關概念
- RS:Real Server
- CIP:Client IP
- VIP: Virtual serve IP VS(連接)外網的IP
- DIP: Director IP VS內網的IP
- RIP: Real server IP
訪問流程:CIP ->VIP == DIP-> RIP
2.3LVS的集群類型
- lvs-nat:修改請求報文的目標IP,多目標IP的DNAT
- lvs-dr: 操縱封裝新的MAC地址
- lvs-tun:在原請求IP報文之外新加一個IP首部
- lvs-fullnat: 修改請求報文的源和目標IP
以上4種類型前2種常用
2.3.1nat模式
lvs-nat:本質是多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為某挑出的RS的RIP和PORT實現轉發
2.3.1.1nat模式流程圖
- 客戶端發送訪問請求,請求數據包中含有請求來源(cip),訪問目標地址(VIP)訪問目標端口
- VS服務器接收到訪問請求做DNAT把請求數據包中的目的地由VIP換成RS的RIP和相應端口
- RS1相應請求,發送響應數據包,包中的相應保溫為數據來源(RIP1)響應目標(CIP)相應端口
- VS服務器接收到響應數據包,改變包中的數據來源(RIP1-->VIP),響應目標端口(9000-->80)VS服務器把修改過報文的響應數據包回傳給客戶端
- lvs的NAT模式接收和返回客戶端數據包時都要經過lvs的調度機,所以lvs的調度機容易阻塞
2.3.1.2模擬lvs-nat集群實驗(三層IP和四層端口)
實驗前準備
設備名稱 | IP |
---|---|
client | 172.25.250.111 |
lvs | 172.25.250.100(VIP|NAT)、192.168.252.100(DIP|僅主機) |
rs1 | 192.168.252.10 |
rs2 | 192.168.252.20 |
設備的相關配置
lvs 調度器
#配置VIP和DIP(雙網卡)
DIP
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.252.100/24
method=manual#VIP
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=172.25.250.100/24,172.25.250.2
method=manual#激活VIP和DIP
nmcli connection reload
nmcli connection up eth0
nmcli connection up eth1#安裝ipvsadm
dnf install ipvsadm -y#編寫調度策略
ipvsadm -A -t 172.25.250.100:80 -s rr
ipvsadm -a -t 172.25.250.100:80 -r 192.168.252.10:80 -m
ipvsadm -a -t 172.25.250.100:80 -r 192.168.252.20:80 -m
ipvsadm-save / /etc/sysconfig.conf/ipvsadm
#查看調度策略
ipvsadm -Ln #開啟路由內核轉發功能
vim /etc/sysctl.conf net.ipv4.ip_forward=1
sysctl -p
rs1/2
#配置RIP
#RIP
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.252.20/24,192.168.252.100 #lvs上僅主機的網卡上的IP
method=manual#激活rip
nmcli connection reload
nmcli connection up eth0
測試
用client測試得到以下結果
2.3.2LVS-DR模式
DR:Direct Routing,直接路由,LVS默認模式,應用最廣泛,通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變
2.3.2.1DR模式流程圖
在DR模式中,RS接收到訪問請求后不需要回傳給LVS調度器,直接把回傳數據發送給client,所以RS和Lvs上都要有vip
- 客戶端發送數據幀給Lvs調度主機幀中內容為客戶端IP+客戶端的MAC+VIP+VIP的MAC
- LVS調度主機接收到數據幀后把幀中的VIP的MAC該為RS1的MAC,此時幀中的數據為客戶端IP+客戶端的MAC+VIP+RS1的MAC
- RS1得到2中的數據包做出響應回傳數據包,數據包中的內容為VIP+RS1的MAC+客戶端IP+客戶端IP的MAC
2.3.2.2模擬DR集群實驗(玩二層MAC地址)
實驗前準備
設備名稱 | IP |
---|---|
172.25.250.111 | client客戶端 |
172.25.250.100(nat)/192.168.252.100(僅主機) | router的雙網卡對應的ip |
192.168.252.111 | lvs的DIP |
192.168.252.10 | RS1-rip |
192.168.252.20 | RS2-rip |
192.168.252.200 | 集群對外的VIP |
相關設備的配置
client
僅需修改網關,把網關設置為routernat網卡上的IPvim /etc/NetworkManager/system-connections/eth0.nmconnection[connection]id=eth0type=ethernetinterface-name=eth0[ethernet][ipv4]address1=172.25.250.111/24,172.25.250.100method=manual
router
#開啟內核路由轉發sysctl -a | grep ipv4.ip_forward
net.ipv4.ip_forward = 1
sysctl -p #開啟防火墻和地址偽裝
systemctl start firewalld
firewall-cmd --add-masquerade #地址偽裝
lvs-dr
#配置DIP和VIP
DIP
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address0=192.168.252.111/24,192.168.252.100 #把網關設置為router僅網卡設備上的IP
====================================================================
VIP
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address0=192.168.252.200/32
address1=127.0.0.1/8
====================================================================
#激活DIP和VIP
nmcli connection reload
nmcli connection up eth0
nmcli connection up eth0 #可能會遇到激活網卡后無VIP情況,需要看網卡設備激活狀況
nmcli connection show
# 編寫調度策略
ipvsadm -A -t 192.168.252.200:80 -s rr
#-A:添加策略 -t:tcp IP:虛擬IP -s:調度算法 -rr:輪詢
#調度后端真實服務器
ipvsadm -a -t 192.168.252.200:80 -r 192.168.252.10:80 -g
ipvsadm -a -t 192.168.252.200:80 -r 192.168.252.20:80 -g#調度策略做永久保存
ipvsadm-save > /etc/sysconfig/ipvsadm
[root@dr-lvs system-connections]# cat /etc/sysconfig/ipvsadm
-A -t dr-lvs:http -s rr
-a -t dr-lvs:http -r 192.168.252.10:http -g -w 1
-a -t dr-lvs:http -r 192.168.252.20:http -g -w 1#重啟服務
systenctl start ipvssadm
#關閉防火墻
RS1/2
#配置RIP和VIP
#RIP
[connection]
id=eth0
uuid=7ba00b1d-8cdd-30da-91ad-bb83ed4f7474
type=ethernet
interface-name=eth0
timestamp=1752646309[ipv4]
address1=192.168.252.20/24,192.168.252.100
dns=8.8.8.8;
method=manual#VIP
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
address1=192.168.252.200/32
address2=127.0.0.1/8
method=manual
#開啟arp抑制,防止客戶端請求穿透LVS的調度策略,直接訪問后端服務器
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
#net.ipv4.conf.all.arp_announce = 2
#net.ipv4.conf.all.arp_announce =1
#arp_announce 只響應同本機所有接口 arp_ignore 忽略arp報文
測試
排錯過程:
得出后端真實服務器的web沒有啟動
2.3.3實驗過程中的問題和排錯
2.3.3.1問題
可能會出現VIP配置沒問題,但是查不到vip的情況
原因之前激活過的網卡已占用設備位置,所以需要把之前激活的網卡刪除再重新激活后配置的網卡
執行nmcli connection delete 加上已占用網卡的uuid?
? ? ? ? nmcli connection up lo
排錯:
- 后端服務器的防火火墻未關閉
- 后端web服務沒有起/網關
- 配置的ip沖突
- 編寫策略有問題,是基于VIP去調度后端真實服務器
2.3.4TUN模式(了解)
轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP)
2.3.4.1TUN模式流程圖
- 客戶端發送請求數據包,包內有源IP+vip+dport
- 到達vs調度器后對客戶端發送過來的數據包重新封裝添加IP報文頭,新添加的IP報文頭中包含TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并發送到RS1
- RS收到VS調度器發送過來的數據包做出響應,生成的響應報文中包含SRCIP(VIP)+DSTIP(CIP)+port,響應數據包通過網絡直接回傳給client
2.3.4.2TUN模式的特點
- DIP, VIP, RIP都應該是公網地址
- RS的網關一般不能指向DIP
- 請求報文要經由Director,但響應不能經由Director
- 不支持端口映射
- RS的OS須支持隧道功能
2.3.5fullnet模式(了解)
2.3.5.1fullnet流程圖
fullnat:通過同時修改請求報文的源IP地址和目標IP地址進行轉發
CIP --> DIP
VIP --> RIP
2.3.6LVS工作模式總結
NAT模式 | TUN模式 | DR模式 | |
RS操作系統 | 不限 | 支持隧道 | 禁用arp |
調度器和服務器網絡 | 可跨網絡 | 可跨網絡 | 不可跨網絡 |
調度服務器數量服務器數量 | 少 | 多 | 多 |
RS服務器網關 | 指向到調度器DIP | 指向到路由 | 指向到路由 |
2.4LVS調度算法
靜態算法:
RR | roundrobin 輪詢 RS分別被調度,當RS配置有差別時不推薦 |
WRR | Weighted RR,加權輪詢根據RS的配置進行加權調度,性能差的RS被調度的次數少 |
SH | Source Hashing,實現session sticky,源IP地址hash;將來自于同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定 |
DH | Destination Hashing;目標地址哈希,第一次輪詢調度至RS,后續將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡,如:寬帶運營商 |
動態算法:
LC | least connections(最少鏈接發) 適用于長連接應用Overhead(負載值)=activeconns(活動鏈接數) x 256+inactiveconns(非活動鏈接數) |
WLC | Weighted LC(權重最少鏈接) 默認調度方法Overhead=(activeconns x 256+inactiveconns)/weight |
SED | Shortest Expection Delay, 初始連接高權重優先Overhead=(activeconns+1+inactiveconns) x 256/weight 但是,當node1的權重為1,node2的權重為10,經過運算前幾次的調度都會被node2承接 |
NQ | Never Queue,第一輪均勻分配,后續SED |
LBLC | Locality-Based LC,動態的DH算法,使用場景:根據負載狀態實現正向代理 |
LBLCR | LBLC with Replication,帶復制功能的LBLC,解決LBLC負載不均衡問題,從負載重的復制到負載輕的RS |