天天看點

LVS的dr模型的工作原理

使用LVS的dr模型負載均衡兩台web伺服器。

條件:

    隻有一個公網位址。172.10.0.9

    RIP使用私有位址

如下圖所示:

<a href="http://s3.51cto.com/wyfs02/M00/49/CB/wKiom1QawQCSKuynAAKGcRcK5Jc775.jpg" target="_blank"></a>

路由器處理資料封包的流程:

    使用者通路叢集服務的資料封包到達路由器後,通過路由決策發現從路由器的 eth1 網卡可以到達:172.10.0.0/16網絡,(eth1 網卡配置有位址:172.10.0.1)路由器發現是本地網絡的通訊(基于MAC位址通信的),于是路由器向172.10.0.0/16網絡發送ARP位址解析廣播請求:請求172.10.0.9對應的MAC位址,在172.10.0.0/16網絡的所有主機都可以收到ARP位址解析請求。如果該網絡的某台主機配置有路由器請求解析的IP位址,就把MAC位址告訴,路由器。路由器就會使用該MAC位址把資料封包發送給該主機。

LVS負載均衡原理:

    通路叢集服務的請求都要先到達Director,由Director根據排程算法。把通路叢集服務的請求均衡到後端的RealServer.

根據上述分析,要做下述一些配置:

1、請求封包流入

 因為,我們的 Directory、Realserver1、Realserver2 都配置有VIP位址,是以基于本地通訊的原理

       和LVS負載均衡的工作原理考慮:

 目的:要控制路由器把使用者請求通路叢集服務的資料封包隻送到Director,

       不會把資料封包送到 RealServer.

 手段:通過控制無論任何時候路由器的ARP緩存中:VIP對應的MAC位址都是Director的VIP位址所在的

       網卡的MAC位址。這樣保證路由器一定會把資料封包送到Director

 方法:

1

2

3

4

<code>   </code><code>A)、在路由器做靜态位址綁定:</code>

<code>   </code><code>B)、aprtables,阻止路由器發送的ARP位址解析請求(請求VIP對應的MAC)進入RealServer</code>

<code>   </code><code>C)、修改ReserServer主機的核心參數,将RS上的VIP配置在lo接口的别名上,并限制其不能響應</code>

<code>        </code><code>對VIP位址解析請求,也不能把MAC位址通告出去。</code>

LVS的dr模型,Director通過修改請求通路叢集服務的封包的MAC位址實作把資料封包分發到後端的RealServer.

 是以,要保證Director能夠基于MAC位址與後端的RealServer進行通信。

 方法:Director與RealServer在同一個實體網絡。

2、響應封包流出

當RealServer 建構完響應封包之後,直接把封包送給用戶端。

 因為,用戶端請求的是VIP,是以,RealServer 建構的響應的資料封包的源IP是CIP(10.10.0.1)目标IP是VIP(172.10.0.9),用戶端才會接收。

 是以,在RealServer中通過主機路由指定使用配置在lo:0的VIP對響應的資料封包進行封裝。再通過eth0把響應的資料封包送達用戶端。

由于RealServer的RIP是私有網絡,不能把資料封包送達用戶端。是以給RealServer指定一個預設網關,RealServer把不屬于本網絡的資料封包發給預設網關由預設網關把資料封包送達用戶端。

LVS工作流程如下圖:

<a href="http://s3.51cto.com/wyfs02/M00/49/CD/wKioL1QaxgyAYwvFAAM_8kQI7YE526.jpg" target="_blank"></a>

一、配置路由:

1、配置通往 172.10.0.0/16 網絡路由

在路由器配置到達172.10.0.0/16網終的出口

5

6

<code>[root@route ~]</code><code># ifconfig eth1 172.10.0.1 up</code>

<code>[root@route ~]</code><code># route -n</code>

<code>Kernel IP routing table</code>

<code>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface</code>

<code>172.10.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth1</code>

<code>10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth0</code>

添加一條網絡路由

到達 172.10.0.0/16 網絡從路由器的 eth1 接口172.10.0.1 出去。

也就是說,172.10.0.1 是與該網絡直接相連的(基于MAC位址通訊)。

<code>[root@route ~]</code><code># route add -net 172.10.0.0/16 gw 172.10.0.1 eth1</code>

檢視配置網絡路由後

<code>172.10.0.0      172.10.0.1      255.255.0.0     UG    0      0        0 eth1  ------&gt; 網絡路由。資料封包通過eth1接口可以到這172.10.0.0</code><code>/16</code><code>網絡</code>

<code>172.10.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth1 -------&gt; Gateway 網關是0.0.0.0  這是本地網絡,</code>

