在LVS(Linux Virtual Server)負載均衡中的DR(Direct Routing)模式下,數據包的流向如下:
- 客戶端發送請求到負載均衡器(LVS)的虛擬IP(VIP)。
- 負載均衡器(LVS)接收到請求后,根據負載均衡算法選擇一個后端服務器(Real Server)。
- 負載均衡器(LVS)將請求的目標MAC地址修改為所選后端服務器(Real Server)的MAC地址,并將數據包轉發給后端服務器。
- 后端服務器接收到請求后,處理請求并生成響應。
- 后端服務器將響應發送回負載均衡器(LVS)。
- 負載均衡器(LVS)接收到響應后,將響應的源MAC地址修改為負載均衡器(LVS)的MAC地址,并將響應轉發給客戶端。
- 客戶端接收到響應并處理。
在DR模式下,負載均衡器(LVS)只負責將請求轉發給后端服務器,并將響應轉發回客戶端,而不會修改數據包的IP地址。這意味著后端服務器和客戶端直接通信,負載均衡器(LVS)只在請求和響應的轉發過程中起到中間轉發的作用,減少了負載均衡器的處理負擔,提高了性能和吞吐量。
需要注意的是,在DR模式下,后端服務器必須配置正確的網絡路由,以確保響應數據包能夠正確返回給客戶端。此外,負載均衡器(LVS)和后端服務器之間需要通過網絡隔離,以避免數據包循環和沖突。
DR 模式的特點:
(1)Director Server 和 Real Server 必須在同一個物理網絡中。
(2)Real Server 可以使用私有地址,也可以使用公網地址。如果使用公網地址,可以通過互聯網對 RIP 進行直接訪問。
(3)Director Server作為群集的訪問入口,但不作為網關使用。
(4)所有的請求報文經由 Director Server,但回復響應報文不能經過 Director Server。
(5)Real Server 的網關不允許指向 Director Server IP,即Real Server發送的數據包不允許經過 Director Server。
(6)Real Server 上的 lo 接口配置 VIP 的 IP 地址。
DR模式中需要解決的問題:
問題一:
在局域網中具有相同的IP地址,勢必會造成各服務器ARP通信的紊亂。
當ARP廣播發送到LVS-DR集群時,因為負載均衡器和節點服務器都是連接到相同的網絡上,它們都會接收到ARP廣播。
只有前端的負載均衡器進行響應,其他節點服務器不應該響應ARP廣播。
解決方式:
對節點服務器進行處理,使其不響應針對VIP的ARP請求。
使用虛擬接口lo:0承載VIP地址,設置內核參數arp_ignore=1
作用:系統只響應目的IP為本地lP的ARP請求。
問題二:
Real Server返回報文(源IP是VIP)經網關路由器轉發,重新封裝報文時,需要先獲取路由器的MAC地址。
發送ARP請求時,Linux默認使用IP包的源IP地址(即VIP)作為ARP請求包中的源IP地址,而不使用發送接口的IP地址
解決方式:
使用Real Server 的物理網卡地址(即RIP)作為響應報文的IP,這樣就不會導致網關服務器的ARP緩存表的紊亂。
設置內核參數arp_announce=2 使系統不使用IP包的源地址(VIP)來作為本機進行ARP請求的源IP地址,而選擇發送接口的IP地址。
配置步驟:
-----------------DR模式 LVS負載均衡群集部署-----------------------------------
配置所需主機:
DR 服務器:20.0.0.102
Web 服務器1:20.0.0.103
Web 服務器2:20.0.0.104
vip:20.0.0.12
NFS共享服務器:20.0.0.101
一.配置負載調度器(20.0.0.102)
systemctl stop firewalld.service #關閉防火墻
setenforce 0 #將selinx 安全機制調為0
modprobe ip_vs #加載ip_vs內核模塊,啟用IPVS(IP Virtual Server)功能。
cat /proc/net/ip_vs #顯示當前系統中的IPVS配置。列出IPVS的相關信息,如虛擬服務器、真實服務器和負載均衡算法等。
yum -y install ipvsadm #使用yum包管理器安裝ipvsadm工具。ipvsadm是一個命令行工具,用于配置和管理IPVS。
(1)配置虛擬 IP 地址(VIP:20.0.0.12)
cd /etc/sysconfig/network-scripts/:切換到網絡配置文件目錄。cp ifcfg-ens33 ifcfg-ens33:0:復制名為ifcfg-ens33的網絡配置文件為ifcfg-ens33:0。這將創建一個名為ens33:0的虛擬網絡接口配置文件。vim ifcfg-ens33:0:使用vim編輯器打開ifcfg-ens33:0配置文件。在ifcfg-ens33:0配置文件中,添加以下內容:DEVICE=ens33:0
ONBOOT=yes
IPADDR=20.0.0.12
NETMASK=255.255.255.255
這些配置將設置虛擬網絡接口ens33:0的設備名稱、啟動時自動激活、IP地址和子網掩碼。ifup ens33:0:激活ens33:0虛擬網絡接口。這將使配置的IP地址生效。ifconfig ens33:0:顯示ens33:0虛擬網絡接口的詳細信息,包括IP地址、子網掩碼等。
(2)調整 proc 響應參數
#由于 LVS 負載調度器和各節點需要共用 VIP 地址,需要關閉 icmp 的重定向,不充當路由器。
vim /etc/sysctl.conf 使用vim編輯器打開sysctl.conf文件
在sysctl.conf文件中,添加以下內容:
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
以上這些配置將禁用IP轉發和發送重定向sysctl -p 重新加載sysctl.conf文件中的配置。使新的配置生效
(3)配置負載分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm 將當前的IPVS配置保存到/etc/sysconfig/ipvsadm文件中。這將創建一個名為ipvsadm的配置文件,其中包含當前的IPVS規則
systemctl start ipvsadm 啟動ipvsadm服務。這將加載之前保存的IPVS配置,并開始使用IPVS進行負載均衡。
ipvsadm -C 清空當前的IPVS配置。刪除所有的虛擬服務器和真實服務器配置。
ipvsadm -A -t 20.0.0.12:80 -s rr 添加一個名為20.0.0.12:80的虛擬服務器,并使用輪詢(round-robin)算法進行負載均衡。這將創建一個新的虛擬服務器配置
ipvsadm -a -t 20.0.0.12:80 -r 20.0.0.103:80 -g
ipvsadm -a -t 20.0.0.12:80 -r 20.0.0.104:80 -g 將真實服務器20.0.0.104:80添加到虛擬服務器20.0.0.12:80的后端組中。這將進一步擴展負載均衡,將流量分發到多個真實服務器,并使用源IP散列(source IP hash)算法進行負載均衡。請注意,如果您使用的是隧道模式,應將-g替換為-i。
ipvsadm 顯示當前的IPVS配置。這將列出所有的虛擬服務器、真實服務器和負載均衡算法等詳細信息ipvsadm -ln #查看節點狀態,Route代表 DR模式
二.部署共享存儲(NFS服務器:20.0.0.101)
systemctl stop firewalld.service
setenforce 0yum -y install nfs-utils rpcbind 用yum包管理器安裝nfs-utils和rpcbind軟件包。這些軟件包提供了NFS(Network File System)和RPC(Remote Procedure Call)的相關工具和服務。
mkdir /opt/kgc /opt/benet 創建/opt/kgc和/opt/benet目錄。這些目錄將用于共享文件系統
chmod 777 /opt/kgc /opt/benet 將/opt/kgc和/opt/benet目錄的權限設置為777。這將允許任何用戶對這些目錄進行讀取、寫入和執行操作。vim /etc/exports 使用vim編輯器打開/etc/exports文件。這個文件用于配置NFS共享。
在/etc/exports文件中,添加以下內容:
/usr/share *(ro,sync)
/opt/kgc 20.0.0.0/24(rw,sync)
/opt/benet 20.0.0.0/24(rw,sync)
這些配置將定義NFS共享的目錄和訪問權限。第一行將/usr/share目錄以只讀方式共享給所有主機。第二行將/opt/kgc目錄以讀寫方式共享給20.0.0.0/24網段的主機。第三行將/opt/benet目錄以讀寫方式共享給20.0.0.0/24網段的主機。systemctl start nfs.service 啟動nfs服務。這將啟動NFS服務器,并開始共享配置的目錄。
systemctl start rpcbind.service 啟動rpcbind服務。這將啟動RPC綁定服務,以便NFS服務器可以與客戶端進行通信。
三.配置節點服務器(20.0.0.103、20.0.0.104)
systemctl stop firewalld.service
setenforce 0
(1)配置虛擬 IP 地址(VIP:20.0.0.12)
#此地址僅用作發送 Web響應數據包的源地址,并不需要監聽客戶機的訪問請求(改由調度器監聽并分發)。因此使用虛接口 lo∶0 來承載 VIP 地址,并為本機添加一條路由記錄,將訪問 VIP 的數據限制在本地,以避免通信紊亂。
cd /etc/sysconfig/network-scripts/ 切換到/etc/sysconfig/network-scripts/目錄
cp ifcfg-lo ifcfg-lo:0 復制ifcfg-lo文件為ifcfg-lo:0。這將創建一個名為ifcfg-lo:0的新文件,用于配置虛擬接口
vim ifcfg-lo:0 使用vim編輯器打開ifcfg-lo:0文件。
在ifcfg-lo:0文件中,添加以下內容:DEVICE=lo:0
ONBOOT=yes
IPADDR=20.0.0.12
NETMASK=255.255.255.255 #注意:子網掩碼必須全為 1
以上這些配置將定義虛擬接口lo:0的設備名稱、啟動時自動激活、IP地址和子網掩碼。ifup lo:0 激活虛擬接口lo:0。這將啟用新配置的虛擬接口。
ifconfig lo:0 顯示虛擬接口lo:0的配置信息。這將列出虛擬接口的IP地址、子網掩碼等詳細信息
route add -host 20.0.0.12 dev lo:0 添加一個路由規則,將主機20.0.0.12的流量通過虛擬接口lo:0發送。這將確保流量正確地通過虛擬接口。vim /etc/rc.local 使用vim編輯器打開/etc/rc.local文件
在/etc/rc.local文件中,添加以下內容:
/sbin/route add -host 20.0.0.12 dev lo:0chmod +x /etc/rc.d/rc.local 將/etc/rc.local文件設置為可執行。這將確保在系統啟動時自動執行其中的命令。(2)調整內核的 ARP 響應參數以阻止更新 VIP 的 MAC 地址,避免發生沖突
vim /etc/sysctl.conf 使用vim編輯器打開/etc/sysctl.conf文件
......
在/etc/sysctl.conf文件中,添加以下內容:
net.ipv4.conf.lo.arp_ignore = 1 #系統只響應目的IP為本地IP的ARP請求
net.ipv4.conf.lo.arp_announce = 2 #系統不使用IP包的源地址來設置ARP請求的源地址,而選擇發送接口的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
以上這些配置將設置系統的ARP參數,以確保系統只響應目的IP為本地IP的ARP請求,并使用發送接口的IP地址作為ARP請求的源地址。
sysctl -p 重新加載sysctl.conf文件中的配置。這將使新的ARP參數生效或者
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore:將虛擬接口lo的arp_ignore參數設置為1。echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce:將虛擬接口lo的arp_announce參數設置為2。echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore:將所有接口的arp_ignore參數設置為1。echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce:將所有接口的arp_announce參數設置為2。sysctl -p:重新加載sysctl.conf文件中的配置。這將使新的ARP參數生效。yum -y install nfs-utils rpcbind httpd:使用yum包管理器安裝nfs-utils、rpcbind和httpd軟件包。這些軟件包提供了NFS、RPC和HTTP服務的相關工具和服務。systemctl start rpcbind:啟動rpcbind服務。這將啟動RPC綁定服務,以便NFS服務器可以與客戶端進行通信。systemctl start httpd:啟動httpd服務。這將啟動Apache HTTP服務器。--20.0.0.103---mount.nfs 20.0.0.101:/opt/kgc /var/www/html 將20.0.0.101主機上的/opt/kgc目錄掛載到本地的/var/www/html目錄。這將使20.0.0.103主機上的Apache HTTP服務器可以訪問/opt/kgc目錄中的文件
echo 'this is kgc web!' > /var/www/html/index.html 將一條消息寫入/var/www/html/index.html文件,以顯示在瀏覽器中。--20.0.0.104---
mount.nfs 20.0.0.101:/opt/benet /var/www/html 將20.0.0.101主機上的/opt/benet目錄掛載到本地的/var/www/html目錄。這將使20.0.0.104主機上的Apache HTTP服務器可以訪問/opt/benet目錄中的文件
echo 'this is benet web!' > /var/www/html/index.html 將一條消息寫入/var/www/html/index.html文件,以顯示在瀏覽器中。
4.測試 LVS 群集
在客戶端使用瀏覽器訪問 http://20.0.0.12/