IPVS基本上是一種高效的Layer-4交換機,它提供負載平衡的功能。當一個TCP連接的初始SYN報文到達時,IPVS就選擇一臺服務器,將報文轉發給它。此后通過查看報文的IP和TCP報文頭地址,保證此連接的后繼報文被轉發到相同的服務器。這樣,IPVS不用檢查到請求的內容再選擇服務器,這就要求后端的服務器組是提供相同的服務,不管請求被送到哪一臺服務器,返回結果都應該是一樣的。但是在有一些應用中后端的服務器可能功能不一,有的是提供HTML文檔的Web服務器,有的是提供圖片的Web服務器,有的是提供CGI的Web服務器。這時,就需要基于內容請求分發 (Content-Based Request Distribution),同時基于內容請求分發可以提高后端服務器上訪問的局部性。
IPVS是LVS的關鍵,因為LVS的IP負載平衡技術就是通過IPVS模塊來實現的,IPVS是LVS集群系統的核心軟件,它的主要作用是:安裝在Director Server上,同時在Director Server上虛擬出一個IP地址,用戶必須通過這個虛擬的IP地址訪問服務。這個虛擬IP一般稱為LVS的VIP,即Virtual IP。訪問的請求首先經過VIP到達負載調度器,然后由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求。
LVS的本身分成了兩個部分,第一部分是工作在內核空間的一個IPVS的模塊(工作在Netfilter框架的input鏈上),其實LVS的功能都是IPVS模塊實現的,第二部分是工作在用戶空間的一個用來定義集群服務的一個工具ipvsadm, 這個工具的主要作用是將管理員定義的集群服務列表傳送給工作在內核空間中的IPVS模塊。
重要命令介紹
ipvsadm常用指令
選項 | 作用 |
---|---|
-A | 添加虛擬服務節點 |
-D | 刪除虛擬服務節點 |
-L | 查看虛擬服務節點列表 |
-n | 以數字形式顯示查看內容 |
-a | 添加真實服務節點 |
-d | 刪除真實服務節點 |
-l | 查看真實服務節點列表 |
-t | 指定虛擬服務器IP地址 |
-s | 指定調度算法 |
-r | 指定真實服務器節點IP地址 |
-w | 指定權重值 |
-g | 直接路由模式(默認) |
-m | NAT模式 |
-i | 隧道模式 |
NAT模式
工作原理
- 當用戶的請求到達調度器時,請求報文會先到內核空間的PREROUTING鏈上。此時報文的源IP為CIP,目標IP為VIP
- PREROUTING檢查發現數據包的目標IP是本機,就將數據包送至INPUT鏈。
- IPVS工作在INPUT鏈上,當數據包抵達INPUT鏈后,IPVS會檢查數據包所請求的服務是否為集群服務,若是,修改數據包的目標IP地址為后端服務器RIP,然后將數據包送往 POSTROUTING鏈。此時報文的源IP為CIP,目標IP為RIP。
- POSTROUTING鏈通過選路,將數據包轉發給Real Server
- Real Server對比發現目標IP是自己,就會接受這個請求報文,開始構建響應報文發回給調度器。源IP為RIP,目標IP為CIP
- 調度器在響應客戶端前,會將報文的源IP地址修改為自己的VIP,然后響應給客戶端。此時報文的源IP為VIP,目標IP為CIP
LVS調度器(DS)配置
# 安裝對應模塊
yum -y install ipvsadm nginx tcpdump# 開啟路由功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p# 加載ip_vs模塊
modprobe ip_vs
lsmod | grep ip_vs# 啟動ipvsadm服務,創建文件必須先創建
touch /etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm# 配置分配策略
ipvsadm -A -t 192.168.100.100:80 -s rr
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.1:80 -m
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.1:80 -mipvsadm-save > /etc/sysconfig/ipvsadm
真實服務器(RS)端配置
yum -y install epel-release nginx tcpdumpsystemctl start nginx# 配置指定IP 192.168.100.1 192.168.100.2 ,且將網關指定為 192.168.100.100# 192.168.100.1
echo web1 > /usr/share/nginx/html/index.html
# 192.168.100.2
echo web2 > /usr/share/nginx/html/index.html
DR模式
工作原理
- 當客戶端用戶發送請求給網站時,首先經過 DNS 解析到 IP 后并向百度服務器發送請求,數據包經過 LVS 負載均衡服務器。
- 這時到達 LVS 網卡時的數據包包括:源 IP 地址(客戶端地址)、目的 IP 地址(百度對外服務器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 連接路由器的 MAC 地址)、目標 MAC 地址(VMAC / VIP 對應的 MAC 地址)。
- 數據包到達網卡后,經過鏈路層到達 PREROUTING 鏈,進行查找路由,發現目的 IP 是 LVS 的 VIP,這時就會發送至 INPUT 鏈中并且數據包的 IP 地址、MAC 地址、Port 都未經過修改。
- 數據包到達 INPUT 鏈中,LVS 會根據目的 IP 和 Port(端口)確認是否為 LVS 定義的服務。
- 如是定義過的 VIP 服務,會根據配置的服務信息,從 RealServer 中選擇一個后端服務器 RS1,然后 RS1 作為目標出方向的路由,確定下一跳信息及數據包通過具體的哪個網卡發出,最好將數據包通過 INET_HOOK 到 OUTPUT 鏈中。
- 數據包通過 POSTROUTING 鏈后,目的 MAC 地址將會修改為 RealServer 服務器 MAC 地址(RMAC)源 MAC 地址修改為 LVS 與 RS 同網段的 IP 地址的 MAC 地址(DMAC)此時,數據包將會發至 RealServer 服務器。
- 數據包到達 RealServer 服務器后,發現請求報文的 MAC 地址是自己的網卡 MAC 地址,將會接受此報文,待處理完成之后,將響應報文通過 lo 接口傳送給 eth0 網卡然后向外發出。
- 此時的源 IP 地址為 VIP,目標 IP 為 CIP,源 MAC 地址為 RS1 的 RMAC,目的 MAC 地址為下一跳路由器的 MAC 地址(CMAC),最終數據包通過 RS 相連的路由器轉發給客戶端。
DS配置
# 刪除NAT模式的路由功能即net.ipv4.ip_forward = 1
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects= 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p# 配置VIP
ifcfg ens33:0 192.168.100.101# ipvsadm 安裝同NAT模式# 配置分配策略
ipvsadm -A -t 192.168.100.101:80 -s rr
ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.1:80 -g
ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.2:80 -gipvsadm-save > /etc/sysconfig/ipvsadm
RS配置
# 啟用nginx同NAT模式,省略# 配置抑制ARP防止VIP在同一網段產生IP地址沖突
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce=2# 為兩臺RS配置臨時虛擬ip并添加路由
ifconfig lo:0 192.168.100.101/32
route add -host 192.168.115.101/32 dev lo:0 # 將訪問交由本機處理后返回
TUNL模式
DS配置
# 安裝ipvsadm 同NAT模式ipvsadm -C# 啟用ipip模塊 使用隧道網卡配置VIP
modprobe ipip
ip addr add 192.168.100.102/24 dev tunl0
ip link set up tunl0
ip route del 192.168.100.0/24 dev tunl0#刪除tunl0路由# 啟用路由功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p# 配置調度策略
ipvsadm -A -t 192.168.100.102:80 -s rr
ipvsadm -a -t 192.168.100.102:80 -r 192.168.100.1:80 -i
ipvsadm -a -t 192.168.100.102:80 -r 192.168.100.2:80 -i
ipvsadm-save > /etc/sysconfig/ipvsadm
RS配置
# 啟用nginx同NAT模式,省略# 啟用ipip模塊 使用隧道網卡配置VIP
modprobe ipip
ip addr add 192.168.100.102/24 dev tunl0
ip link set up tunl0
ip route del 192.168.100.0/24 dev tunl0#刪除tunl0路由vim /etc/sysctl.conf
# 啟用路由功能
net.ipv4.ip_forward = 1
# 配置本地ipv4策略,防止VIP沖突
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce=2
# 配置本地ipv4策略,防止訪問丟包
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.eth0.rp_filter=0
net.ipv4.conf.tunl0.rp_filter=0sysctl -p