LVS-DR工做原理圖文詳解

原文地址: http://www.cnblogs.com/czh-liyu/archive/2011/11/29/2267963.htmlhtml

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

LVS-DR工做原理

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

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

實例場景設備清單:tcp

實例場景設備清單

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

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

client向目標vip發出請求

② VS根據負載均衡算法選擇一臺active的realserver(假設是192.168.57.122),將此RIP所在網卡的mac地址做爲目標mac地址,發送到局域網裏。此時IP包頭及數據幀頭信息以下:htm

③ realserver(192.168.57.122)在局域網中收到這個幀,拆開後發現目標IP(VIP)與本地匹配,因而處理這個報文。隨後從新封裝報文,發送到局域網。此時IP包頭及數據幀頭信息以下:blog

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

相關文章
相關標籤/搜索