當(dāng)前位置: 首頁(yè)IT技術(shù)操作系統(tǒng) → Linux下雙網(wǎng)卡綁定技術(shù)實(shí)現(xiàn)負(fù)載均衡和失效保護(hù)(bond)

Linux下雙網(wǎng)卡綁定技術(shù)實(shí)現(xiàn)負(fù)載均衡和失效保護(hù)(bond)

更多

對(duì)于bonding的網(wǎng)絡(luò)負(fù)載均衡是我們?cè)谖募⻊?wù)器中常用到的,比如把三塊網(wǎng)卡,當(dāng)做一塊來(lái)用,解決一個(gè)IP地址,流量過(guò)大,服務(wù)器網(wǎng)絡(luò)壓力過(guò)大的問(wèn)題。對(duì)于文件服務(wù)器來(lái)說(shuō),比如NFS或SAMBA文件服務(wù)器,沒(méi)有所有一個(gè)管理員會(huì)把內(nèi)部網(wǎng)的文件服務(wù)器的IP地址弄非常多個(gè)來(lái)解決網(wǎng)絡(luò)負(fù)載的問(wèn)題。如果在內(nèi)網(wǎng)中,文件服務(wù)器為了管理和應(yīng)用上的方便,大多是用同一個(gè)IP地址。對(duì)于一個(gè)百M(fèi)的本地網(wǎng)絡(luò)來(lái)說(shuō),文件服務(wù)器在多個(gè)用戶(hù)同時(shí)使用的情況下,網(wǎng)絡(luò)壓力是極大的,特別是SAMABA和NFS服務(wù)器。為了解決同一個(gè)IP地址,突破流量的限制,畢竟網(wǎng)線和網(wǎng)卡對(duì)數(shù)據(jù)的吞吐量是有限制的。如果在有限的資源的情況下,實(shí)現(xiàn)網(wǎng)絡(luò)負(fù)載均衡,最佳的辦法就是 bonding ;

另一種情況就是服務(wù)器的一個(gè)網(wǎng)卡失效或網(wǎng)絡(luò)連接意外斷開(kāi),如果做了bonding就能轉(zhuǎn)換到另一個(gè)網(wǎng)卡的網(wǎng)絡(luò)連接上.確保服務(wù)的不中斷.

首先要看linux是否支持bonding,RHEL4已默認(rèn)支持了.(大部分發(fā)行版都支持)

# modinfo bonding

filename: /lib/modules/2.6.18-8.el5/kernel/drivers/net/bonding/bonding.ko

author: Thomas Davis,

tadavis@lbl.gov

and many others

description: Ethernet Channel Bonding Driver, v3.0.3

version: 3.0.3

license: GPL

srcversion: 2547D22885C2FDF28EF7D98

如果有類(lèi)似上面的信息輸出,說(shuō)明已支持了.

如果沒(méi)有,說(shuō)明內(nèi)核不支持bonding,需要重新編譯內(nèi)核

編譯內(nèi)核的步驟這里就不多寫(xiě)了,在make menuconfig里面

找到Bonding driver support這樣的對(duì)話框,選中他.

如果是模塊編譯,還需要掛載模塊.掛載bonding 模塊的方法;

