LVS的DR模型配置
介紹
下圖為DR模型的通訊過程,圖中的IP不要被撲結構中的IP迷惑,圖裡只是為了說明DR的通訊原理,應用到本例中的拓撲上其工作原理不變。
拓撲結構
伺服器 | IP地址 | 角色 |
---|---|---|
Srv01 | 172.16.42.100 VIP: 172.16.42.111 |
LVS |
Srv03 | 172.16.42.102 VIP: 172.16.42.111 |
Nginx |
Srv04 | 172.16.42.103 VIP: 172.16.42.111 |
Nginx |
另外,我這4臺主機都是2個網路卡, 其中有ens33是172.16.42.0/24這個網路,ens34是192.168.100.0/24網路,這個網路在本例中沒有用,請忽略。
部署LVS
安裝LVS
其實LVS不需要安裝當然這麼說也不太嚴謹,而是說LVS是使用了核心的ip_vs功能它是核心支援的,它不是一個我們通常所理解的軟體。目前CentOS 7安裝預設就在核心中配置了ip_vs的支援。我們需要安裝的是ipvsadm這個管理工具。可以透過yum -y install ipvsadm
來安裝(在兩臺LVS都安裝這個工具),安裝完會有如下內容:
ipvsadm是用來配置ipvs規則的,這些規則執行在記憶體中,這就意味著關鍵就沒有了,所以ipvsadm-save是用來儲存規則的,而ipvsadm-restore則是用來載入規則到記憶體的。
ipvsadm-config這個東西ipvs規則檔案,我們使用ipvsadm命令的時候可以把規則儲存到這個檔案中,ipvsadm.service是服務檔案,雖然ipvsadm本身不是服務,但是為了實現開機可以自動載入ipvs規則,那麼這個ipvsadm.service就是讓開啟自動執行ipvsadm-restore來載入規則到記憶體用的,當關機的時候自動儲存規則。
ipvsadm命令簡要說明
叢集服務類命令:
引數 | 說明 |
---|---|
-A | 新增叢集服務 -t:TCP服務 -u:UDP 服務 -f:防火牆標記,瀏覽電商網站的時候訪問的是80也就是HTTP服務,新增購物車商品,然後去結賬的時候就會用到HTTPS服務,也就是443,這明顯是兩個服務,這時候購物車就沒東西了,因為很有可能會定向到不同的後端應用伺服器上,所以為了避免這個問題,就會做標記把HTTP和HTTPS當做 同一種服務,80的標記是1,443的標記也是1,這樣就可以了。也就是把不相同的服務定向到同一個服務的時候,就會用到防火牆標記。 Service-address:如果使用-t或者-u的時候,就是IP:PORT;如果使用-f的時候就是一個數字,這個標記是使用iptables打上的標記 -s:排程方法(演算法),預設是WLC,該演算法是LVS中最好的 |
-E | 修改叢集服務,使用方法和-A相同 |
-p | 持久連線超時時長,預設360秒 |
-D | 刪除叢集服務 |
-C | 清空所有叢集服務 |
應用伺服器類:
引數 | 說明 |
---|---|
-a | 向叢集服務中新增應用伺服器 -t |
-g | 閘道器,指定LVS型別為DR模型,如果不設定則預設為DR模型 |
-i | IPIP,指定LVS型別為隧道模型,如果不設定預設為DR模型 |
-m | 指定LVS型別為NAT模型,如果不設定預設為DR模型 |
-w | 權重 |
-x | 連線上限 |
-y | 連線下限 |
-e | 修改指定的應用伺服器屬性 |
-d | 從指定的叢集服務中刪除應用伺服器 |
-Z | 計數器清零 |
檢視規則:
引數 | 說明 |
---|---|
-L | -n 數字格式顯示IP地址 -c 顯示每一個應用伺服器的連線數(活動和非活動) --stats:顯示統計資料, --rate:顯示資料傳輸速率 --timeout:顯示TCP/UDP會話時長,這個數字是LVS自己內部的 |
-n | 數字顯示IP和埠 |
--stats引數輸出說明
Conns | 連線數 |
---|---|
InPkts | 入棧的報文數量 |
OutPkts | 出棧的報文數量 |
InBytes | 入棧位元組數量 |
OutByes | 出棧位元組數量 |
--rate引數輸出說明
CPS | 每秒連線數 |
---|---|
InPPS | 平均每秒入棧報文數 |
OutPPS | 平均每秒出棧報文數 |
InBPS | 平均每秒入棧位元組數 |
OutBPS | 平均每秒出棧自己數 |
ARP的核心引數
由於LVS伺服器和後端伺服器的網路卡上都配置了VIP,那麼當客戶端聯絡VIP的時候肯定是和LVS伺服器的VIP進行通訊,然後由LVS伺服器基於規則進行排程,我們知道2層通訊是基於MAC地址的,那麼首次通訊時客戶端可能並不知道LVS伺服器的MAC地址,那麼就需要進行ARP廣播來解析出VIP所在的伺服器的MAC地址,那麼顯然對客戶端進行ARP應答的只能是LVS伺服器不能是後端伺服器,所以我們就要在後端上修改核心引數來禁止ARP應答和宣告。那麼有2個核心參數列示這兩個設定:
arp_ignore:表示接收到ARP廣播時的響應級別,預設值為0
-
0,預設值,表示響應所有,只要對方查詢的IP配置在我自己這臺主機上且無論ARP請求從哪個網路卡進來,該主機都會響應
-
1,收到該ARP請求的網路卡IP與ARP請求的IP一致,該主機才響應
arp_announce:定義將自己的地址向外通告的級別,預設是0
-
0,表示將本機所有的MAC地址都向外通告
-
1,多網路卡主機且都配置了IP地址,那麼該主機接入到網路時,無論哪個網路卡接入到網路,該網路卡都會向外宣告自己所有的MAC地址,所以1表示如果IP不在這個介面上,就避免向外通告,但是不保證一定不會下外通告。
-
2,僅向網路卡IP直連的網路進行通告
為什麼會有這些級別呢?因為主機可以有多個網路卡,每個網路卡都對應一個網段,預設情況下這個多網路卡主機只要接入網路它就會把自己所在的所有網路地址都向外進行通告。
所以對於後端伺服器,也就是本例子中的Nginx,我們應該在lo上配置子介面,且設定arp_ignore為1,arp_announce為2。
設定LVS伺服器
設定IP地址,這個地址要在LVS伺服器的物理網路卡設定,我這裡就是ens33
ifconfig ens33:0 172.16.42.111 netmask 255.255.255.255 broadcast 172.16.42.111 up
下面新增規則:
ipvsadm -A -t 172.16.42.111:80 -s rr
ipvsadm -a -t 172.16.42.111:80 -r 172.16.42.102 -g
ipvsadm -a -t 172.16.42.111:80 -r 172.16.42.103 -g
設定後端伺服器
後端伺服器的所有操作都是一樣,我這裡就演示一臺。首先要保證2臺後端伺服器都安裝了Nginx,我用Nginx只是為了後端提供一個Web服務而已,你使用Tomcat也是一樣的。
透過這個命令檢視當前伺服器設定sysctl -a | egrep "arp_ignore|arp_announce"
可以看到這裡每個網路卡都有這2個引數還有一個All也有,那應該配置在哪裡呢?all表示全域性,理論上來說在all上配置就可以,但是為了上個雙保險我們在ens33上也配置。
記住arp_announce配置為2;apr_ignore配置為1。
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.ens33.arp_announce=2
我使用sysctl -w來修改只是臨時生效,重啟就沒有了,為了永久有效請修改
/etc/sysctl.conf
檔案。
現在在說以為什麼arp_announce配置為2,我這個主機有2個網路卡,每個網路卡所連線的是不同網段。我要使用的是ens33上面這個172.16.42.0/24這個網段,且VIP也是這個網段,當我把ens33的apr_announce配置為2 的時候,這就意味著當這個ens33接入網路時它不會對外宣告ens34的網路設定,也不會對外宣告lo的網路設定(因為我們要在lo上配置一個子介面,該介面的IP就是VIP),下面配置apr_ignore
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.ens33.arp_ignore=1
下面設定lo的子介面,這裡為什麼要32位呢?因為要把廣播地址設定為自己,這樣它的廣播就不會廣播到其他地方。
ifconfig lo:0 172.16.42.111 netmask 255.255.255.255 broadcast 172.16.42.111 up
下面我們在Srv01上ping一下這個地址,發現沒有人應答,所以ping不通。
接下來新增一條路由,其目的是由於後端伺服器是直接應答客戶端請求的,所以就需要確保應答是其源IP一定是VIP(因為客戶端請求的就是VIP),但是當LVS修改完資料包傳送給後端伺服器時,使用的是後端伺服器的真實IP地址進行通訊的,而網路通訊是請求入棧是哪個介面,響應出棧還走哪個介面,這就勢必導致後端伺服器會使用自己的真實IP而不是VIP對客戶端響應,這肯定是不對的,所以我們要透過這一條路由設定讓ens33網路卡收到資料包後轉發給lo:0這個子介面,這樣響應出棧的時候就會經過lo:0,這樣也就會把響應報文的源IP設定為VIP了。
route add -host 172.16.42.111 dev lo:0
這條命令的含義是如果目標地址是172.16.42.111就要送到lo:0,這樣就保證了入棧經過lo:0,那麼出棧自然會經過。如果你不理解,那麼就要好好看看最上面的圖,二層通訊是使用mac地址,而此時後端伺服器收到這個資料包的時候,IP報文中源IP是客戶端的IP,而目標IP則是VIP,只是資料鏈路層報文mac地址資訊被LVS替換了。
之後啟動後端服務的Nginx服務,兩臺後端伺服器上都做上面的修改。
訪問測試
到此LVS設定完畢。