爲了闡述方便,我根據官方原理圖另外製作了一幅圖,如下圖所示:VS/DR的體系結構:
我將結合這幅原理圖及具體的實例來講解一下LVS-DR的原理,包括數據包、數據幀的走向和轉換過程。
官方的原理說明:Director接收用戶的請求,然後根據負載均衡算法選取一臺realserver,將包轉發過去,最後由realserver直接回復給用戶。
實例場景設備清單:
說明:我這裏爲了方便,client是與vip同一網段的機器。如果是外部的用戶訪問,將client替換成gateway即可,因爲IP包頭是不變的,變的只是源mac地址。
① client向目標vip發出請求,Director接收。此時IP包頭及數據幀頭信息如下:
② VS根據負載均衡算法選擇一臺active的realserver(假設是192.168.57.122),將此RIP所在網卡的mac地址作爲目標mac地址,發送到局域網裏。此時IP包頭及數據幀頭信息如下:
③ realserver(192.168.57.122)在局域網中收到這個幀,拆開後發現目標IP(VIP)與本地匹配,於是處理這個報文。隨後重新封裝報文,發送到局域網。此時IP包頭及數據幀頭信息如下:
④ 如果client與VS同一網段,那麼client(192.168.57.135)將收到這個回覆報文。如果跨了網段,那麼報文通過gateway/路由器經由Internet返回給用戶。
LVS/DR模式工作原理的常見問題。
1. LVS/DR如何處理請求報文的,會修改IP包內容嗎?
1.1 vs/dr本身不會關心IP層以上的信息,即使是端口號也是tcp/ip協議棧去判斷是否正確,vs/dr本身主要做這麼幾個事:
1)接收client的請求,根據你設定的負載均衡算法選取一臺realserver的ip;
2)以選取的這個ip對應的mac地址作爲目標mac,然後重新將IP包封裝成幀轉發給這臺RS;
3)在hash table中記錄連接信息。
vs/dr做的事情很少,也很簡單,所以它的效率很高,不比硬件負載均衡設備差多少。
數據包、數據幀的大致流向是這樣的:client --> VS --> RS --> client
1.2 前面已作了回答,vs/dr不會修改IP包的內容.
2. RealServer爲什麼要在lo接口上配置VIP?在出口網卡上配置VIP可以嗎?
2.1 既然要讓RS能夠處理目標地址爲vip的IP包,首先必須要讓RS能接收到這個包。
在lo上配置vip能夠完成接收包並將結果返回client。
2.2 答案是不可以將VIP設置在出口網卡上,否則會響應客戶端的arp request,造成client/gateway arp table紊亂,以至於整個load balance都不能正常工作。
3. RealServer爲什麼要抑制arp幀?
這個問題在上一問題中已經作了說明,這裏結合實施命令進一步闡述。我們在具體實施部署的時候都會作如下調整:
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
我相信很多人都不會弄懂它們的作用是什麼,只知道一定得有。我這裏也不打算拿出來詳細討論,只是作幾點說明,就當是補充吧。
3.1
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
這兩條是可以不用的,因爲arp對邏輯接口沒有意義。
3.2 如果你的RS的外部網絡接口是eth0,那麼
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
其實真正要執行的是:
echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce
所以我個人建議把上面兩條也加到你的腳本里去,因爲萬一系統裏上面兩條默認的值不是0,那有可能是會出問題滴。
arp_ignore:
定義對目標地址爲本地IP的ARP詢問不同的應答模式0
0 - (默認值): 迴應任何網絡接口上對任何本地IP地址的arp查詢請求
1 - 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求
2 -只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內
3 - 不迴應該網絡界面的arp請求,而只對設置的唯一和連接地址做出迴應
4-7 - 保留未使用
8 -不迴應所有(本地地址)的arp查詢
確定了向外發送ARP請求的發出地址 也即使VIP 地址
arp_announce - INTEGER
對網絡接口上,本地IP地址的發出的,ARP迴應,作出相應級別的限制:
確定不同程度的限制,宣佈對來自本地源IP地址發出Arp請求的接口
0 - (默認) 在任意網絡接口(eth0,eth1,lo)上的任何本地地址
1 -儘量避免不在該網絡接口子網段的本地地址做出arp迴應. 當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候很有用.此時會檢查來訪IP是否爲所有接口上的子網段內ip之一.如果改來訪IP不屬於各個網絡接口上的子網段內,那麼將採用級別2的方式來進行處理.
2 - 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通信的本地地址.首要是選擇所有的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址. 如果沒有合適的地址被發現,將選擇當前的發送網絡接口或其他的有可能接受到該ARP迴應的網絡接口來進行發送.
限制了使用本地的vip地址作爲優先的網絡接口
4. LVS/DR load balancer(director)與RS爲什麼要在同一網段中?
從第一個問題中大家應該明白vs/dr是如何將請求轉發給RS的了吧?它是在數據鏈路層來實現的,所以director必須和RS在同一網段裏面。
5. 爲什麼director上eth0接口除了VIP另外還要配一個ip(即DIP)?
5.1 如果是用了keepalived等工具做HA或者Load Balance,則在健康檢查時需要用到DIP。
5.2 沒有健康檢查機制的HA或者Load Balance則沒有存在的實際意義。
6. LVS/DR ip_forward需要開啓嗎?
不需要。因爲director跟realserver是同一個網段,無需開啓轉發。
7. director的vip的netmask一定要是255.255.255.255嗎?
lvs/dr裏,director的vip的netmask 沒必要設置爲255.255.255.255,也不需要再去
route add -host $VIP dev eth0:0
director的vip本來就是要像正常的ip地址一樣對外通告的,不要搞得這麼特殊.