一、DR模式資料包流向分析
(1)用戶端發送請求到Director Server(負載均衡器),請求的資料封包(源IP是CIP(用戶端IP),目标IP是VIP(叢集虛拟IP))到達核心空間。
(2)Director Server和Real Sexver(節點伺服器)在同一個網絡中,資料通過二層資料鍊路層來傳輸。
(3)核心空間判斷資料包的目标IP是否為本機VIP,此時IPVS(IP虛拟伺服器)比對資料包請求的服務是否是叢集服務,是叢集服務就重新封裝資料包。修改源MAC位址為Director Server的MAC位址上,修改目标MAC位址為Real Server的MAC位址,源IP位址與目标IP位址沒有改變,然後将資料包發送給Real Server。
(4)到達Real Server的請求封包的MAC位址是自身的MAC位址,就接收此封包。資料包重新封裝封包(源IP位址為VIP,目标IP為CIP),将響應封包通過lo接口傳送給實體網卡然後向外發出。
(5)Real Server直接将響應封包傳送到用戶端。
注:若跨網段,則封包通過路由器經由Internet傳回給使用者
二、DR模式的特點
(1)Director Server和Real Server必須在同一個實體網絡中。
(2)Real Server 可以使用私有位址,也可以使用公網位址。如果使用公網位址, 用戶端可以通過網際網路對RIP(節點伺服器)進行直接通路,相當于IP隧道模式。
(3)Director Server作為群集的通路入口,但不作為網關使用。
(4)所有的請求封包經由Director Server,但回複響應封包不能經過Director Server。
(5)Real Server的網關不允許指向Director Server IP,即Real Server發送的資料包不允許經過Director Server。
(6)Real Server上的lo接口配置叢集的VIP位址。
三、LVS-DR 中的 ARP 問題
1、在區域網路中具有相同的IP位址,勢必會造成各伺服器ARP通信的紊亂
- 當用戶端根據VIP發起請求,路由器進行ARP廣播發送到LVS-DR叢集時,因為負載均衡器和節點伺服器都配置VIP并且都連接配接在相同的網絡中,它們都會接收到ARP廣播,如果都做出響應将做成路由器ARP快取記錄紊亂
解決方法:
- 使用虛接口 lo:0 承載VIP位址
- 設定核心參數 arp_ignore=1
#節點伺服器系統隻響應目的IP為本地實體網卡IP的ARP請求,而不對目的IP為虛拟網卡的VIP的ARP請求做出響應
2、節點伺服器進行資料轉發若以VIP将再次造成路由器ARP表紊亂
- RealServer傳回封包(源IP是VIP,目标IP為用戶端IP)經路由器轉發,重新封裝封包時,需要先擷取路由器的MAC位址發送ARP請求時,Linux預設使用IP包的源IP位址(即VIP)作為ARP請求包中的源IP位址,而不使用發送接口的IP位址,如ens33接口,路由器收到請求後在尋址的同時也将更新ARP快取記錄,
- 原有的VIP對應排程器的MAC位址将更新為VIP對應節點伺服器位址,之後用戶端請求将不在通過排程伺服器
- 對節點伺服器進行處理,設定核心參數 arp_announce = 2
#節點伺服器系統不使用響應資料包的源IP位址也就是VIP位址作為轉發ARP請求的源位址,使用發送封包的實體網卡的IP位址作為ARP請求的源IP位址,防止對路由器VIP與MAC的對照關系進行更改以緻于之後的資料包不再到達排程器
實驗部分:DR模式 LVS負載均衡群集部署
1、實驗部署:
- DR負載排程器:20.0.0.6
- VIP:20.0.0.100
- Web節點伺服器1∶20.0.0.7
- Web節點伺服器2∶20.0.0.8
- NFS伺服器∶ 20.0.0.9
- 用戶端∶ 20.0.0.200
實驗詳細步驟:
準備實驗環境,關閉防火牆,se安全(所有主機)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM0M2N0AzYmZmYzYmZyczN4QmN2cTMjFDOihjN5cTMh9CXwIzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL1M3Lc9CX6MHc0RHaiojIsJye.png)
一、配置負載排程器(20.0.0.6)
1、加載ip_vs子產品,安裝ipvsadm工具
[root@localhost ~]# rpm -q ipvsadm
未安裝軟體包 ipvsadm
[root@localhost ~]#
[root@localhost ~]# modprobe ip_vs #加載ip_vs子產品
[root@localhost ~]# cat /proc/net/ip_vs #檢視是否加載
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@localhost ~]# yum install -y ipvsadm #安裝 ipvsadm 工具
已加載插件:fastestmirror, langpacks
2、配置虛拟 IP 位址(20.0.0.100)
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ #永久配置虛拟網卡ens33:1
[root@localhost network-scripts]# ls
ifcfg-ens33 ifdown-ipv6 ifdown-TeamPort ifup-ippp ifup-routes network-functions
ifcfg-lo ifdown-isdn ifdown-tunnel ifup-ipv6 ifup-sit network-functions-ipv6
[root@localhost network-scripts]# vim ifcfg-ens33:0
#隻保留以下這幾項即可
DEVICE=ens33:0
ONBOOT=yes
IPADDR=20.0.0.100 #設定VIP
NETMASK=255.255.255.255 #将子網路遮罩設為1表示唯一IP
3、調整proc響應參數
#由于LVS負載排程器和各節點需要共用VIP位址,需要關閉icmp的重定向,不充當路由器。
vim /etc/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
sysctl -p #重載一下配置
4、配置負載配置設定(排程)政策
ipvsadm-save > /etc/sysconfig/ipvsadm #啟動服務前須先手動建立該檔案用來儲存負載配置設定政策才能啟動成功
systemctl start ipvsadm #啟動
ipvsadm -C #清空規則
ipvsadm -A -t 20.0.0.100:80 -s rr #添加LVM群集,指定為輪詢算法;-t:指定VIP位址及TCP端口
ipvsadm -a -t 20.0.0.100:80 -r 20.0.0.7:80 -g #添加節點伺服器;-a:表示添加真實伺服器(節點伺服器);-r:指定RIP位址及TCP端口
ipvsadm -a -t 20.0.0.100:80 -r 20.0.0.8:80 -g #若隧道模式,-g替換為-i;-g:表示使用DR模式
ipvsadm # 激活
#檢視節點狀态, Route代表DR模式
ipvsadm -ln
ipvsadm-save > /etc/sysconfig/ipvsadm #儲存配置政策
二、部署 NFS 共享存儲
[root@localhost ~]# rpm -q nfs-utils rpcbind #檢視是否安裝nfs服務
nfs-utils-1.3.0-0.48.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
rh
[root@localhost opt]# mkdir xxx juice # 建立xxx、juice 兩個目錄
juice rh xxx
[root@localhost opt]# echo '<h1>this is xxx test web!!</h1>' > xxx/index.html
[root@localhost opt]# echo '<h1>this is juice test web!!</h1>' > juice/index.html
[root@localhost opt]# chmod 777 xxx/ juice/ #給上權限
[root@localhost opt]# cat xxx/index.html
<h1>this is xxx test web!!</h1>
[root@localhost opt]# cat juice/index.html
<h1>this is juice test web!!</h1>
[root@localhost opt]# vim /etc/exports
/opt/xxx 20.0.0.0/24(rw,sync) #添加共享目錄的路徑、網段、權限 ;同步
/opt/juice 20.0.0.0/24(rw,sync)
[root@localhost opt]# systemctl start rpcbind #啟動 bind 服務
[root@localhost opt]# systemctl start nfs #啟動 nfs 服務
三、配置節點伺服器 (20.0.0.7和20.0.0.8)
(1)先去節點伺服器1 檢視一下共享目錄清單有沒有(20.0.0.7)
(2)節點伺服器2 檢視一下共享目錄清單(20.0.0.8)
1、配置虛拟 IP 位址
#此位址僅用作發送 Web響應資料包的源位址,并不需要監聽客戶機的通路請求 (改由排程器監聽并分發)。是以使用虛接口lo∶0來承載VIP位址,并為本機添加一條路由記錄,将通路VIP的資料限制在本地,以避免通信紊亂。
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0 #複制網卡
vim ifcfg-lo:0 #修改配置
DEVICE=lo:0
ONBO0T=yes
IPADDR=192.168.150.200
NETMASK=255.255.255.255 #與之前DR伺服器相同,設定相同VIP
ifup lo:0
或 systemctl restart network (自己實驗環境可以這樣重新開機) #重新開機網卡
ifconfig
route add -host 192.168.150.200 dev lo:0 #臨時添加指定該接口承載VIP位址
vim /etc/rc.d/rc.local #添加到該檔案開機自動執行該指令
/usr/sbin/route add -host 192.168.150.200 dev lo:0
chmod +x /etc/rc.d/rc.local
2、調整核心的 ARP 的響應參數以阻止更新VIP的MAC位址,避免發生沖突
.......
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
sysctl -p
或者
臨時添加:
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_announce : INTEGER
0:允許使用任意網卡上的IP位址作為arp請求的源IP,通常就是使用資料包a的源IP。
1:盡量避免使用不屬于該發送網卡子網的本地位址作為發送arp請求的源IP位址。
2:忽略IP資料包的源IP位址,選擇該發送網卡上最合适的本地位址作為arp請求的源IP位址。(一般DR模式設為2)
arp_ignore : INTEGER
定義對目标位址為本地IP的ARP詢問不同的應答模式。
0:響應任意網卡上接收到的對本機IP位址的arp請求(包括環回網卡上的位址),而不管該目的IP是否在接收網卡上。
1:隻響應目的IP位址為接收網卡上的本地位址的arp請求。(一般DR模式設為1)
2:隻響應目的IP位址為接收網卡上的本地位址的arp請求,并且arp請求的源IP必須和接收網卡同網段。
3:如果ARP請求資料包所請求的IP位址對應的本地位址其作用域(scope)為主機(host),則不回應ARP響應資料包,如果作用域為全局(global)或鍊路(link),則回應ARP響應資料包。
4~7:預留。
8:不回應所有的arp請求。
sysctl.conf中包含all(全局)和eth/lo(具體網卡)的arp_ignore參數,取其中較大的值生效
3、啟動http服務挂載共享的首頁檔案(安裝 apache 或 nginx 服務,兩者都可以,有Web服務才可以承載)
yum -y install nfs-utils rpcbind httpd
systemctl start rpcbind
systemctl start nfs
systemctl start httpd
mount 20.0.0.9:/opt/xxx /var/www/html/