下圖爲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是使用了內核的ip_vs功能它是內核支持的,它不是一個咱們一般所理解的軟件。目前CentOS 7安裝默認就在內核中配置了ip_vs的支持。咱們須要安裝的是ipvsadm這個管理工具。能夠經過yum -y install ipvsadm
來安裝(在兩臺LVS都安裝這個工具),安裝完會有以下內容:bash
ipvsadm是用來配置ipvs規則的,這些規則運行在內存中,這就意味着關鍵就沒有了,因此ipvsadm-save是用來保存規則的,而ipvsadm-restore則是用來加載規則到內存的。服務器
ipvsadm-config這個東西ipvs規則文件,咱們使用ipvsadm命令的時候能夠把規則保存到這個文件中,ipvsadm.service是服務文件,雖然ipvsadm自己不是服務,可是爲了實現開機能夠自動加載ipvs規則,那麼這個ipvsadm.service就是讓開啓自動執行ipvsadm-restore來加載規則到內存用的,當關機的時候自動保存規則。網絡
集羣服務類命令:工具
參數 | 說明 |
---|---|
-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參數輸出說明3d
Conns | 鏈接數 |
---|---|
InPkts | 入棧的報文數量 |
OutPkts | 出棧的報文數量 |
InBytes | 入棧字節數量 |
OutByes | 出棧字節數量 |
--rate參數輸出說明rest
CPS | 每秒鏈接數 |
---|---|
InPPS | 平均每秒入棧報文數 |
OutPPS | 平均每秒出棧報文數 |
InBPS | 平均每秒入棧字節數 |
OutBPS | 平均每秒出棧本身數 |
因爲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。
設置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設置完畢。