2、再添加一條 RIP能夠到達10.10.0.1 的路由(Reral Server 通夠把響應的資料封包送達用戶端的路由)

在路由器配置到達192.168.60.0/24網絡的出口

<code>[root@route ~]</code><code># ifconfig eth1:0 192.168.60.1 up</code>

配置前

7

<code>192.168.60.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1</code>

<code>172.10.0.0      172.10.0.1      255.255.0.0     UG    0      0        0 eth1</code>

增加到達192.168.60.0/24網絡的路由

<code>[root@route ~]</code><code># route add -net 192.168.60.0/24 gw 192.168.60.1 eth1:0</code>

配置後

8

<code>192.168.60.0    192.168.60.1    255.255.255.0   UG    0      0        0 eth1</code>

說明:

    Gateway 網關是0.0.0.0  這是本地網絡,

    Destination 為: 0.0.0.0 說明這是預設網關。

路由器的位址配置如下:

9

10

11

12

<code>[root@route ~]</code><code># ifconfig | grep -B 1 "[[:space:]]*inet[[:space:]]"</code>

<code>eth0      Link encap:Ethernet  HWaddr 00:0C:29:79:15:5C</code>

<code>          </code><code>inet addr:10.10.0.88  Bcast:10.255.255.255  Mask:255.0.0.0</code>

<code>--</code>

<code>eth1      Link encap:Ethernet  HWaddr 00:0C:29:79:15:66</code>

<code>          </code><code>inet addr:172.10.0.1  Bcast:172.10.255.255  Mask:255.255.0.0</code>

<code>eth1:0    Link encap:Ethernet  HWaddr 00:0C:29:79:15:66</code>

<code>          </code><code>inet addr:192.168.60.1  Bcast:192.168.60.255  Mask:255.255.255.0</code>

<code>lo        Link encap:Local Loopback</code>

<code>          </code><code>inet addr:127.0.0.1  Mask:255.0.0.0</code>

3、打開linux主機的轉發功能

<code>[root@route ~]</code><code># echo 1 &gt; /proc/sys/net/ipv4/ip_forward</code>

二、配置Director

1、配置DIR位址

<code>[root@director ~]</code><code># ifconfig eth0 192.168.60.4 up</code>

2、配置VIP位址

<code>[root@director ~]</code><code># ifconfig eth0:0 172.10.0.9 up</code>

檢視Director地IP位址配置情況

<code>[root@director ~]</code><code># ifconfig  | grep -B 1 "[[:space:]]*inet[[:space:]]"</code>

<code>eth0      Link encap:Ethernet  HWaddr 00:0C:29:1B:03:49</code>

<code>          </code><code>inet addr:192.168.60.4  Bcast:192.168.60.255  Mask:255.255.255.0</code>

<code>eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:1B:03:49</code>

<code>          </code><code>inet addr:172.10.0.9  Bcast:172.10.255.255  Mask:255.255.0.0</code>

由于後端RealServer建構響應的資料封包沒有經過Director,是以,Director無需配置任何路由條目。

<code>[root@director ~]</code><code># route -n</code>

<code>192.168.60.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0</code>

<code>172.10.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0</code>

檢視在路由器的arp 表

<code>[root@route ~]</code><code># arp -e</code>

<code>Address                  HWtype  HWaddress           Flags Mask            Iface</code>

<code>10.10.0.1                ether   00:50:56:C0:00:01   C                     eth0</code>

<code>192.168.60.9             ether   00:0C:29:FC:C7:44   C                     eth1</code>

<code>192.168.60.4             ether   00:0C:29:1B:03:49   C                     eth1</code>

<code>172.10.0.9               ether   00:0C:29:1B:03:49   C                     eth1</code>

    當一台主機加入一個網絡時,它會向該網絡發出ARP通告。是以在路由器使用【arp -e】指令會檢視到剛才配置的位址對應的MAC位址。

三、配置 RealServer

通過在後端的每個RealServer配置核心參數的方式,保證路由器的ARP緩沖中隻有Director的VIP的MAC對應條目。

ARP有兩種工作方式:

<code>        </code><code>(A)、ARP廣播解析請求,向網絡中發送ARP廣播請求解析IP位址對應的MAC位址,</code>

<code>             </code><code>進而實作資料封包的傳輸的。</code>

<code>            </code><code>arp_ignore = 1 請求解析的IP位址,恰好是配置在ARP廣播封包進來的網卡接口,</code>

<code>                           </code><code>就響應ARP解析請求。</code>

<code>    </code><code>(B)、一個主機加入一個網絡,該主機會發出ARP通告。自己的IP位址是什麼,自己的MAC地</code>

<code>        </code><code>址是什麼.由于在linux系統中IP位址屬于核心的,預設會把該主機的所有IP位址都通</code>

