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]} ##陣列第一個元素的長度