LVS-DR工作原理圖文詳解(轉載)

爲了闡述方便,我根據官方原理圖另外製作了一幅圖,如下圖所示:VS/DR的體系結構:

LVS-DR工作原理

我將結合這幅原理圖及具體的實例來講解一下LVS-DR的原理,包括數據包、數據幀的走向和轉換過程。

官方的原理說明:Director接收用戶的請求,然後根據負載均衡算法選取一臺realserver,將包轉發過去,最後由realserver直接回復給用戶。

實例場景設備清單:

實例場景設備清單

說明:我這裏爲了方便,client是與vip同一網段的機器。如果是外部的用戶訪問,將client替換成gateway即可,因爲IP包頭是不變的,變的只是源mac地址。

① client向目標vip發出請求,Director接收。此時IP包頭及數據幀頭信息如下:

client向目標vip發出請求

② 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地址一樣對外通告的,不要搞得這麼特殊.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章