<code>        </code><code>告出去的。</code>

<code>            </code><code>arp_announce = 2  僅通告與網絡直連的接口的位址(IP位址與MAC位址),</code>

這樣就實作了,RealServer不能向外通告配置在lo:0的VIP位址,也不會響應對VIP的ARP位址解析請求。

1、配置 real2 server

(1)、配置RIP位址

<code>[root@real2 ~]</code><code># ifconfig eth0 192.168.60.9 up</code>

(2)、配置核心參數,限制網卡對ARP協定的行為。

<code>[root@real2 ~]</code><code># echo 2 &gt; /proc/sys/net/ipv4/conf/all/arp_announce</code>

<code>[root@real2 ~]</code><code># echo 2 &gt; /proc/sys/net/ipv4/conf/lo/arp_announce</code>

<code>[root@real2 ~]</code><code># echo 1 &gt; /proc/sys/net/ipv4/conf/lo/arp_ignore</code>

<code>[root@real2 ~]</code><code># echo 1 &gt; /proc/sys/net/ipv4/conf/all/arp_ignore</code>

(3)、配置VIP

<code>[root@real2 ~]</code><code># ifconfig lo:0 172.10.0.9 netmask 255.255.255.255 broadcast  172.10.0.9 up</code>

(4)、檢視resl2的VIP是否向外通告了?

<code>[root@route ~]</code><code># ping -c 1 172.10.0.9</code>

<code>PING 172.10.0.9 (172.10.0.9) 56(84) bytes of data.</code>

<code>64 bytes from 172.10.0.9: icmp_seq=1 ttl=64 </code><code>time</code><code>=0.227 ms</code>

<code>--- 172.10.0.9 </code><code>ping</code> <code>statistics ---</code>

<code>1 packets transmitted, 1 received, 0% packet loss, </code><code>time</code> <code>0ms</code>

<code>rtt min</code><code>/avg/max/mdev</code> <code>= 0.227</code><code>/0</code><code>.227</code><code>/0</code><code>.227</code><code>/0</code><code>.000 ms</code>

從上面結果可以看出,沒有向外通告。

(5)、配置主機路由,使得RealServer建構響應封包使用配置在lo:0 的VIP位址作為源位址封裝資料封包。在linux中,資料封包從那塊網卡出去,資料封包的源位址就是該網卡的IP位址

<code>[root@real2 ~]</code><code># route -n</code>

配置主機路由

<code>[root@real2 ~]# route  add  -host 10.10.0.9 dev lo:0</code>

<code>10.10.0.9       0.0.0.0         255.255.255.255 UH    0      0        0 lo</code>

(6)、添置預設路由,讓RealServer能夠把資料包送到路由器,再由路由器送給用戶端。

<code>[root@real2 ~]</code><code># route add default gw 192.168.60.1</code>

<code>0.0.0.0         192.168.60.1    0.0.0.0         UG    0      0        0 eth0</code>

(7)、測試是不能夠PING通網關

<code>[root@real2 ~]</code><code># ping -c 1 192.168.60.1</code>

<code>PING 192.168.60.1 (192.168.60.1) 56(84) bytes of data.</code>

<code>64 bytes from 192.168.60.1: icmp_seq=1 ttl=64 </code><code>time</code><code>=0.177 ms</code>

<code>--- 192.168.60.1 </code><code>ping</code> <code>statistics ---</code>

<code>rtt min</code><code>/avg/max/mdev</code> <code>= 0.177</code><code>/0</code><code>.177</code><code>/0</code><code>.177</code><code>/0</code><code>.000 ms</code>

(8)、在RealServer的配置

<code>[root@real2 ~]</code><code># ifconfig | grep -B 1  "[[:space:]]*inet[[:space:]]"</code>

<code>eth0      Link encap:Ethernet  HWaddr 00:0C:29:FC:C7:44</code>

<code>          </code><code>inet addr:192.168.60.9  Bcast:192.168.60.255  Mask:255.255.255.0</code>

<code>lo:0      Link encap:Local Loopback</code>

<code>          </code><code>inet addr:172.10.0.9  Mask:255.255.255.255</code>

(9)、檢視路由器的arp緩存,是否有RealServer的VIP---MAC條目

<code>192.168.60.8             ether   00:0C:29:20:12:03   C                     eth1</code>

2、配置 real1 server

<code>[root@real1 ~]</code><code># ifconfig eth0 192.168.60.8 up</code>

<code>[root@real1 ~]</code><code># echo 2 &gt; /proc/sys/net/ipv4/conf/all/arp_announce</code>

