雙網路卡單IP(轉貼)

tonykorn97發表於2007-11-09
我以前關心過這個事情,當時因為LINUX閘道器流量不大,沒實際做捆綁,還有就是不知道對交換機設定有沒有要求。

將多塊網路卡虛擬成為一塊網路卡,使其具有相同的IP地址,來實現提升主機的網路吞吐量或者是提高可用性,這種技術被稱作bonding。這項技術其實在sun和cisco中已經存在,分別稱為Trunking和etherchannel技術,在Linux中,這種技術稱為bonding。
bonding驅動最早來自於Donald Becker的beowulf對kernel2.0的補丁。但是已經有了很大的改進和變化,最早來自於extreme-linux和beowulf的工具已經不適用於現在版本的驅動了。
對於新版本的驅動,請參考本文最後的鏈結地址。
1、安裝
1) 編譯帶有bonding driver的核心
對於最新版本的bonding驅動,使用核心2.2.18或以上版本(否則需要對核心打補丁)。
使用make menuconfig/xconfig/config來編譯核心,並在"Network device support"部分選擇 "Bonding driver support",這裡推薦配置該驅動為模組方式,因為目前這是傳遞給引數給驅動並配置多個bonding裝置的唯一方法。
編譯和安裝新的核心和模組:
make dep;make clean;make bzImage;make modules;make modules_install;
2) 獲取並安裝使用者管理工具
這個版本的bonding驅動需要新的ifenslave程式。來自extreme-linux和beowulf的原始工具程式不能在這裡使用。核心 2.2.18及其以上版本在Documentation/network中包含檔案ifenslave.c。對於更老的核心,請參考文章最後的資源鏈結部分的內容。
安裝ifenslave.c:
# gcc -O2 -s -o ifenslave ifenslave.c# cp ifenslave /sbin/ifenslave
3) 配置系統
參考下一部分關於模組引數的內容。首先需要在/etc/conf.modules中新增如下內容:
alias bond0 bonding
使用標準的釋出技術來定義bond0這個網路介面,例如在redhat釋出中,在/etc/sysconfig/network-scripts目錄中新增ifcfg-bond0檔案:
DEVICE=bond0IPADDR=192.168.1.1NETMASK=255.255.255.0NETWORK=192.168.1.0BROADCAST=192.168.1.255ONBOOT=yesBOOTPROTO=noneUSERCTL=no
所有屬於bond的介面動必須被定義為SLAVE或MASTER。例如,在Redhat中,如果希望定義eth0和eth1定義為屬於介面bond0的一部分,那麼它們的配置檔案(ifcfg-eth0, ifcfg-eth1,等)間如下所示:
DEVICE=eth0USERCTL=noONBOOT=yesMASTER=bond0SLAVE=yesBOOTPROTO=none

