LO 接口
LVS簡介
LVS(Linux Virtual Server)即Linux虛擬服務器,是由章文嵩博士主導的開源負載均衡項目,通過LVS提供的負載均衡技術和Linux操作系統實現一個高性能、高可用的服務器集群,它具有良好可靠性、可擴展性和可操作性,從而以低廉的成本實現最優的服務性能。目前LVS已經被集成到Linux內核模塊中。該項目在Linux內核中實現了基于IP的數據請求負載均衡調度方案,終端互聯網用戶從外部訪問公司的外部負載均衡服務器,終端用戶的Web請求會發送給LVS調度器,調度器根據自己預設的算法決定將該請求發送給后端的某臺Web服務器,比如,輪詢算法可以將外部的請求平均分發給后端的所有服務器,終端用戶訪問LVS調度器雖然會被轉發到后端真實的服務器,但如果真實服務器連接的是相同的存儲,提供的服務也是相同的服務,最終用戶不管是訪問哪臺真實服務器,得到的服務內容都是一樣的,整個集群對用戶而言都是透明的。最后根據LVS工作模式的不同,真實服務器會選擇不同的方式將用戶需要的數據發送到終端用戶,
LVS工作模式分為NAT模式、TUN模式、以及DR模式。
LVS的IP負載均衡技術是通過IPVS模塊來實現的,IPVS是LVS集群系統的核心軟件,它的主要作用是:安裝在Director Server上,同時在Director Server上虛擬出一個IP地址**,用戶必須通過這個虛擬的IP地址訪問服務**。這個虛擬IP一般稱為LVS的VIP,即Virtual IP。訪問的請求首先經過VIP到達負載調度器,然后由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求。
??當用戶的請求到達負載調度器后,調度器如何將請求發送到提供服務的Real Server節點,而Real Server節點如何返回數據給用戶,是IPVS實現的重點技術,IPVS實現負載均衡機制有三種,分別是NAT、TUN和DR.
LVS 核心組件和專業術語
# 核心組件
LVS 的 管理工具ipvsadm 和 內核模塊 ipvs
ipvsadm :用戶空間的命令行工具,用于管理集群服務及集群服務上的RS(Real Server 后端的真實服務器)等
ipvs: 工作于內核上的程序,可根據用戶定義的集群實現請求轉發# 專業術語
VS:Virtual Server 虛擬服務
DR、DS:Director,Balancer 負載均衡器、分發器
RS:Real Server 后端請求處理的真實服務器
CIP:Client IP 用戶端IP
# 負載均衡器 有兩個IP VIP,DIP
VIP:Director Virtual IP 負載均衡器虛擬IP
DIP: Director IP 負載均衡器IP
RIP: Real Server IP 后端請求處理真實服務器IP
LVS負載均衡器4種工作模式
LVS-NAT 》》網絡地址轉換模式
進站、出站的數據流程都經過DS(DR)負載均衡器(IP負載均衡,修改的是IP地址),利用網絡層(四層)
支持端口映射
NAT模式支持對IP地址和端口進行轉換。即用戶請求的端口和真實服務器的端口可以不一致。
LVS-DR》》直接路由模式
只有進站的數據流程經過DS(DR)負載均衡器(數據鏈路層負載均衡,修改的是目的MAC地址),利用數據鏈路層(二層)
不支持端口映射(端口不能修敗)
LVS-TUN 》》隧道模式 三層
不支持端口映射, .RS 的 OS 須支持隧道功能
只有進站的數據流程經過DS(DR)負載均衡器
LVS-full-nat》》雙向轉換模式
通過請求報文的源地址為DIP,目標為RIP來實現轉發 支持端口映射
對應響應報文而言,修改源地址為VIP,目標地址為CIP來實現轉發
資料
網絡地址轉換模式》》NAT模式
資料
原理
DS(DR)負載均衡器把客戶端發來的數據包的IP頭的目標地址,在DS(DR)負載均衡器上換成其中一個RS的IP地址,并發至RS來處理,
RS處理完成后,
把數據交給經過DS(DR)負載均衡器,DS(DR)負載均衡器再把數據包的源IP改成自己的VIP
①源CIP——>目VIP (客戶端向——DS(DR)負載均衡器 通信)
②目VIP——>改成RIP(DS(DR)負載均衡器中做轉換)
(DS(DR)負載均衡器中做轉換)——>RS 通信
③源RIP——>目DIP(RS——負載均衡器 通信)
④源RIP——>改成VIP(處理完成之后,DS(DR)負載均衡器中再轉換)
(DS(DR)負載均衡器中做轉換)——>客戶端通信
優點
集群中的物理服務器(RS服務器),可以使用任何支持TCP/IP操作系統,只有(DS(DR)負載均衡器)需要一個合法的IP(VIP)地址
不足
擴展性有限,當服務器節點(普通PC服務器)增長過多時,(DS(DR)負載均衡器)將成為整個系統的瓶頸,因為所有的請求包和應答包的流向都經過(DS(DR)負載均衡器)。當服務器節點過多時,大量的數據包都交會在(DS(DR)負載均衡器),速度就會變慢
直接路由模式》》DR 模式
直接路由模式則應該是工作在數據鏈路層上(二層)
同一個網段的設備之間通信,可用MAC直接通信
不同網段的設備之間通信,必須借助網關
arp協議
資料
1、當用戶請求到達Director Server (DS,負載均衡器),此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP;
2、檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈;
3、IPVS比對數據包請求的服務是否為集群服務,若是,將請求報文中的源MAC地址修改為DIP的MAC地址,將目標MAC地址修改RIP的MAC地址,然后將數據包發至POSTROUTING鏈。 此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址;
4、由于DS和RS在同一個網絡中,所以是通過二層,數據鏈路層來傳輸。POSTROUTING鏈檢查目標MAC地址為RIP的MAC地址,那么此時數據包將會發至Real Server;
5 、RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文。處理完成之后,將響應報文通過lo接口傳送給eth0網卡(ens網卡)然后向外發出。 此時的源IP地址為VIP,目標IP為CIP;
6、響應報文最終送達至客戶端。
# DR 原理
DS(DR)負載均衡器和RS都使用同一個IP(即VIP)對外服務,但只有DS(DR)負載均衡器對ARP請求進行響應,所有RS對本身這個IP(VIP)的ARP請求保持靜默(就是不理它),也就是說,網關會把這個服務IP(VIP)的請求全部定向給DS(DR)負載均衡器,而DS(DR)負載均衡器收到數據包后根據調度算法(當然前提IPVS會判斷是否是集群,只有集群才會用到調度算法了)。找出對應的RS,
把, 源MAC(即CIP的MAC)————>改成DIP的MAC, 目的MAC(即VIP的MAC)————>改為RS的RIP的MAC,并將請求分發給這臺RS。這時RS收到這個數據包,處理完成之后,由于IP(VIP)是一致,可以直接將數據返給客戶端,則等于直接從客戶端接收到這個數據包無異,處理后直接返回給客戶端。
**優點:**與TUN模式(隧道模式)一樣,DS(DR)負載均衡器也只是分發請求,應答包通過單獨的路由方法返回客戶端,與TUN相比,DR模式不需要隧道結構,因此可以使用大多數操作系統做為物理服務器
**不足:**要求DS(DR)負載均衡器的網卡必須與物理網卡在一個網段上(DS(DR)負載均衡器到RS 是通過MAC地址通信的)。
# DR模式的特點
1、DS(DR)和所有RS 都要配置 VIP
2、RS的RIP 可以使用私有IP,也可以共有IP,RIP、DIP要在同一網段(因為需要通過MAC通信)
3、RIP的網關不能指向DIP,以確保響應報文不會通過DS(DR)負載均衡器,減少流量。
4、RS和DS(DR)負載均衡器要在同一個物理網絡
5、請求報文經過DS(DR)負載均衡器,但響應報文不經過DS(DR)負載均衡器,而由RS直接發往請求方(client端)
TUN 隧道模式
資料
# 原理:
互聯網上的大多數Internet服務的請求包很短小,而應答包通常很大。這種就是隧道模式(TUN)
把客戶端發來的數據包,**封裝**一個新的IP頭標記(僅目的IP)發給RS,RS收到后,先把數據包的頭解開,還原數據包,處理后,直接返回客戶端
不需要再經過負載均衡器。
注意:由于RS需要對負載均衡器發過來的數據包進行還原,所以說必須支持IPTunnel協議。所以,在RS的內核中,必須編譯支持IPTunnel這個選項
優點:
負載均衡器只負責將請求包分發給后端節點服務器(RS服務),而RS將應答包直接發給用戶。
所以,減少了負載均衡器的大量數據流動,負載均衡器不再是系統的瓶頸,就能處理巨大的請求量,
這種方式,一臺負載均衡器能夠為很多RS進行分發。而且**跑在公網上就能進行不同地域的分發**
缺點:
TUN隧道模式的RS節點都需要合法IP(公網IP),這種方式需要所有服務器支持IP Tunneling 協議,服務器可能只局限在部分Linux系統上
LVS-DR 模式 案例
# 準備三臺Ubuntu系統,上網模式,橋接模式,可以通過VM中創建
#
# 關閉 防火墻
ufw disable
# 修改主機名,和IP地址
[主機名和IP地址](https://ares-wang.blog.csdn.net/article/details/146230753)所有的Director和RealServer都在同一個物理網絡中。**同一個網段** (VIP,DIP,RIP 要在同一個網段,LVS/DR只支持本地網絡)
》》》DS(DR)負載均衡器 配置
# DS 配置
# 安裝 ipvsadm工具
apt update
apt install ipvsadm
# 在ens3 接口 添加VIP
# 如果VIP配置錯誤,可以刪除 ip addr del IP dev ens33
ip addr add dev ens33 172.XX.XX.140/32
# 啟動
# 如果啟動 錯誤 ① mkdir -p /etc/sysconfig ② ipvsadm -S > /etc/sysconfig/ipvsadm 在啟動
systemctl start ipvsadm
# 添加 添加虛擬服務
# 如果要清除DS虛擬服務器中所有記錄(含虛擬服務) 第一次配置用不到的 ipvsadm -C
#======
### ipvsadm - 大寫字母 管理集群的, 小寫字母管理 真實服務器的
#########
# -s : 算法
#1. 輪詢調度 rr
#2. 加權輪詢 wrr
#3. 最少鏈接 lc
#4. 加權最少鏈接 wlc
# ipvsadm -A -t VIP:端口 -s rr
ipvsadm -A -t 172.XX.XX.140:80 -s rr
# 添加真實服務器 180,104 是真實處理數據的服務器IP 真實服務器后面的80端口,因為我真實服務器用Nginx 做測試的 Nginx 默認端口就是80
# -g # 指定LVS 模式 直接路由模式 (LVS默認模式)
# -r 真實服務器的IP地址
# -t, --tcp-service service-address, 指定虛擬服務為tcp服務 IP地址:端口號
# -a, --add-server為虛擬服務添加一個real server(RS)
# -g, --gatewaying:使用網關(即直接路由DR),此模式是默認模式。
ipvsadm -a -t 172.XX.XX.140:80 -r 172.XX.XX.180:80 -g
ipvsadm -a -t 172.XX.XX.140:80 -r 172.XX.XX.104:80 -g
# 保存
ipvsadm -S > /etc/sysconfig/ipvsadm
# 啟動systemctl start ipvsadm
# 查看
# -L|-l # 顯示內核虛擬服務器列表
# -n # 以為數字形式輸出端口號
ipvsadm -ln
》》》配置 RS真實服務器
# RS配置 每個真實服務器都有配置
# VIP 是lo 接口 在lo接口上綁定VIP
# 刪除 VIP ip addr del dev lo 172.30.164.140/32
ip addr add dev lo 172.XX.XX.140/32
# RS在LO接口配置了VIP,這個同一個網段中就擁有多個VIP(RS中每個都配置VIP,DS也配置VIP)
# 客戶端在網關發送arp廣播需找VIP時,需要RS集群中不接受這個ARP請求,即要關閉ARP響應,ARP靜默
# arp_ignore 設置1,意味著當別人的ARP請求過來的時候,如果接受的設備沒有這個IP,就不做出響應(這個ip在lo接口,lo不說接受設備的進口)
# ARP靜默 臨時
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
# ARP靜默 永久
cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
EOF
sysctl -p# 安裝nginx
apt install nginx & systemctl restart nginx
# 為了能看到數據來源那個服務器,故把默認的Index.html 覆蓋了
# CentOS 路徑 /usr/share/nginx/html
# Ubuntu 路徑 /var/www/html/index.nginx-debian.html
# >> 追加 > 覆蓋
echo "RS-104" > /var/www/html/index.nginx-debian.html
欄位注解
ipvsadm -ln --stats
Conns: 已經轉發過的連接數
InPkts:入包個數
OutPkts:出包個數
InBytes:入流量(字節)
OutBytes:出流量(字節)
ipvsadm -ln --rate
CPS:每秒連接數
InPPS:每秒的入包個數
OutPPS:每秒的出包個數
InBPS:每秒入流量(字節)
OutBPS: 每秒出流量(字節)
LVS-NAT 模式 案例
》》DS(DR)負載均衡器
# 準備三臺Ubuntu系統,上網模式,NAT模式,可以通過VM中創建
#
# 關閉 防火墻
ufw disable
# 修改主機名,和IP地址
[主機名和IP地址](https://ares-wang.blog.csdn.net/article/details/146230753)
使用LVS-NAT模式將需要**兩個不同網段**的IP,一個IP接受外部請求服務,一般為外網ip,此IP稱為VIP,一個IP與后realserver同一地址段,負責相互通信,稱為DIP。后端realserver的網關地址需指向DIP。同時需開啟linux內核的數據包轉發功能
# 因為VIP和RIP是不同的網段,所有達到隱藏真實IP目的
# 啟用IP轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 添加VIP
ip addr add dev ens33 172.XX.XX.140/32
# 添加虛擬服務
ipvsadm -A -t 172.XX.XX.140:80 -s rr
# 添加真實服務器 -m 代表 NAT模式
ipvsadm -a -t 172.XX.XX.140:80 -r 192.168.2.5 -m
ipvsadm -a -t 172.XX.XX.140:80 -r 192.168.2.3-m# 啟動
systemctl start ipvsadm
# 保存 如果保存不了,則要創建文件夾 mkdir -p /etc/sysconfig
ipvsadm -S > /etc/sysconfig/ipvsadm
》》RS服務器配置
# 配置IP地址,網關要指向DIP地址即可。# 安裝nginx測試
apt install nginx & systemctl restart nginx
# 為了能看到數據來源那個服務器,故把默認的Index.html 覆蓋了
# CentOS 路徑 /usr/share/nginx/html
# Ubuntu 路徑 /var/www/html/index.nginx-debian.html
# >> 追加 > 覆蓋
echo "RS-104" > /var/www/html/index.nginx-debian.html
LVS-TUN:隧道模式
LVS/TUN與 LVS/DR 類似。只是在報文外面再加一層IP封裝,整個過程比LVS/DR模式多一次報文的封裝/解封過程。不同:LVS/DR只支持本地網絡,LVS/TUN卻可以跨機房用內網測試,RIP、DIP 屬于同一個網段
我用的是私有的
RS1——RIP:192.168.2.3 網關 192.168.2.1
RS2——RIP:192.168.2.5 網關 192.168.2.1
DS-DIP:192.168.2.4 網關 192.168.2.1
# 在NAT中 RS 中RIP 網關要指向DIP,但TUN模式不可以的
》》DS(DR)負載均衡器
# 加載內核模塊modprobe ip_vsmodprobe ip_vs_rrmodprobe ip_vs_wrrmodprobe ip_vs_shmodprobe tun
# 啟用IP轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 配置VIP
sudo ip addr add 172.XX.XX.140/32 dev ens33
# 配置LVS規則 ipvsadm -A -t 172.XX.XX.140:80 -s rr # 使用輪詢調度# -i 是隧道模式# ipvsadm -a -t VIP:端口 -r RIP:端口 -i [-w 1] # -i-->LVS-TUNipvsadm -a -t 172.XX.XX.140:80 -r 192.168.2.5:80 -i # -i 表示 TUN 模式ipvsadm -a -t 172.XX.XX.140:80 -r 192.168.2.3:80 -i
》》》RS服務器
# 安裝
modprobe ipip
# 創建隧道接口 每個RS 只有添加自身的
# ip tunnel add tun0 mode ipip remote DIP local RIP
ip tunnel add tun0 mode ipip remote 192.168.2.4 local 192.168.2.3
ip link set tun0 up
# 配置VIP
ip addr add 172.XX.XX.140/32 dev tun0
# 禁用 ARP 響應 ARP靜默 永久生效
echo 1 | sudo tee /proc/sys/net/ipv4/conf/tun0/arp_ignore
echo 2 | sudo tee /proc/sys/net/ipv4/conf/tun0/arp_announce
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 | sudo tee /proc/sys/net/ipv4/conf/all/arp_announce
# 添加路由
route add -host 172.XX.XX.140 dev tun0# 測試 隧道 如果返回 Real Server 自己的服務(如 Nginx/Apache),說明隧道配置成功。
# curl VIP
curl 172.XX.XX.140
》》RS 持久化
資料
network:renderer: networkdethernets:ens33: # 替換為你的網絡接口名稱dhcp4: false # 關閉 DHCPdhcp6: false # 關閉 DHCPaddresses: [192.168.2.3/24] # 靜態 IP 地址和子網掩碼routes:- to: defaultvia: 192.168.2.1 # 網關地址nameservers:addresses: [8.8.8.8,114.114.114.114] # DNS 服務器地址search: [] tunnels:tun0:mode: ipipremote: 192.168.2.4 # DS負載均衡器的DIPlocal: 192.168.2.3 # 當前RS的RIPaddresses:- 172.30.164.140/32 # VIProutes:- to: 172.30.164.140/32via: 192.168.2.1scope: linkmtu: 1480version: 2
# 在不重啟的情況下,網絡配置 應用
netplan apply
# 驗證上面的持久化
ip ad # 顯示所有的
ip ad show tun0 # 只顯示 tuno接口的
ip route show
上面的虛擬服務器規則 重啟消失了
該方式添加的規則重啟服務器后規則就消失了,因此應該將該規則保存在文件中,待重啟后可以直接從文件中恢復規則
# 保存 如果保存不了,則要創建文件夾 mkdir -p /etc/sysconfig
ipvsadm -S > /etc/sysconfig/ipvsadm# 恢復
ipvsadm -R < /etc/sysconfig/ipvsadm
可以通過systemctl 解決 ipvsadm.service