對於bonding的網路負載平衡是我們在檔案伺服器中常用到的,比如把三塊網卡,當做一塊來用,解決一個IP地址,流量過大,伺服器網路壓力過大的問題。對於檔案伺服器來說,比如NFS或SAMBA檔案伺服器,沒有任何一個管理員會把內部網的檔案伺服器的IP地址弄很多個來解決網路負載的問題。如果在內網中,檔案伺服器為了管理和應用上的方便,大多是用同一個IP地址。對於一個百M的本網來說,檔案伺服器在多個使用者同時使用的情況下,網路壓力是極大的,特別是SAMABA和NFS伺服器。為瞭解決同一個IP地址,突破流量的限制,畢竟網線和網卡對資料的輸送量是有限制的。如果在有限的資源的情況下,實現網路負載平衡,最好的辦法就是 bonding ;另一種情況就是伺服器的一個網卡失效或者網路連接意外斷開,如果做了bonding就可以切換到另一個網卡的網路連接上.保證服務的不中斷.詳細的資料可以參考:http://www.linux-foundation.org/en/Net:Bonding#Configuring_Multiple_Bonds_with_sysconfig下面實驗一下熱備模式.首先要看linux是否支援bonding,RHEL4已經預設支援了.(大部分發行版都支援)# modinfo bondingfilename: /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如果有類似上面的資訊輸出,說明已經支援了.如果沒有,說明核心不支援bonding,需要重新編譯核心編譯核心的步驟這裡就不多寫了,在make menuconfig裡面找到Bonding driver support這樣的對話方塊,選中它.如果是模組編譯,還需要掛載模組.掛載bonding 模組的方法;
[root@localhost#] modprobe bonding如果/sbin/ifenslave沒有,我們還需要把它也單獨編譯出來
[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/ifenslave1.編輯虛擬網路介面設定檔,指定網卡IP 沒有這個檔案我們可以從以前的設定檔複製一個過來,減少輸入的文字.
#cd /etc/sysconfig/network-scripts/#cp ifcfg-eth0 ifcfg-bond0#vi ifcfg-bond0
將第一行改成 DEVICE=bond0
# cat ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.1.200NETMASK=255.255.255.0
BROADCAST=192.168.1.255
ONBOOT=yes
TYPE=Ethernet 接下來修改以前的網卡的設定
[root@rhas-13 network-scripts]# cat ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
[root@rhas-13 network-scripts]# cat ifcfg-eth1
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none //網卡啟動協議.這裡我實驗了static,dhcp,none發現沒有什麼區別3 # vi /etc/moprobe.conf (舊的版本可能是modules.conf)
編輯 /etc/moprobe.conf 檔案,加入如下一行內容,以使系統在啟動時載入bonding模組,對外虛擬網路介面裝置為 bond0
加入下列行
alias bond0 bonding
options bond0 miimon=100 mode=1alias net-pf-10 off //這行是關閉ipv6支援,也可以不要)說明:miimon是用來進行鏈路監測的。 比如:miimon=100,那麼系統每100ms監測一次鏈路串連狀態,如果有一條線路不通就轉入另一條線路;mode的值表示工作模式,他共有0,1,2,3四種模式,常用的為0,1兩種。
mode=0表示load balancing (round-robin)為負載平衡方式,兩塊網卡都工作。
mode=1表示fault-tolerance (active-backup)提供冗餘功能,工作方式是主備的工作方式,也就是說預設情況下只有一塊網卡工作,另一塊做備份.
bonding只能提供鏈路監測,即從主機到交換器的鏈路是否接通。如果只是交換器對外的鏈路down掉了,而交換器本身並沒有故障,那麼bonding會認為鏈路沒有問題而繼續使用
4 # vi /etc/rc.d/rc.local
加入
ifenslave bond0 eth0 eth1重啟後我們用ifconfig查看網卡資訊,可以看到多出一個bond0網卡.bond0 Link encap:Ethernet HWaddr 00:0C:29:C2:B3:44
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 00:0C:29:C2:B3:44
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:0x2000eth1 Link encap:Ethernet HWaddr 00:0C:29:C2:B3:44
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:0x2080lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:960 (960.0 b) TX bytes:960 (960.0 b)那也就是說在主備模式下,當一個網路介面失效時(例如主交換器掉電等),不回出現網路中斷,系統會按照cat /etc/rc.d/rc.local裡指定網卡的順序工作,機器仍能對外服務,起到了失效保護的功能.可以查看到bond0的工作狀態
[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): 0Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:c2:b3:44Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:c2:b3:4e以上是一種實現方法.公司的資料庫伺服器上採用了另一種配置方法主要區別在網卡的設定檔上:vi ifcfg-eth0DEVICE=eth0
#USERCTL=no
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
ifcfg-eth1中也加入紅色的兩行,/etc/rc.local中的ifenslave bond0 eth0 eth1 可以省略掉.在虛擬機器中實驗一下效果.從另一台機器ping我們剛才設定的IP地址,然後在虛擬機器vmware下面,點其中的一個網卡選中disconnect(斷開)可以看到ping只是出現了兩個time out後就又恢複了正常.說明我們的配置起作用了.需要說明的是如果想做成負載平衡,僅僅設定這裡options bond0 miimon=100 mode=0是不夠的,還需要設定交換器的連接埠.從原理分析一下(bond運行在mode 0下):
mode 0下bond所綁定的網卡的IP都被修改成一樣的mac地址,如果這些網卡都被接在同一個交換器,那麼交換器的arp表裡這個mac地址對應的連接埠就有多個,那麼交換器接受到發往這個mac地址的包應該往哪個連接埠轉寄呢?正常情況下mac地址是全球唯一的,一個mac地址對應多個連接埠肯定使交換器迷惑了。
所以mode0下的bond如果串連到交換器,交換器這幾個連接埠應該採取彙總方式(cisco稱為ethernetchannel,foundry稱為portgroup),因為交換器做了彙總後,彙總下的幾個連接埠也被捆綁成一個mac地址由於家裡沒有三層交換器,這裡的實驗留給網友自行驗證了