[root@localhost#] modprobe bonding

如果/sbin/ifenslave沒(méi)有,我們還需要把他也獨(dú)立編譯出來(lái)

[root@lin:/home/beinan#] cd /usr/src/linux-2.6.20/Documentation/networking

[root@lin:/home/networking#] gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux-2.6.20/include ifenslave.c -o ifenslave

[root@lin:/home/networking#] cp ifenslave /sbin/ifenslave

1.#cp ifcfg-etho ifcfg-bond

2.#vim ifcfg-bond

DEVICE=bond0

IPADDR=192.168.100.2

NETMASK=255.255.255.0

NOBOOT=yes

BOOTPROTO=none

USERCTL=no

#vim ifcfg-eth0

DEVICE=eth0

HWADDR=xxxxxxxxxx

BOOTPROTO=none

ONBOOT=yes

USERCTL=no

MASTER=bond0

SLAVE=yes

TYPE=Ethernet

#vim ifcfg-eth1

DEVICE=eth1

HWADDR=xxxxxxxxxx

BOOTPROTO=none

ONBOOT=yes

USERCTL=no

MASTER=bond0

SLAVE=yes

TYPE=Ethernet

3. #vim /etc/modprobe.conf

加入下列行

alias bond0 bonding

options bond0 miimon=100 mode=1

alias net-pf-10 off //這行是關(guān)閉ipv6支持,也能不要)

說(shuō)明:miimon是用來(lái)進(jìn)行鏈路監(jiān)測(cè)的。 比如:miimon=100,那么系統(tǒng)每100ms監(jiān)測(cè)一次鏈路連接狀態(tài),如果有一條線路不通就轉(zhuǎn)入另一條線路;mode的值表示工作模式,他共有0,1,2,3四種模式,常用的為0,1兩種。

mode=0表示load balancing (round-robin)為負(fù)載均衡方式,兩塊網(wǎng)卡都工作。

mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主備的工作方式,也就是說(shuō)默認(rèn)情況下只有一塊網(wǎng)卡工作,另一塊做備份.

bonding只能提供鏈路監(jiān)測(cè),即從主機(jī)到交換機(jī)的鏈路是否接通。如果只是交換機(jī)對(duì)外的鏈路down掉了,而交換機(jī)本身并沒(méi)有故障,那么bonding會(huì)認(rèn)為鏈路沒(méi)有問(wèn)題而繼續(xù)使用

4 # service network restart

重啟后我們用ifconfig查看網(wǎng)卡信息,能看到多出一個(gè)bond0網(wǎng)卡.

bond0 Link encap:Ethernet HWaddr xxxxxxxxx

inet addr:192.168.1.200 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1

RX packets:48 errors:0 dropped:0 overruns:0 frame:0

TX packets:38 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:8817 (8.6 KiB) TX bytes:4807 (4.6 KiB)

eth0 Link encap:Ethernet HWaddr xxxxxxxxx

UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1

RX packets:44 errors:0 dropped:0 overruns:0 frame:0

TX packets:46 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:8196 (8.0 KiB) TX bytes:6007 (5.8 KiB)

Interrupt:169 Base address:0x2000

eth1 Link encap:Ethernet HWaddr xxxxxxxxx

UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1

RX packets:8 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:861 (861.0 b) TX bytes:0 (0.0 b)

Interrupt:193 Base address:0x2080

那也就是說(shuō)在主備模式下,當(dāng)一個(gè)網(wǎng)絡(luò)接口失效時(shí)(例如主交換機(jī)掉電等),不回出現(xiàn)網(wǎng)絡(luò)中斷,系統(tǒng)會(huì)按照cat /etc/rc.d/rc.local里指定網(wǎng)卡的順序工作,機(jī)器仍能對(duì)外服務(wù),起到了失效保護(hù)的功能.

能查看到bond0的工作狀態(tài)

[root@localhost ~]# cat /proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v3.0.3 (March 23, 2006)

Bonding Mode: fault-tolerance (active-backup)

Primary Slave: None

Currently Active Slave: eth0

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 0

Down Delay (ms): 0

Slave Interface: eth0

MII Status: up

Link Failure Count: 0

Permanent HW addr: 00:0c:29:c2:b3:44

Slave Interface: eth1

MII Status: up

Link Failure Count: 0

Permanent HW addr: 00:0c:29:c2:b3:4e

從另一臺(tái)機(jī)器ping我們剛才設(shè)置的IP地址,然后在虛擬機(jī)vmware下面,點(diǎn)其中的一個(gè)網(wǎng)卡

選中disconnect(斷開(kāi))

能看到ping只是出現(xiàn)了兩個(gè)time out后就又恢復(fù)了正常.說(shuō)明我們的設(shè)置起作用了.

需要說(shuō)明的是如果想做成負(fù)載均衡,僅僅設(shè)置這里options bond0 miimon=100 mode=0是不夠的,還需要設(shè)置交換機(jī)的端口.

從原理分析一下(bond運(yùn)行在mode 0下):

mode 0下bond所綁定的網(wǎng)卡的IP都被修改成相同的mac地址,如果這些網(wǎng)卡都被接在同一個(gè)交換機(jī),那么交換機(jī)的arp表里這個(gè)mac地址對(duì)應(yīng)的端口就有多個(gè),那么交換機(jī)接受到發(fā)往這個(gè)mac地址的包應(yīng)該往哪個(gè)端口轉(zhuǎn)發(fā)呢?正常情況下mac地址是全球唯一的,一個(gè)mac地址對(duì)應(yīng)多個(gè)端口肯定使交換機(jī)迷惑了。

所以mode0下的bond如果連接到交換機(jī),交換機(jī)這幾個(gè)端口應(yīng)該采取聚合方式(cisco稱(chēng)為ethernetchannel,foundry稱(chēng)為portgroup),因?yàn)榻粨Q機(jī)做了聚合后,聚合下的幾個(gè)端口也被捆綁成一個(gè)mac地址.我們的解決辦法是,兩個(gè)網(wǎng)卡接入不同的交換機(jī)即可。

取消linux bond的方法

另外大家關(guān)心的一個(gè)問(wèn)題應(yīng)該是:設(shè)置了bond 后如何去掉?

我現(xiàn)在想到的大致步驟是:

1,ifconfig bond0 down

2,vi modprobe.conf

引用:

alias eth0 e1000

alias eth1 e1000

#alias bond0 bonding (注釋掉)

#options bond0 miimon=100 mode=1 (注釋掉)

alias scsi_hostadapter mptbase

alias scsi_hostadapter1 mptscsih

alias scsi_hostadapter2 ips

alias usb-controller ohci-hcd

熱門(mén)評(píng)論
最新評(píng)論
發(fā)表評(píng)論 查看所有評(píng)論(0)
昵稱(chēng):
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)