<code>[root@real1 ~]</code><code># echo 2 &gt; /proc/sys/net/ipv4/conf/lo/arp_announce</code>

<code>[root@real1 ~]</code><code># echo 1 &gt; /proc/sys/net/ipv4/conf/lo/arp_ignore</code>

<code>[root@real1 ~]</code><code># echo 1 &gt; /proc/sys/net/ipv4/conf/all/arp_ignore</code>

<code>[root@real1 ~]</code><code># ifconfig lo:0 172.10.0.9 netmask 255.255.255.255 broadcast 172.10.0.9 up</code>

<code>64 bytes from 172.10.0.9: icmp_seq=1 ttl=64 </code><code>time</code><code>=0.298 ms</code>

<code>rtt min</code><code>/avg/max/mdev</code> <code>= 0.298</code><code>/0</code><code>.298</code><code>/0</code><code>.298</code><code>/0</code><code>.000 ms</code>

從上面看出,real1沒有把VIP向通告

<code>[root@real1 ~]</code><code># route -n</code>

添加主機路由,封裝響應封包

<code>[root@real1 ~]</code><code># route add -host 172.10.0.9 dev lo:0</code>

<code>172.10.0.9      0.0.0.0         255.255.255.255 UH    0      0        0 lo</code>

(6)、添置預設路由,讓RealServer能夠把資料包送到路由器,再由路由器送給用戶端CIP

<code>[root@real1 ~]</code><code># route add default gw 192.168.60.1</code>

(7)、測試能夠PING通網關

<code>[root@real1 ~]</code><code># ping -c 1  192.168.60.1</code>

<code>64 bytes from 192.168.60.1: icmp_seq=1 ttl=64 </code><code>time</code><code>=0.281 ms</code>

<code>rtt min</code><code>/avg/max/mdev</code> <code>= 0.281</code><code>/0</code><code>.281</code><code>/0</code><code>.281</code><code>/0</code><code>.000 ms</code>

<code>[root@real1 ~]</code><code># ifconfig | grep -B 1  "[[:space:]]*inet[[:space:]]"</code>

<code>eth0      Link encap:Ethernet  HWaddr 00:0C:29:20:12:03</code>

<code>          </code><code>inet addr:192.168.60.8  Bcast:192.168.60.255  Mask:255.255.255.0</code>

四、啟動RealServer的httpd服務

1、啟動real2

<code>[root@real2 httpd-2.4.1]</code><code># ./bin/apachectl start</code>

<code>[root@real2 httpd-2.4.1]</code><code># netstat -apntl | grep httpd</code>

<code>tcp        0      0 :::80                       :::*                        LISTEN      2238</code><code>/httpd</code>

2、啟動real1

<code>[root@real1 httpd-2.4.1]</code><code># ./bin/apachectl start</code>

<code>[root@real1 httpd-2.4.1]</code><code># netstat -anptl | grep "httpd"</code>

<code>tcp        0      0 :::80                       :::*                        LISTEN      2138</code><code>/httpd</code>

五、配置lvs 

1、定義叢集服務

<code>[root@director ~]</code><code># ipvsadm -A -t 172.10.0.9:80 -s rr</code>

2、向叢集服務添加RealServer

<code>[root@director ~]</code><code># ipvsadm -a -t 172.10.0.9:80  -r 192.168.60.9:80 -g -w 1</code>

<code>[root@director ~]</code><code># ipvsadm -a -t 172.10.0.9:80  -r 192.168.60.8:80 -g -w 1</code>

3、檢視ipvs規則

<code>[root@director ~]</code><code># ipvsadm -L -n</code>

<code>IP Virtual Server version 1.2.1 (size=4096)</code>

<code>Prot LocalAddress:Port Scheduler Flags</code>

<code>  </code><code>-&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</code>

<code>TCP  172.10.0.9:80 rr</code>

<code>  </code><code>-&gt; 192.168.60.8:80              Route   1      0          0</code>

<code>  </code><code>-&gt; 192.168.60.9:80              Route   1      0          0</code>

六、通路測試

<a href="http://s3.51cto.com/wyfs02/M01/49/CB/wKiom1Qayg_CIcfLAAEpP9Locpg087.jpg" target="_blank"></a>

從上面通路結果可以看出,LVS已經做通路叢集排程了

一直重新整理,檢視LVS的狀态如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/49/CD/wKioL1QaypeAKc9KAAYSNGpBsno246.jpg" target="_blank"></a>

從lvs的排程狀态可以看出,LVS的dr模型已經可以完成排程了。

OK!!!

     本文轉自成長的小蟲 51CTO部落格,原文連結:<b>http://blog.51cto.com/9528du/1554905</b>,如需轉載請自行聯系原作者

繼續閱讀