原文地址: http://www.cnblogs.com/czh-liyu/archive/2011/11/29/2267963.htmlhtml
爲了闡述方便,我根據官方原理圖另外製做了一幅圖,以下圖所示:VS/DR的體系結構:算法
我將結合這幅原理圖及具體的實例來說解一下LVS-DR的原理,包括數據包、數據幀的走向和轉換過程。網絡
官方的原理說明:Director接收用戶的請求,而後根據負載均衡算法選取一臺realserver,將包轉發過去,最後由realserver直接回復給用戶。負載均衡
實例場景設備清單:tcp
說明:我這裏爲了方便,client是與vip同一網段的機器。若是是外部的用戶訪問,將client替換成gateway便可,由於IP包頭是不變的,變的只是源mac地址。工具
① client向目標vip發出請求,Director接收。此時IP包頭及數據幀頭信息以下:server
② 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地址同樣對外通告的,不要搞得這麼特殊.