lvs簡介
Linux 虛擬服務器(Linux Virtual Servers,LVS) 使用負載均衡技術將多臺服務器組成一個虛擬服務器。它爲適應快速增長的網絡訪問需求提供了一個負載能力易於擴展,而價格低廉的解決方案。
名詞說明
單詞 | 說明 |
---|---|
LB | 負載均衡器 |
VIP | 負載均衡器IP地址,作爲訪問入口 |
CIP | 客戶端IP |
RIP | 真實服務器地址 |
RS | 真實服務器 |
LVS結構與工作原理
1、LVS的結構
虛擬服務器的體系結構如圖所示,一組服務器通過局域網或廣域網相連接,前端有一個負載調度器(Load Balancer), 負載均衡器將網絡請求調度至真實服務器 (Real Server RS)羣 上,LVS這種結構對用戶來說是透明的,用戶訪問只能看到一臺作爲LB的虛擬服務器 (virtual server VS), 當用戶請求發往RS, LB根據設定的包轉發策略和負載均衡調度算法在轉發給RS, RS最終在將用戶請求的結果返回。
2、LVS內核模型
首先lvs是基於tcp四層傳輸層協議,它根據請求報文的目標IP和PORT將其轉發至後端主機集羣中的某一臺主機(根據挑選算法)
- 當客戶端的請求到達 LB 的內核空間時,首先會到達 PREROUTING鏈
- 當內核發現請求數據包的 目的地址是本機 時, 將數據包送往 INPUT鏈
- LVS由 用戶空間的 ipvsadm 和 內核空間的IPVS 組成, ipvsadm 用來定義規則, IPVS利用ipvsadm定義的規則工作, IPVS工作在INPUT鏈, 當數據包到達INPUT鏈時, 首先會被IPVS檢查, 如果數據包裏的 DIP和端口沒有在規則裏面,那麼這條數據包將會放行至用戶空間
- 如果數據包 DIP及端口在規則裏, 那麼該數據報文將被修改目的地址爲事先定義好的後端服務器 ( RS ),並送往POSTROUTING 鏈
- 最後經由 POSTROUTING鏈 發往後端服務器
3、LVS包轉發模型
3.1、NAT模型
3.1.1、NAT工作原理
- client 將請求發往最前端的 LB, 請求報文源地址是 CIP,目標地址爲 VIP
- LB收到報文後,發現請求的是規則裏面存在的地址,它將客戶端請求報文的目標地址改爲了後端服務器的 RIP 並將報文根據算法發送出去
- 報文送到 RS 後, 由於報文地址是自己,所以會響應該請求,並將響應報文還給LVS
- 最後LVS 將此報文的源地址修改爲本機(vip) 併發送給客戶端, 注: 在NAT模式中,RS網關必須指向LVS,否則報文無法送到客戶端
3.1.2、特性
- 請求和響應的報文都得經過 Director ,在高負載場景中, Director 很可能成爲性能瓶頸
- RS和DIP應該使用私網地址,且RS的網關必須指向DIP;
- RS的RIP和Directory的DIP必須在同一IP網絡;
- RS可以使用任意OS;
- 支持端口映射
3.2、DR模型
3.2.1、DR工作原理
- client 將請求發往最前端的 LB, 請求報文源地址是 CIP,目標地址爲 VIP
- LB 收到報文後, 發現請求的是規則裏面存在的地址, 那麼它將客戶端請求報文的源MAC地址改成自己DIP的MAC地址, 目標MAC改爲了RIP的MAC地址,並將此包發送給RS
- RS 發現請求報文中的目的MAC是自己, 就會將該報文接收下來,處理完請求報文後,將響應請求通過lo接口 送給eth0網卡 直接發送給客戶端, 注: 需要設置lo接口的VIP不能響應本地網絡內的arp請求, 使用最多還是這種, NAT調度器模型會有性能瓶頸
3.2.2、特性
- RS 可以使用私有地址,還可以使用公網地址,此時可以直接通過互聯網連入 RS ,以實現配置、監控等
- RS 的網關一定不能指向 DIP
- RS 跟 Dirctory 要在同一物理網絡內(不能有路由器分隔) dip 跟 rip 最好在同一網絡內
- 請求報文經過 Directory ,但響應報文一定不經過 Director
- 不支持端口映射
3.3、TUN模型
- client 將請求發往最前端的 LB, 請求報文源地址是 CIP,目標地址爲 VIP
- LB 收到報文後, 發現請求的是規則裏面存在的地址,那麼它將在客戶端請求報文的首部再封裝一層IP報文, 將源地址改爲 DIP,目標地址改爲 RIP, 並將此包發送給RS
- RS收到請求報文後,會首先拆開第一層封裝,然後發現裏面還有一層IP首部的目標地址是自己lo接口上的vip,所以會處理此次請求報文,並將響應報文通過lo接口送給eth0網卡 直接發送給客戶端。 注: 需要設置lo接口的VIP不能在公網上出現
4、LVS調度算法
LVS的調度算法分爲靜態與動態兩類
4.1、靜態算法(4種)
只根據算法進行調度 而不考慮後端服務器的實際連接情況和負載情況
-
RR: 輪詢調度(Round Robin)
調度器通過 "輪叫" 算法將外部請求按順序輪流分配到集羣中的RS上, 它均等對待每一臺服務器,而不會考慮服務器的實際連接數及系統負載。
-
WRR: 加權輪詢 (Weight RR)
調度器通過 "加權輪叫" 算法根據RS的不同處理能力來調度訪問請求, 調度器可以自動問詢RS的負載情況並動態調整其權值, 注:需要根據服務性能來手動控制其權重。
-
DH: 目標地址散列調度 (Desination Hash)
根據請求的目標IP地址, 作爲散列鍵 從 靜態分配的散列表找出對應服務器, 若該服務器是可用的且未超載, 則將請求發送到該服務器,否則返回空。
-
SH: 源地址hash
"源地址散列" 算法根據請求的源IP地址, 作爲散列鍵 從 靜態分配的散列表找出對應服務器, 若該服務器是可用的且未超載, 則將請求發送到該服務器,否則返回空。
4.2、動態算法(6種)
前端的調度器根據後端RS的實際連接情況來進行動態分配請求
-
LC: 最少連接(Least Connections)
調度器通過 "最少連接" 調度算法 將網絡請求調度到已建立鏈接數最少的服務器上,如果集羣系統的RS具有相近的系統性能,採用 "最少連接" 算法可以較好的負載均衡
-
WLC: 加權最少連接(默認採用的就是這種) (Weighted Least Connections)
在集羣系統中的服務器性能差異較大的情況下, 調度器採用 "加權最少連接" 調度算法 優化負載均衡性能,具有較高權值的服務器將隨較大比例的活動連接負載, 調度器可以自動問詢真實服務器的負載情況 並動態地調整其權值
-
SED:最短延遲調度(Shortest Expected Delay )
在WLC基礎上改進, Overhead = (ACTIVE +1) * 256/加權, 不在考慮非活動狀態, 把當前處於活動狀態的數目+1來實現,數目最小的接受下次請求, +1的目的是爲了考慮加權的時候,非活動連接過多缺陷,當權限過大的時候,會倒置空閒服務器一直處於無連接狀態
-
NQ: 永不排隊/最少隊列調度(Never Queue Scheduling NQ)
-
LBLC:基於局部性的最少鏈接(locality-Based Least Connections)
- LBLCR:帶複製的基於局部性最少連接(Locality-Based Least Connections with Replication)
5、LVS
5.1、LVS組件
# 安裝: ~]# yum -y install ipvsadm
ipvsadm (定義集羣服務寫規則) /ipvs (工作於內核中INPUT鏈)
ipvsadm: 用戶空間的命令行工具,用於管理集羣服務(增刪查改)
ipvs: 工作於內核中 netfilter INPUT 鉤子上:
5.1.1、ipvsadm用法
-
管理集羣服務
管理集羣服務 ipvsadm -A|E -t|u|f service-address [-s scheduler] ipvsadm -D -t|u|f service-address -A: 添加一個集羣服務 -t : tcp -u : udp -f : firewall make 通常應用於將兩個或以上的服務綁定爲一個服務進行處理時使用 service-address tcp: -t ip:port udp: -u ip:port fwm: -f mark 防火牆標記 -s scheduler 默認爲wlc 如 添加: ~]# ipvsadm -A -t VIP地址:端口 -s rr 刪除: ~]# ipvsadm -D -t VIP地址:端口
-
管理集羣服務中的RS
管理集羣服務中的RS ipvsadm -a|e -t|u|f service-address -r server-address ipvsadm -d -t|u|f service-address -r server-address server-address: ip[:port] 端口一般可省略 lvs-type: -g: gateway, dr -i:ipip, tun -m: masquerade, net 添加: ~]# ipvsadm -a -t vip地址:端口號 -r 真實地址:端口 -m 刪除: ~]# ipvsadm -d -t VIP地址:端口 -r 192.168.9.32:80
-
通用查看命令
ipvsadm -C 清空所有 ipvsadm -L|l [options] 查看 -n: numeric, 基於數字格式顯示地址和端口: -c: connection, 顯示連接 --stats: 統計數據 --rate: 速率 --sort: 排序 --exact: 顯示精確值 ipvsadm -R 重載 ipvsadm -S [-n] 保存 ipvsadm -Z [-t|u|f service-address] 置零記數器
5.2、lvs-nat配置
LVS配置
echo "1" > /proc/sys/net/ipv4/ip_forward #開啓LVS服務器的IP路由轉發功能
# 添加虛擬地址
~]# ifconfig ens160:1 192.168.9.111 netmask 255.255.255.0
~]# ip addr
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 192.168.9.224/24 brd 192.168.9.255 scope global ens160
valid_lft forever preferred_lft forever
inet 192.168.9.111/24 brd 192.168.9.255 scope global secondary ens160:1
~]# ipvsadm -a -t 192.168.9.111:999 -r 192.168.9.31:80 -m
~]# ipvsadm -a -t 192.168.9.111:999 -r 192.168.9.32:80 -m
# 查看地址
~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.9.111:999 rr
-> 192.168.9.31:80 Masq 1 0 0
-> 192.168.9.32:80 Masq 1 0 0
RS配置
# 必須將網關地址指向DIP
# 啓動服務即可, systemctl restart nginx
測試
~]# for i in {1..10};do curl http://192.168.9.111:999;sleep 2;done
192.168.9.32
192.168.9.31
192.168.9.32
192.168.9.31
....
~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.9.111:garcon rr
-> 192.168.9.31:http Masq 1 0 15
-> 192.168.9.32:http Masq 1 0 15
5.3、lvs-dr配置
重要參數
兩個內核參數
/proc/sys/net/ipv4/conf/lo/
/proc/sys/net/ipv4/conf/all/
arp_annonce (通告)
0 : 通告所有的地址
1 : 儘量避免向本網段地址通告
2 : 總是用最佳本地地址通告
arp_ignore
0 : 通告所有
1 : 請求報文是從哪接口進入,從哪個接口響應
LVS配置
# 配置虛擬地址,廣播地址設置爲自己
~]# ifconfig ens160:1 192.168.9.111 broadcast 192.168.9.111 netmask 255.255.255.0 up
~]# ifconfig ens160:1
ens160:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.9.111 netmask 255.255.255.255 broadcast 192.168.9.111
# 添加路由
~]# ip route add 192.168.9.111 dev ens160:1
~]# ip route show
192.168.9.111 dev ens160 scope link
~]# ipvsadm -A -t 192.168.9.111:999 -s rr # 測試使用輪詢查看效果
~]# ipvsadm -a -t 192.168.9.111:999 -r 192.168.9.31 -g
~]# ipvsadm -a -t 192.168.9.111:999 -r 192.168.9.32 -g
# 需要注意的是 不支持端口映射, 寫了端口也會跟vip端口一樣
~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.9.111:garcon rr
-> 192.168.9.31:garcon Route 1 0 0
-> 192.168.9.32:garcon Route 1 0 0
LVS-DR 後端服務器配置
~]# ifconfig lo:0 192.168.9.111 netmask 255.255.255.255 broadcast 192.168.9.111 up # 配置迴環地址
~]# ifconfig # 查看
# lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
# inet 192.168.9.111 netmask 255.255.255.255
# loop txqueuelen 1000 (Local Loopback)
~]# route add -host 192.168.9.111 dev lo:0 # 添加路由
~]# ip route # 查看路由
# 通告
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
參考文檔:
LVS原理詳解: http://www.178linux.com/13570
Linux服務器集羣系統: http://linux-vs.org/zh/lvs1.html
LVS(NAT和DR)模式詳細配置: https://www.jianshu.com/p/2ed85a5204cc
CentOS 7 網絡配置詳解: https://blog.51cto.com/simonhu/1588971