Linux系統(五)負載均衡LVS叢集之DR模式

張龍豪發表於2017-02-28

序言

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"    
[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個交流群,我們一起學習探討。

相關文章