如果管理工具支援可以重新啟動網路子系統或者僅僅啟動bonding裝置,否則重新啟動機器。(對於redhat釋出,使用`ifup bond0'或`/etc/rc.d/init.d/network restart')
如果你的釋出提供的管理工具不支援在網路介面配置中定義master/slave,則需要使用下面的命令手工配置bonding裝置:
# /sbin/ifconfig bond0 192.168.1.1 up# /sbin/ifenslave bond0 eth0# /sbin/ifenslave bond0 eth1
當然也可以將這些命令定義為一個指令碼,以方便執行。
4) 模組引數
下面的模組引數可能被傳遞:
mode=
可能的值為0(預設的輪轉模式round robin policy),或者1(熱備份模式),參考下面的HA部分來得到更多的相關資訊。
miimon=
整數值,定義MII鏈路監測頻率(單位為頻率)。預設值為0,表示關閉鏈路監測。如果希望使用鏈路監測,一個合適的值為100。參考HA部分得到更多資訊。
downdelay=
在發現鏈路故障時,這裡規定的整數值定義disable一個鏈路的延遲(單位為毫秒)。必須是miimon的整數倍。預設值為0。參考HA部分得到更多資訊。
updelay=
偵測到"link up"狀態時,這裡規定的整數值定義了enable一個鏈路的延遲。必須是miimon的整數倍。預設值為0。參考HA部分得到更多資訊。
如果需要定義多個bonding裝置,驅動必須被多次載入。例如,對於有兩個bonding裝置的情況,/etc/conf.modlues必須包含如下內容:
alias bond0 bondingalias bond1 bonding
options bond0 miimon=100options bond1 -o bonding1 miimon=100
5) 測試配置
可以透過ifconfig命令來監測配置和傳輸策略,例如對於輪轉策略,你應該得到如下資訊:
[root]# /sbin/ifconfigbond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0collisions:0 txqueuelen:0
eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0collisions:0 txqueuelen:100 Interrupt:10 Base address:0x1080
eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:100 Interrupt:9 Base address:0x1400
問題:
1. bonding會不會和SMP衝突?
不會,老的2.0.xx版本配合SMP使用會發生衝突,而新的核心不會發生問題。
2. 哪種型別的網路卡可以用作bonding?
任何型別的網路卡(甚至可以使用混合型別的網路卡-一個Intel的therExpress PRO/100和a 3com 3c905b),甚至可以將兩個Gigabit乙太網卡bond在一起使用。
3. 我可以擁有多少個bonding裝置?
對應於載入的一個模組,就可以擁有一個bonding裝置,參考模組引數部分來了解如何實現。
4. 一個bonding裝置可以有多少個salve網路卡?
受限於linux可以支援的網路卡數量和系統可以插接的網路卡數量。
5. 當一個slave鏈路出現故障,會發生什麼問題?
如果你的乙太網卡支援MII狀態監控,並且MII監測已經在驅動中被使用(參考模組引數部分內容),那麼就不會出現什麼不幸的結果。這個版本的 bonding驅動能得到MII資訊並且根據鏈路狀態來enable或者disable某個slave網路卡。參考HA部分得到更多資訊。
所有不能報告自己的鏈路狀態的以太驅動不能很好地處理這種情況。bonding驅動不能連續傳送資料包,而導致某些資料包丟失。而重傳可能會引起嚴重的效能問題(如果一塊網路卡丟失,那麼可能會對TCP或UDP帶來嚴重的效能影響)。
6. bonding能被用作高可用性專案麼?
當然可以,如果使用了MII監測,並且你所有的網路卡驅動都支援MII鏈路狀態彙報。參考HA部分內容。
7. bonding能適用於哪種型別的switches/systems?
在輪轉模式,它和下面支援trunking的系統能一起工作:
* Cisco 5500 series (參考EtherChannel支援相關內容)。 * SunTrunking software.* Alteon AceDirector switches / WebOS (使用Trunks). * BayStack Switches (trunks必須被配置). 可堆疊的模組(450)能在不同的物理單元的埠中定義 * Linux bonding.
對於熱備份模式下,它能和一切二層交換機工作。
8. 一個bonding裝置的MAC來自於哪個網路卡?
如果沒有明顯使用ifconfig來配置指定,bonding裝置的MAC地址從它的第一個slave中得到。這個MAC地址隨即被傳遞個所有其他的 slave裝置,這些其他的slave裝置將具有這個MAC,即使第一個Slave裝置被去除。只有bonding裝置重起或者down了,MAC地址才會改變。
如果希望修改MAC地址,可以使用ifconfig來設定:
# ifconfig bond0 ha ether 00:11:22:33:44:55
可以透過up/down裝置,然後修改其slave的順序來改變bonding裝置的MAC地址:
# ifconfig bond0 down ; modprobe -r bonding# ifconfig bond0 .... up# ifenslave bond0 eth...
這個方法將自動從下一個將被新增的slave中得到地址。
為了恢復slave的MAC地址,需要將其從bonding裝置中分離出來(`ifenslave -d bond0 eth0'),down掉該裝置 (`ifconfig eth0 down'),去除模組(`rmmod 3c59x'),然後過載其以使其從其eeproms中得到其MAC地址。若一個驅動被多個裝置所擁有,那麼需要將其全部down掉。另外一種方法是察看啟動時該卡的MAC地址(dmesg或 tail /var/log/messages),並使用ifconfig來reset它:
# ifconfig eth0 down# ifconfig eth0 hw ether 00:20:40:60:80:A0
9. 哪些使用哪些傳輸模式?
輪轉模式:基於slave的順序,依次輪轉透過不同網路卡傳送資料;
熱備份模式:確保在同一時刻僅僅透過一個網路卡傳送資料,另外一個作為該啟用卡的熱備份,在啟用卡出現故障時資料流馬上切換到熱備份卡,這種模式常常用於使用交換機的高可用性中(high availability solutions
高可用性
為了使用bonding驅動實現高可用性,需要將該驅動編譯為模組,因為目前這時傳遞引數給驅動的唯一方式。以後這種情況可能會改變。首先需要確保所有的網路卡支援MII鏈路狀態報告。在Linux2.2.17及以上版本中,所有的百兆乙太網和yellowfin千兆乙太網都支援MII鏈路狀態報告。如果你的網路卡驅動不支援這種技術,那麼會將鏈路狀態監測為有故障。
bonding驅動目前透過監測MII狀態註冊器來偵測其所有的slave鏈路。偵測間隔有模組引數"miimon"來定義。該值為整數值,單位為milliseconds。100ms是一個合適的值,因為太小的值可能影響系統效能。也就是說鏈路發生故障以後在100ms秒以內將會被發現。
例如:
# modprobe bonding miimon=100
或在/etc/modules.conf定義如下內容:
alias bond0 bondingoptions bond0 miimon=100
目前對高可用性有兩個策略,依賴於主機是否
a) 主機連線到單臺主機或支援trunking的交換機b) 主機連線到多個不同的交換機上,或單個不支援trunking的交換機
1) 在單交換機或主機上的HA-負載均衡
這種模式易於配置和理解,只需要簡單的配置遠端裝置(主機或交換機)來將資料流量分散在多個埠(trunk, etherchannel等),並配置 bonding介面。如果模組載入時指定了MII引數,MII將自動工作。可以透過去除或恢復不同的鏈路,然後再log檔案中察看驅動裝置監測到了哪些資訊。在監測時,你也許會遇到這樣的問題:如果trunk連線的所有介面都down掉以後,有些具有bug的交換機會長時間地diable trunk。可以透過重新啟動交換機來修正這些問題。
例1:主機和主機間實現倍速:
在每個主機中,執行:
# modprobe bonding miimon=100# ifconfig bond0 addr# ifenslave bond0 eth0 eth1
例 2:主機連線交換機以實現倍速:
在主機A中執行:
# modprobe bonding miimon=100# ifconfig bond0 addr # ifenslave bond0 eth0 eth1
在交換機中:
#對port1和port2設定trunking。
2) 在多個交換機或主機上的HA-負載均衡(或不支援trunking技術的單交換機情況)
這種模式更可能會出現問題,因為它依賴於這樣的事實:雖然有多個埠,但是主機MAC地址只能被一個埠可見以避免混淆交換機。
如果需要知道哪個哪個埠是活動的,哪個是備份的,那就使用ifconfig。所有的備份介面設定有NOAEP標誌。為了使用該模式,在載入時傳遞"mode=1"給模組:
# modprobe bonding miimon=100 mode=1
或者在/etc/modules.conf中新增如下內容:
alias bond0 bondingoptions bond0 miimon=100 mode=1
例1:使用多個主機和多個交換機來建立"無單故障點瓶頸"解決方案:
在這種配置下,這裡有一個ISL- 交換機間連線(Inter Switch Link,可能是一個trunk),多個主機(host1, host2 ...)都同時連線到交換機,並且多個埠連線到外部網路(port3...),每個主機中同時只有一個slave是啟用的,但是所有的鏈路仍然被監測(系統能監測到活動鏈路的故障並啟動備份鏈路)。
如果host1和host2具有同樣的功能,並且被用在負載均衡中,那麼將 host1的活動介面連線到其中一個交換機而host2連線到另外一個交換機上是一個非常不錯的選擇。這種系統在單個主機、交換機或者線路出問題時仍能保證工作。最糟糕可能情況是,單個交換機出現故障,其中一臺主機將不可訪問,直到另外一個交換機維護的轉發表過期,另外一個主機才會轉換啟用介面到正常的交換機上。
例 2:使用多個乙太網卡連線到一個交換機,以應付NIC故障的情況,以提高可用性:
在主機A中:
# modprobe bonding miimon=100 mode=1 # ifconfig bond0 addr# ifenslave bond0 eth0 eth1
在交換機中:
# (可選地)最小化轉發表過期時間
每次主機切換其活動介面,它將使用新的介面直到該介面出現故障。在這個例子中,主機受交換機轉發表的過期時間影響很大。
3) 調整交換機的頻率
如果交換機轉換到備份介面需要花費太長的時間,一般來說都希望在當前介面發生故障的情況下立即啟用備用介面。可以透過傳遞模組引數"downdelay"來實現減少完全disable一個介面的延遲。
當一個交換機重啟以後,可能出現其埠在埠可用以前報告"link up"狀態。這可能使得bonding裝置使用還不可用的埠這可能透過傳遞模組引數"updelay"來延遲活動埠被重新可用的時間。
當一個主機和交換機重新互動以確定一個丟失的鏈路也會出現同樣的問題。
在bonding介面丟失了其所有的slave鏈路的情情況下,則驅動將馬上使用第一個up的介面,而不受updelay引數的限制。這樣可以減少系統down的時間。
例如:
# modprobe bonding miimon=100 mode=1 downdelay=2000 updelay=5000# modprobe bonding miimon=100 mode=0 downdelay=0 updelay=5000
4) 限制
主要限制是:
只有鏈路狀態被監控,如果交換機本身down掉了,例如不再轉發資料但是鏈路仍然完好。則鏈路不會被diable。另外一個監測故障鏈路的方式統計一個沉重負載主機的接入資料幀數量。但是對於哪些負載較小的伺服器則不大適用。
資源鏈結
Donald Becker的以太驅動和diag程式可以在下面的到:
- - (seems to be dead now)- (seems to be dead now)
還可以在得到很多關於ethernet、NWay和MII等資訊。Y
對於新版本的驅動,牢的核心補丁和更新的使用者空間工具可以在Willy Tarreau的網站中得到:
- -
為了得到最新的關於Linux Kernel開發資訊,請關注:

