網上看了不少關於LVS的文章,在選取2種模式LVS/DR和LVS/NAT,看到不少人的觀點都認爲DR模型中必需要使用多個公網地址,既DIP,VIP,RIP必須在同一網段內html
剛開始個人想法也是如此,所知道的惟一的解決方案就是在LVS集羣以前再加一臺路由器,用路由器作靜態NAT轉換,後端的LVS集羣則使用DR模式。不過這樣一來就比較耗成本,要有一臺路由器專門負責NAT的轉換工做,並且壓力都轉交給了前端的路由器,並且在性能,速度上相對於單純的DR模式並無提高。前端
DR模式的性能是絕對要比NAT要強不少的,通常NAT模式下,realserver不能超過10臺,而DR模式中,上百臺realserver也是木有問題的node
這兩天也就一直糾結於能不能使用單純的DR模式,並使用一個公網地址來實現(既VIP爲公網地址,RIP和DIP使用私網內部的地址)。參考了一些文檔linux
其實章文嵩博士已經在官網上明確表示過配置DR模式,徹底可讓VIP和DIP,RIP在不一樣網段的。參考http://zh.linuxvirtualserver.org/node/155web
而在此站點中也有關於DR模式使用不一樣網段的介紹 詳見http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-DR.html算法
在此,我在章文嵩博士的確定回答下參考了上面的介紹,總結了一下在真實場景中常見網絡架構中的場景後端
下面的圖有錯誤,VIP都是同一個地址200.0.0.10,在此糾正一下瀏覽器
這種拓撲是比較常見類型,先分析下LVS的工做時數據包的是如何流轉的網絡
1.客戶發送源IP爲1.1.1.1,目標IP爲200.0.0.10的服務請求架構
2.數據包通過中間的層層路由,翻山越嶺到Director
3.Director查詢ipvsadm中定義的表項,根據算法選取一個realserver
在這裏,因爲是DR模型,因此Director只改變了數據2層部分的目標mac地址,轉發給私網IP的realserver
4.Realserver收到數據包後,通過處理,封包轉發給客戶端
關鍵的一步來了,realserver怎麼將數據包回覆給客戶端?
首先,在realserver上定義一條特殊路由,目標爲VIP的數據包都從loopback口發出去,因而源地址仍是爲VIP,數據包的源和目的地址都沒有變化。可是因爲限制了arp的廣播和應答方式,外界並不知道realserver上有VIP的存在,realserver也不知道VIP這個網段中的其它主機,因此數據包就卡在realserver這裏了。解決方法就是,在realserver上添加一條默認路由,不知道的包都發往上私網地址的網關,因而路由器接收到數據包後就直接路由轉發給客戶了,在這個拓撲圖中,路由器連接交換機的接口要有2個地址,一個是私網的網關地址,一個是公網的網關地址
實現了單個公網IP地址的LVS/DR模式
說了一大堆可能看的也暈乎,再來一幅常見的拓撲圖
在這幅圖中,director直接從ISP拉一條專線(至於ISP和Director之間防火牆之類的東西暫作屏蔽)
數據包是這樣流轉的
客戶-->互聯網-- > Director-- > Realserver-- > Gateway-- > 客戶
拓撲是變幻無窮的,具體按照實際場景來實施
接下來是具體的實現方法,如下實驗由虛擬機完成,先給個拓撲
這裏192網段模擬公網,10網段模擬私網
先介紹下實驗環境:客戶機是個人主機,Director和2臺realserver都是虛擬機,他們之間用虛擬交換機VMnet8相連,其中客戶既充當客戶又充當網關,因此在VMnet8網卡上也配置了2個地址(爲了不混淆,實驗最後會經過抓包來驗證)
director
首先配置地址
[root@localhost ~]# ifconfig eth0 10.0.0.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0:1 192.168.92.100 netmask 255.255.255.0 up
而後配置集羣服務
[root@localhost ~]# ipvsadm -A -t 192.168.92.100:80 -s rr #建立一個http的集羣服務,使用輪詢的算法
[root@localhost ~]# ipvsadm -a -t 192.168.92.100:80 -r 10.0.0.1 –g #添加一個realserver,並使用DR模式。能夠看到:提供服務的VIP和realserver的RIP並不在一個網段中
[root@localhost ~]# ipvsadm -a -t 192.168.92.100:80 -r 10.0.0.2 –g #一樣方法再添加一個realserver
至此director配置完成
查看下IP地址的配置
查看下ipvsadm的配置
看到這裏是route模式,並在不一樣網段中
realserver
首先上來先限制arp的廣播和應答
[root@ww1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@ww1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@ww1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@ww1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
而後配置地址
[root@ww1 ~]# ifconfig eth0 10.0.0.1 netmask 255.255.255.0
[root@ww1 ~]# ifconfig lo:1 192.168.92.100 netmask 255.255.255.255 broadcast 192.168.92.100 #配置VIP必須不讓realserver對外廣播
接着配置路由
[root@ww1 ~]# route add -host 192.168.92.100 dev lo:1 #請求是VIP的包,以lo:1接口出去,因而源地址仍是爲VIP,不會致使由於從eth0出去將源地址變爲RIP
[root@ww1 ~]# route add default gw 10.0.0.3 #添加默認路由,指向私網的網關,在此實驗中是個人客戶機
而後啓動web服務
[root@ww1 ~]# echo "web1" > /var/www/html/index.html #建立網頁文件,web1作標示。在realserver2中以web2作標示
[root@ww1 ~]# service httpd start #啓動http服務
至此realserver1配置完成,realserver2也一樣按照此配置,地址改下,網頁文件不一樣就行
查看下IP地址的配置
這裏再提供下第二臺realserver的網卡信息,後面驗證數據傳送查看mac地址時要用到
查看下路由表
OK 配置都已經完成,在客戶機上打開瀏覽器驗證(瀏覽過程當中用抓包工具抓取VMnet8網卡的數據)
屢次刷新,發現每次返回的內容是不同的
再到director上看下鏈接數,發現鏈接進來了
而後抓包看看
首先看下本地主機VMnet8的mac地址
這個包是本地主機發往director的包,具體每臺虛擬機和主機的mac地址能夠看前文中查看IP地址的顯示結果
這個包是director發到realserver上的,源IP和目的IP都沒變,director只改變了目的mac地址
這個包是realserver傳給本地客戶的包(查看源和目標mac地址能夠驗證),源地址仍是爲VIP,目的地址爲本機客戶。
經過抓包驗證了數據的流向。
一個公網IP實現LVS/DR是可行的,數據包最終到達客戶時,在內部網絡中走的是私網的網關,至關於在公司內部饒了一個圈而已,而相比較NAT模式而言,DR模式的效率是NAT所不能比較的,在實際部署LVS中,也應該儘可能使用DR模式。