1. 程式人生 > >LVS負載均衡叢集——DR模型演示

LVS負載均衡叢集——DR模型演示

1、lvs負載均衡叢集簡圖:

註釋:

director為請求代理伺服器,

realserver為後端真實伺服器

路由器1提供給director公網ip地址(使用者請求資料包都會從這個路由器進入)

路由器2提供給所有伺服器內網地址(響應使用者的所有資料包從這個路由器出去)

一般來說,上圖中director至少有一個公網IP地址,用於給網際網路使用者提供訪問介面。其餘的機器都是私有ip地址就可以。當然如果每個機器的ip都是公網ip的話更好(當然小公司不太可能有這實力)。  我們測試的時候就把所有的機器放到同一個物理網路(接在同一個交換機上,所有主機網絡卡型別都是橋接的就可以了)的邏輯網路裡邊就行了。沒那麼多資源

2、準備機器:1臺director、2臺realserver

叢集準備工作我們主要解決問題:如何給realserver配置VIP、如何使realserver響應的報文原地址是VIP而不是RIP、如何控制配置有VIP的realserver不響應ARP報文(意思就是雖有VIP地址但是不能把自己的mac地址響應出去,因為只有director才能將自己的VIP對應的mac響應出去)。下邊有詳細步驟,操作完就會知道原理。

進行下方步驟之前,先在各個realserver上裝上httpd服務,我們對http服務進行負載均衡測試。

yum install httpd -y 

在各個realserver上提供個簡單頁面,內容自定義。能看出差異來就行。

vim /var/www/html/1.html

2、1  director分配兩個地址(一塊網絡卡就可以了):VIP192.168.99.201配置到eth0:0上    DIP192.168.99.202 配置到eth0上 。  ###VIP就是提供給使用者的訪問介面。

在director上執行 :ifconfig  eth0 192.168.99.202/24  ;  ifconfig eth0:0 192.168.99.201/24   ###修改方法很多,可以使用setup命令修改。也可以自己修改/etc/sysconfig/network-script/ifcfg-eth#的檔案並重啟網路服務。

2、2  realserver1上配置一個地址:RIP192.168.99.207  ##RIP就是真實伺服器的ip地址

執行命令ifconfig eth0 192.168.99.207/24   ##setup命令進行配置也行,修改/etc/sysconfig/network-script/ifcfg-eth#檔案也行。

2、3  realserver2上配置一個地址:RIP192.168.99.208 

執行命令ifconfig eth0 192.168.99.208/24 ##setup命令進行配置也行,修改/etc/sysconfig/network-script/ifcfg-eth#檔案也行。

2、4 控制realserver對ARP報文的響應,並且設定VIP。(因為代理伺服器要將客戶端資料包轉發到各個realserver端,所以必須要使realserver有VIP地址。又因為資料包必須現發給director然後由director分發給各個realserver才行,所以必須使得realserver不能響應ARP報文)

執行命令:在每個realserver上都執行一遍,保障每個realserver不會響應ARP報文

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

設定每個realserver的VIP地址:每個realserver上都執行一遍配置好VIP

ifconfig lo:0 192.168.99.201 broadcast 192.168.99.201 netmask 255.255.255.255

測試下各個主機間是否能通訊:保正各個主機間能ping通。(如果不能ping通,可能防火牆未關閉。)

2、5  給各個伺服器新增路由,保正realserver相應的資料包原地址使用VIP而不是RIP。(因為realserver相應的資料包會從eth0網絡卡出去,linux系統會預設使用eth0上的RIP作為資料包的原地址,我們必須使用VIP做為源地址才可以,否則客戶端是不會接收資料包的)

執行命令:在各個realserver上都執行

route add -host 192.168.99.201 dev lo:0    ##意思是所有從lo:0進來的資料包,響應後必須使用lo:0上的地址作為原地址。而不管從那塊網絡卡出去

執行命令:在director上執行,這條路有不是必須的,但官方是這樣要求的。

route add -host 192.168.99.201 dev eth0:0    ##提示192.168.99.201是VIP地址。director會將資料包轉發給他挑選的realserver伺服器(通過mac地址轉發的,不修改ip地址。這就是為什麼說所有機器必須在同一個物理網路中)

測試所有主機間是否能夠通訊:互相ping下,通了就行了。

2、6 上方已經將伺服器準備完畢,我們開始寫lvs規則。

在director上執行命令:

ipvsadm  -A  -t  192.168.99.201:80 -s wlc  ##新增一個叢集服務,-t指的是tcp服務,192.168.99.201:80指的是在VIP的80埠上監聽。 -s wlc 指定叢集選擇realserver的演算法(權重最少連線演算法)。

ipvsadm -a -t 192.168.99.201:80 -r 192.168.99.207 -g  -w 1    ##向叢集服務新增一個realserver機器,權重為1。-g表示使用DR工作模式,可省略。

ipvsadm -a -t 192.168.99.201:80 -r 192.168.99.208 -g -w  2   ##第二個realserver伺服器,權重為2

ipvsadm -L -n ##檢視下規則是否新增好了

service  ipvsadm   save   ##儲存ipvs規則。/etc/sysconfig/ipvsadm 檔案就是儲存的位置。開啟看下。這樣保證重啟ipvsadm後規則依然存在。##重啟 :service ipvsadm restart 

2.7 測試,檢視是否有效果

在第四臺機器上執行多次:curl http://192.168.99.201/1.html 

也可以在windows上開啟瀏覽器輸入:http://192.168.99.201/1.html     ##重新整理多次

注意:測試的時候,最好使用linux下的curl命令。

如果在windows上執行瀏覽器測試,因為我們在同一個物理網路,windows作業系統的ARP快取表會對叢集測試產生影響。而沒有效果。想要看到效果,你必須每次重新整理瀏覽器前,先清空arp快取表。你需要以管理員許可權執行cmd.exe並且執行:arp -d 。windows作業系統(至少windows10是這樣的)第一次會使用director的mac地址傳送請求,以後都使用realserver的mac地址傳送。這樣我們的director就悲劇的起不到作用了(都不用director轉發了)。其實這種情況在真實的環境下是不會存在的。(客戶不會和你在同一個物理網路中)我測試的時候就被windows坑了,找到這個問題足足用了10多個小時,還以為我配置的有問題呢。悲劇啊

附加:我們的叢集搭建完畢,但有一種情況就是,後端realserver出了問題,前端的代理director是不知道的。那使用者的請求仍然會被髮往該故障伺服器。因此我們需要“檢測後端realserver”是否正常,並且動態的移除故障realserver和新增從故障恢復的realserver。

這裡附上邏輯,程式碼自己開發。


 寫上述自動化指令碼時的參考命令和工具:shell指令碼的基礎語法,請參看之前的部落格文章

curl --connection-timeout 1  http://192.168.99.201/1.html    ###請求頁面,若失敗則不線上。 --connection-timeout 設定超時時間,否則curl會阻塞很長時間

curl -I --connection-timeout 1  http://192.168.99.201/1.html   ###如果頁面內容多,可以只請求頭。-I表示只返回響應頭

echo $? ##檢視上述命令是否執行成功,0成功,1失敗

ARRAY=("192.168.99.201" "192.168.99.202")  ##shell指令碼陣列初始化

echo   ${ARRAY[0]}  ##引用陣列元素第一個

echo  ${#ARRAY[*]}  ##陣列個數

echo  ${ARRAY[*]}   ##陣列元素列表

echo  ${#ARRAY[0]}  ##陣列第一個元素的長度