首先來(lái)說(shuō)LVS作為一個(gè)四層的負(fù)載均衡軟件,在我們的日常工作中得到了很多的利用,尤其是和heartbeat和keepalived組合形成了高可用的負(fù)載均衡。下面的文章將描述和LVS相關(guān)的原理;
在說(shuō)明之前我們先解釋幾個(gè)名詞:
這里我們以及后面的例子我們都會(huì)假設(shè)這么一個(gè)場(chǎng)景,我們使用LVS為我們的web集群提供負(fù)載均衡功能:
現(xiàn)在客戶端CLient訪問(wèn)www.a.com ,經(jīng)過(guò)dns查詢得到目的IP為VIP,目的端口為80,于是客戶端和我們VIP,端口80建立連接(TCP三次握手,只是建立連接沒有傳送數(shù)據(jù)),之后客戶端發(fā)送HTTP請(qǐng)求,LVS在VIP上收到之后,根據(jù)hash策略,從后端realserver中選出一臺(tái)作為此次請(qǐng)求的接受者,假設(shè)為RIP1,LVS將請(qǐng)求包的目的mac地址更改為RIP1的mac,然后封裝后轉(zhuǎn)發(fā)給后端的RIP1,同時(shí)將該鏈接記錄在hash表中。
RIP1的某一塊網(wǎng)卡,比如eth0,接收到這個(gè)轉(zhuǎn)發(fā)包看到mac地址是自己的,于是就轉(zhuǎn)發(fā)給上層的IP層,IP層解開包后,發(fā)現(xiàn)目的的IP地址也是自己,因?yàn)閂IP也配置在我們的一塊non-arp的網(wǎng)卡上(比如lo:0),然后根據(jù)IP首部的類型字段(這里是TCP),把請(qǐng)求送給TCP,然后TCP根據(jù)目的端口80,傳給應(yīng)用層的Apache,Apache處理完請(qǐng)求之后,將數(shù)據(jù)傳給TCP,TCP將源端口更改為80 ,源IP更改為VIP,目的端口更改為客戶端的端口,目的IP更改為Client的IP,打包后給IP層,IP層根據(jù)目的地址進(jìn)行路由,然后經(jīng)過(guò)網(wǎng)絡(luò)返給Client,完成了一次請(qǐng)求,而不經(jīng)過(guò)LB;
這里注意的是,VIP和realserver必須在同一個(gè)網(wǎng)段中的(想想為什么?)
優(yōu)點(diǎn):
缺點(diǎn):
由于DR模式使用的是更改目的的mac地址,所以難免要和arp打交道。
一般來(lái)說(shuō)客戶端是不會(huì)和我們的服務(wù)器在同一個(gè)網(wǎng)段的,那么請(qǐng)求就會(huì)經(jīng)過(guò)我們的服務(wù)器所在網(wǎng)段的路由設(shè)備上,我們知道在同一網(wǎng)段中,兩個(gè)主機(jī)通信靠的是二層的物理地址而不是Ip地址,所以當(dāng)請(qǐng)求包到達(dá)這路由設(shè)備上之后,若路由設(shè)備的arp表中沒有VIP對(duì)應(yīng)的MAC,就會(huì)廣播一個(gè)arp請(qǐng)求,在這里我們將LVS和real server上都配置了VIP,那么按照理論他們都會(huì)響應(yīng)這個(gè)arp請(qǐng)求,那路由器的arp表就會(huì)亂了。所以,我們就需要只讓LVS上響應(yīng)VIP的arp請(qǐng)求,而real server 不響應(yīng);
Linux主機(jī)有這么一個(gè)特性,假設(shè)我們的主機(jī)上有兩塊網(wǎng)卡,比如eth0,eth1 當(dāng)arp請(qǐng)求eth1的mac地址的時(shí)候,eth1會(huì)答復(fù),這個(gè)是理所當(dāng)然的,但是eth0也會(huì)“好心”的幫eth1回答這個(gè)arp請(qǐng)求; 要防止這樣的話,就需要更改下我們的一些內(nèi)核參數(shù):
正常情況下只寫第二條就是了,all 是指所有設(shè)備的interface,當(dāng)all和具體的interface比如lo,按照最大的值生效;
另外一個(gè)linux的特性就是,對(duì)于一個(gè)從realserver發(fā)出的arp請(qǐng)求,其源IP是VIP,而出口不會(huì)是lo,這里假設(shè)是eth0,那么這個(gè)arp請(qǐng)求包里里面,源IP就是VIP,源MAC是eth0的mac,目的IP是網(wǎng)關(guān),那么路由器在接收到這個(gè)請(qǐng)求的時(shí)候,會(huì)將將自己的相應(yīng)接口的硬件地址放在arp響應(yīng)包中,同時(shí)將請(qǐng)求包中的源IP及MAC放在arp高速緩存中,那這下可就亂套 了,就會(huì)使真正的VIP得不到正確的請(qǐng)求了.
這是因?yàn)?,正常的情況下,arp的請(qǐng)求中源IP是出去的所在接口的地址,mac也是出去的接口的mac,但linux在默認(rèn)情況下卻不是這樣的,如果一個(gè)接口發(fā)出的arp請(qǐng)求須經(jīng)另一個(gè)出口出去的時(shí)候,源IP就不是所出去接口的IP,那么將內(nèi)核參數(shù)設(shè)置為 2 相應(yīng)的解決了這個(gè)問(wèn)題。
聯(lián)系客服