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