Linux2.4.x核心bonding的實現
因為bonding在核心2.4.x中已經包含了,只需要在編譯的時候把網路裝置選項中的Bonding driver support選中就可以了。然後,重新編譯核心,重新起動計算機,執行如下命令:
insmod bondingifconfig eth0 downifconfig eth1 downifconfig bond0 ipaddressifenslave bond0 eth0ifenslave bond0 eth1
現在兩塊網路卡已經象一塊一樣工作了.這樣可以提高叢集節點間的資料傳輸。你最好把這幾句寫成一個指令碼,再由/etc/rc.d/rc.local呼叫,以便一開機就生效。
bonding對於伺服器來是個比較好的選擇,在沒有千兆網路卡時,用兩三塊100兆網路卡作bonding,可大大提高伺服器到交換機之間的頻寬.但是需要在交換機上設定連線bonding網路卡的兩個口子對映為同一個虛擬介面(trunking技術)。
下面是引自郵件列表的一個信,希望能對出現問題時有所幫助:
I have found a solution to another problem with the bonding driver. If you ifconfig down an enslaved eth device, the bonding driver is not notified and if there is an attempt to use the device then a crash results. I have added a one line fix to dev_close in net/core/dev.c /* if the device is a slave we should not touch it*/ if(dev-flags&IFF_SLAVE) return -EBUSY; I put it after the check to see if the interface is up. This may not be the best solution but it prevents the kernel crashes and as bond_release is not implemented there is not much point making the device release it`s self. Since I made this change and the one in my last message I have not been able to produce a crash. (here is a script which will cause the crash on 2.2.16) #!/bin/bash insmod eepro100 insmod bonding ifconfig bond0 192.168.1.2 up ifenslave bond0 eth0 ifconfig eth0 down ifconfig bond0 down ifconfig bond0 192.168.1.2 up ifconfig bond0 down Again, if someone could confirm this fix it would be good. '
bonding在核心2.4.x中已經包含了,只需要在編譯的時候把網路裝置選項中的Bonding driver support選中就可以了。
  然後,重新編譯核心,重新起動計算機,執行如下命令:
  ismod bonding
  ifconfig eth0 down
  ifconfig eth1 down
  ifconfig bond0 ipaddress
  ifenslave bond0 eth0
  ifenslave bond0 eth1
  現在兩塊網路卡已經象一塊一樣工作了.這樣可以提高叢集節點間的資料傳輸.
  你最好把這幾句寫成一個指令碼,再由/etc/rc.d/rc.local呼叫,以便一開機就生效.
  bonding對於伺服器來是個比較好的選擇,在沒有千兆網路卡時,用兩三塊100兆網路卡作bonding,可大大提高伺服器到交換機之間的頻寬.但是需要在交換機上設定連線bonding網路卡的兩個口子對映為同一個虛擬介面。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245797/,如需轉載,請註明出處,否則將追究法律責任。

相關文章