序言
DR模式是lvs叢集中三種負載均衡模式的其中一種,那麼上一篇中我寫啦關於NAT模式的搭建與原理,為什麼還要有DR模式與IP隧道模式呢?
首先我們來看3張圖。LVS/NAT模式如下圖:
LVS/IP隧道模式,如下圖:
LVS/DR模式,如下圖。
上面三張圖來自:http://www.linuxvirtualserver.org/zh/lvs3.html ,此文也正式是官方詳細描述LVS叢集中實現的三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR)的工作原理,以及它們的優缺點的文章,推薦大家要詳細看看。
這裡我簡述總結下他們的路由方式以及做一個區別:
VS/NAT模式:客戶機-->請求分發伺服器-->Real Server-->請求分發伺服器--->客戶機。
VS/DR模式:客戶機-->請求分發伺服器-->Real Server-->客戶機。
VS/TUN模式:客戶機-->請求分發伺服器-->Real Server-->客戶機。
由此可以看出,NAT模式的請求分發伺服器會成為這個模式的瓶頸所在,因為所有請求與響應走要經過他轉發。那麼IP隧道模式與DR模式的區別在於,DR模式與IP隧道模式相比,DR模式沒有IP封裝的開銷,但由於採用物理層(修改MAC地址)技術,所有伺服器都必須在同一個物力網段中。
LVS/DR模式搭建詳細演練
首先我先上我的整體搭建機器的架構圖上來,以便更直觀的搭建與理解。
首先配置分發器這臺機器,操作很簡單,跟著做就可以啦。
- 新增eth0:1網路介面
[root@localhost network-scripts]# ifconfig eth0:1 172.18.8.6 netmask 255.255.255.255 --此介面只是臨時生效,下面需要配置的是永久生效 [root@localhost network-scripts]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cp ifcfg-eth0 ifcfg-eth0:1
- 編輯由拷貝而來的ifcfg-eth0:1,需要注意的是必須把mac地址與eth0的保持一致。
[root@localhost network-scripts]# cat ifcfg-eth0:1 TYPE="Ethernet" BOOTPROTO="static" DEFROUTE="yes" PEERDNS="yes" PEERROUTES="yes" IPV4_FAILURE_FATAL="no" NAME="eth0:1" DEVICE="eth0:1" ONBOOT="yes" IPADDR="172.18.8.6" NETMASK="225.225.225.0" HWADDR="00:0c:29:af:ff:3a"
- 配置ipvsadm負載演算法,如果你不知道ipvsadm是什麼,請看我的部落格:Linux系統(四)LVS叢集負載均衡NAT模式 裡面有對他的詳細介紹。
[root@localhost network-scripts]# ipvsadm -A -t 172.18.8.6:80 -s rr [root@localhost network-scripts]# ipvsadm -a -t 172.18.8.6:80 -r 172.18.8.5 -g [root@localhost network-scripts]# ipvsadm -a -t 172.18.8.6:80 -r 172.18.8.4 -g
到此,分發器這臺機器就配置完成啦。
然後配置Real Server
- 配置臨時生效的迴環介面
[root@localhost ~]# ifconfig lo:1 172.18.8.6 netmask 255.255.255.255 [root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:1
- 配置複製而來的迴環介面配置檔案ifcfg-lo:1,然後關機重啟使其永久生效。
[root@localhost network-scripts]# cat ifcfg-lo:1 CE=lo:1 IPADDR=272.18.8.6 NETMASK=255.255.255.255 # If you're having problems with gated making 127.0.0.0/8 a martian, # # you can change this to something else (255.255.255.255, for example) ONBOOT=yes NAME=loopback
- 這樣一來,我們從圖中可以看到有3個ip地址都為172.18.8.6,那麼你在客戶端輸入172.18.8.6:80來訪問web伺服器的時候,那臺機器響應呢?這裡就需要以下2個配置,使訪問172.18.8.6這個ip的請求只在分發器這臺機器上處理。這兩個配置在稍後會做講解。
[root@localhost network-scripts]# echo "1">"/proc/sys/net/ipv4/conf/eno16777736/arp_ignore" [root@localhost network-scripts]# echo "2">"/proc/sys/net/ipv4/conf/eno16777736/arp_announce" [root@localhost network-scripts]# cat /etc/sysctl.conf # System default settings live in /usr/lib/sysctl.d/00-system.conf. # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file # # For more information, see sysctl.conf(5) and sysctl.d(5). net.ipv4.conf.eno16777736.arp_ignore=1 net.ipv4.conf.eno16777736.arp_announce=2
- 開啟web伺服器,我這裡用的是nginx作為web伺服器使用演練。
[root@localhost network-scripts]# /usr/sbin/nginx
- 另外一臺Real Server如上操作一遍,即可。
- 測試,切記測試萬萬不要在分發起上請求172.18.8.6,這裡是行不通的,你要去其他機器上測,我在如圖的150機器上測試效果如下。
直接聯通realserver,沒問題,如下。
訪問分發器ip,做到啦輪詢效果,如下。
理解arp_ignore與arp_announce引數詳細
arp響應限制arp_ignore:
- 0 - (預設值): 迴應任何網路介面上對任何本地IP地址的arp查詢請求
- 1 - 只回答目標IP地址是來訪網路介面本地地址的ARP查詢請求
- 2 -只回答目標IP地址是來訪網路介面本地地址的ARP查詢請求,且來訪IP必須在該網路介面的子網段內
- 3 - 不迴應該網路介面的arp請求,而只對設定的唯一和連線地址做出迴應
- 4-7 - 保留未使用
- 8 -不迴應所有(本地地址)的arp查詢
arp響應限制arp_announce:對網路介面上,本地IP地址的發出的,ARP迴應,作出相應級別的限制: 確定不同程度的限制,宣佈對來自本地源IP地址發出Arp請求的介面
- 0 - (預設) 在任意網路介面(eth0,eth1,lo)上的任何本地地址
- 1 -儘量避免不在該網路介面子網段的本地地址做出arp迴應. 當發起ARP請求的源IP地址是被設定應該經由路由達到此網路介面的時候很有用.此時會檢查來訪IP是否為所有介面上的子網段內ip之一.如果改來訪IP不屬於各個網路介面上的子網段內,那麼將採用級別2的方式來進行處理.
- 2 - 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP資料包的源地址並嘗試選擇與能與該地址通訊的本地地址.首要是選擇所有的網路介面的子網中外出訪問子網中包含該目標IP地址的本地地址. 如果沒有合適的地址被發現,將選擇當前的傳送網路介面或其他的有可能接受到該ARP迴應的網路介面來進行傳送.
在dr模式中我們的realserver配置arp_ignore為1:意思是不是eno16777736所在ip的請求,我不與應答。arp_announce為2:意思是我不對外公佈我有出來eno16777736所在ip之外的任何ip,避免主動宣告ip使arp廣播包傳送過來,做出應答。
總結
接下來是大家最喜歡的總結內容啦,內容有二,如下:
1、希望能關注我其他的文章。
2、部落格裡面有沒有很清楚的說明白,或者你有更好的方式,那麼歡迎加入左上方的2個交流群,我們一起學習探討。