本篇文檔主要是記錄DR模式實現過程,以及各配置步驟的原理。“lvs三種模式工作原理”中描述了LVS的NAT、DR、TUN三種模式的工作原理。
DR模式是通過director將報文源和目標MAC地址修改,發送給RS,RS將響應報文直接發送給client。
部署環境
LVS服務器(DS) | DIP:172.30.100.111 | VIP:172.30.100.1 |
nginx1服務器(RS) | RIP:172.30.100.126 | VIP:172.30.100.1 |
nginx2服務器(RS) | RIP:172.30.100.127 | VIP:172.30.100.1 |
確保三台機器分別配置了對應的本地靜態地址DIP和RIP,VIP稍后配置。
LVS服務器配置
LVS是被編譯進內核中,主要分為兩部分ipvs和ipvsadm,ipvs是LVS軟件核心,是運行在LB上的,這是個基於ip層的負載均衡;ipvsadm是用戶空間的集群管理工具。
lsmod |grep ip_vs # 確保內核加載了lvs模塊 yum install -y ipvsadm # 安裝用戶管理工具
要想起到負載均衡效果,那么所有請求報文必須發往LVS服務器(DS),然后DS根據指定算法分發到后端服務器上,因此DS必須配置VIP地址,VIP是與公網client通信地址,這樣DS才能接受到請求報文進行分發。
ifconfig eth0:0 172.30.100.1 netmask 255.255.255.255 # 在LVS服務器上添加一個地址為VIP的虛擬網卡eth0:0
后端服務器配置
DR模式只是針對源和目標MAC地址做出修改,源和目標IP還是不變;當請求報文由LVS服務器處理后發送到后端服務器RS上,RS拆封報文時會發現目標MAC是自己的MAC地址,但是目標IP是VIP,與本地IP地址不符合,那么RS就會認為不是發給自己的報文,所以此時需要在RS上配置VIP,這樣RS就可以接受目標地址為VIP的請求報文了。
如果將VIP設置在RS的網卡上,假設有多台RS並且每台RS上都配置了VIP,在這個網絡中發出VIP的ARP請求,就有多個RS響應,這樣肯定是不可以;因此就把VIP配置到回環地址lo網卡上,然后讓lo網卡忽略所有ARP請求,eth0網卡正常響應ARP請求,這樣網絡中就不會收到RS關於VIP的響應;還有一個問題就是當本地網卡響應ARP請求時,也有可能通過lo網卡回應,然后把VIP作為ARP請求的源IP通告出去,那么就必須禁止VIP作為ARP請求的源IP,這個問題可以通過修改arp_announce參數解決。
由於客戶端發起的請求報文源IP為CIP,目標IP為VIP;所以客戶端收到的響應報文源IP必須為VIP,目標IP必須為CIP,因此在RS發送的響應報文必須由VIP的lo網卡發出,這就需要在RS上指定一條路由,目標IP為VIP的數據包使用lo網卡發出,然后經由eth0轉發到網關再到公網客戶端。
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore # 將對應網卡設置為只回應目標IP為自身接口地址的ARP請求 echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce # 將ARP請求的源IP設置為eth0上的IP,也就是RIP # 必須完成以上設置,才可繼續 ifconfig lo:0 172.30.100.1 broadcast 172.30.100.1 netmask 255.255.255.255 # 添加IP地址為VIP的虛擬網卡lo:0 route add -host 172.30.100.1 dev lo:0 # 添加一條路由,目標IP為VIP的數據包使用lo接口發送,這樣響應報文的源IP就會為VIP
兩台nginx后端服務器都需要完成以上操作。
ipvs規則配置
ipvsadm -A -t 172.30.100.1:80 -s wrr # 添加虛擬服務,指定IP、端口、算法 ipvsadm -a -t 172.30.100.1:80 -r 172.30.100.126:80 -g -w 2 # 添加nginx1服務器,指定DR模式,指定權重為2 ipvsadm -a -t 172.30.100.1:80 -r 172.30.100.127:80 -g -w 1 # 添加nginx2服務器,指定DR模式,指定權重為1
驗證