???? 保持服務器的高可用性是企業級?IT?環境的重要因素。其中最重要的一點是服務器網絡連接的高可用性。網卡(NIC)綁定技術有助于保證高可用性特性并提供其它優勢以提高網絡性能。
??????我們在這介紹的Linux雙網卡綁定實現就是使用兩塊網卡虛擬成為一塊網卡,這個聚合起來的設備看起來是一個單獨的以太網接口設備, 通俗點講就是兩塊網卡具有相同的IP地址而并行鏈接聚合成一個邏輯鏈路工作。其實這項技術在Sun和Cisco中早已存在,被稱為Trunking和 Etherchannel技術,在Linux的2.4.x的內核中也采用這這種技術,被稱為bonding。bonding技術的最早應用是在集群—— beowulf上,為了提高集群節點間的數據傳輸而設計的。下面我們討論一下bonding?的原理,什么是bonding需要從網卡的混雜 (promisc)模式說起。我們知道,在正常情況下,網卡只接收目的硬件地址(MAC?Address)是自身Mac的以太網幀,對于別的數據幀都濾 掉,以減輕驅動程序的負擔。但是網卡也支持另外一種被稱為混雜promisc的模式,可以接收網絡上所有的幀,比如說tcpdump,就是運行在這個模式 下。bonding也運行在這個模式下,而且修改了驅動程序中的mac地址,將兩塊網卡的Mac地址改成相同,可以接收特定mac的數據幀。然后把相應的 數據幀傳送給bond驅動程序處理。?
????說了半天理論,其實配置很簡單,一共四個步驟:
實驗的操作系統是Redhat?Linux?Enterprise?3.0
綁定的前提條件:芯片組型號相同,而且網卡應該具備自己獨立的BIOS芯片
雙網卡邦定的拓樸圖(見下圖)
1.編輯虛擬網絡接口配置文件,指定網卡IP?
vi?/etc/sysconfig/?network-scripts/?ifcfg-bond0?
[root@rhas-13?root]#?cp??/etc/sysconfig/network-scripts/ifcfg-eth0?ifcfg-bond0
2?#vi?ifcfg-bond0?
將第一行改成?DEVICE=bond0?
#?cat?ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=172.31.0.13
NETMASK=255.255.252.0
BROADCAST=172.31.3.254
ONBOOT=yes
TYPE=Ethernet
這里要主意,不要指定單個網卡的IP?地址、子網掩碼或網卡?ID。將上述信息指定到虛擬適配器(bonding)中即可。
[root@rhas-13?network-scripts]#?cat?ifcfg-eth0?
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
[root@rhas-13?network-scripts]#?cat?ifcfg-eth1?
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
3?#?vi?/etc/modules.conf?
編輯?/etc/modules.conf?文件,加入如下一行內容,以使系統在啟動時加載bonding模塊,對外虛擬網絡接口設備為?bond0?
加入下列兩行?
alias?bond0?bonding?
options?bond0?miimon=100?mode=1?
說明: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?
route?add?-net?172.31.3.254?netmask?255.255.255.0?bond0?
到這時已經配置完畢重新啟動機器.
重啟會看見以下信息就表示配置成功了
................?
Bringing?up?interface?bond0?OK?
Bringing?up?interface?eth0?OK?
Bringing?up?interface?eth1?OK?
................
下面我們討論以下mode分別為0,1時的情況
mode=1工作在主備模式下,這時eth1作為備份網卡是no?arp的
[root@rhas-13?network-scripts]#?ifconfig??驗證網卡的配置信息
bond0?????Link?encap:Ethernet??HWaddr?00:0E:7F:25:D9:8B
??????????inet?addr:172.31.0.13??Bcast:172.31.3.255??Mask:255.255.252.0
??????????UP?BROADCAST?RUNNING?MASTER?MULTICAST??MTU:1500??Metric:1
??????????RX?packets:18495?errors:0?dropped:0?overruns:0?frame:0
??????????TX?packets:480?errors:0?dropped:0?overruns:0?carrier:0
??????????collisions:0?txqueuelen:0
??????????RX?bytes:1587253?(1.5?Mb)??TX?bytes:89642?(87.5?Kb)
?
eth0??????Link?encap:Ethernet??HWaddr?00:0E:7F:25:D9:8B
??????????inet?addr:172.31.0.13??Bcast:172.31.3.255??Mask:255.255.252.0
??????????UP?BROADCAST?RUNNING?SLAVE?MULTICAST??MTU:1500??Metric:1
??????????RX?packets:9572?errors:0?dropped:0?overruns:0?frame:0
??????????TX?packets:480?errors:0?dropped:0?overruns:0?carrier:0
??????????collisions:0?txqueuelen:1000
??????????RX?bytes:833514?(813.9?Kb)??TX?bytes:89642?(87.5?Kb)
??????????Interrupt:11
?
eth1??????Link?encap:Ethernet??HWaddr?00:0E:7F:25:D9:8B
??????????inet?addr:172.31.0.13??Bcast:172.31.3.255??Mask:255.255.252.0
??????????UP?BROADCAST?RUNNING?NOARP?SLAVE?MULTICAST??MTU:1500??Metric:1
??????????RX?packets:8923?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:753739?(736.0?Kb)??TX?bytes:0?(0.0?b)
??????????Interrupt:15
????那也就是說在主備模式下,當一個網絡接口失效時(例如主交換機掉電等),不回出現網絡中斷,系統會按照cat?/etc/rc.d/rc.local里指定網卡的順序工作,機器仍能對外服務,起到了失效保護的功能.
在mode=0????負載均衡工作模式,他能提供兩倍的帶寬,下我們來看一下網卡的配置信息
[root@rhas-13?root]#?ifconfig
bond0?????Link?encap:Ethernet??HWaddr?00:0E:7F:25:D9:8B
??????????inet?addr:172.31.0.13??Bcast:172.31.3.255??Mask:255.255.252.0
??????????UP?BROADCAST?RUNNING?MASTER?MULTICAST??MTU:1500??Metric:1
??????????RX?packets:2817?errors:0?dropped:0?overruns:0?frame:0
??????????TX?packets:95?errors:0?dropped:0?overruns:0?carrier:0
??????????collisions:0?txqueuelen:0
??????????RX?bytes:226957?(221.6?Kb)??TX?bytes:15266?(14.9?Kb)
?
eth0??????Link?encap:Ethernet??HWaddr?00:0E:7F:25:D9:8B
??????????inet?addr:172.31.0.13??Bcast:172.31.3.255??Mask:255.255.252.0
??????????UP?BROADCAST?RUNNING?SLAVE?MULTICAST??MTU:1500??Metric:1
??????????RX?packets:1406?errors:0?dropped:0?overruns:0?frame:0
??????????TX?packets:48?errors:0?dropped:0?overruns:0?carrier:0
??????????collisions:0?txqueuelen:1000
??????????RX?bytes:113967?(111.2?Kb)??TX?bytes:7268?(7.0?Kb)
??????????Interrupt:11
?
eth1??????Link?encap:Ethernet??HWaddr?00:0E:7F:25:D9:8B
??????????inet?addr:172.31.0.13??Bcast:172.31.3.255??Mask:255.255.252.0
??????????UP?BROADCAST?RUNNING?SLAVE?MULTICAST??MTU:1500??Metric:1
??????????RX?packets:1411?errors:0?dropped:0?overruns:0?frame:0
??????????TX?packets:47?errors:0?dropped:0?overruns:0?carrier:0
??????????collisions:0?txqueuelen:1000
??????????RX?bytes:112990?(110.3?Kb)??TX?bytes:7998?(7.8?Kb)
??????????Interrupt:15
??????在這種情況下出現一塊網卡失效,僅僅會是服務器出口帶寬下降,也不會影響網絡使用.
??????通過查看bond0的工作狀態查詢能詳細的掌握bonding的工作狀態
[root@rhas-13?bonding]#?cat?/proc/net/bonding/bond0
bonding.c:v2.4.1?(September?15,?2003)
?
Bonding?Mode:?load?balancing?(round-robin)
MII?Status:?up
MII?Polling?Interval?(ms):?0
Up?Delay?(ms):?0
Down?Delay?(ms):?0
Multicast?Mode:?all?slaves
?
Slave?Interface:?eth1
MII?Status:?up
Link?Failure?Count:?0
Permanent?HW?addr:?00:0e:7f:25:d9:8a
?
Slave?Interface:?eth0
MII?Status:?up
Link?Failure?Count:?0
Permanent?HW?addr:?00:0e:7f:25:d9:8b
?????Linux下通過網卡邦定技術既增加了服務器的可靠性,又增加了可用網絡帶寬,為用戶提供不間斷的關鍵服務。用以上方法均在redhat的多個版本測試成功,而且效果良好.心動不如行動,趕快一試吧!?
參考文檔:
/usr/share/doc/kernel-doc-2.4.21/networking/bonding.txt
?
[求助]請教雙網卡問題?。?!
作者:段譽?????發表時間:2003/01/11?08:14pm
如何在一臺裝有Linux的機器下做雙網卡綁定一個IP地址??
請大家指教,多謝!?。?:em14:??:em14:??:em14:
此文章相關評論:
該文章有26個相關評論如下:(點這兒可以發表評論)
無雙? 發表于:?2003/01/11?08:16pm
不可能
?
無雙? 發表于:?2003/01/11?08:17pm
可以一個網卡綁定多個地址
但不可以多網卡綁定一個地址
?
段譽? 發表于:?2003/01/11?09:14pm
一個網卡綁定多個IP我知道,我現在就想問問,為什么不能兩個網卡綁定一個?有明確的說明嗎?
為什么SUN/IBM的機器就可以在增加軟件的情況下,雙網卡綁定一個IP?我想,Linux應該也可以做到的吧,只不過我不知道而已,:(。
?
無雙? 發表于:?2003/01/11?09:18pm
因為arp協議原因
?
段譽? 發表于:?2003/01/11?09:19pm
[這個貼子最后由段譽在?2003/01/11?09:20pm?編輯]
說說為什么,可以嗎?多謝!
?
無雙? 發表于:?2003/01/11?09:23pm
看一看ARP協議
TCP/IP在低層要把IP轉換成硬件地址
然后才可以在網絡上傳輸
如果一個IP對應多個硬件地址
那么沒有辦法轉換
SUN的話是用改配置文件的方法實現的
?
diag? 發表于:?2003/01/11?10:59pm
BSD?可以。。。TRUK?。。
?
無雙? 發表于:?2003/01/11?11:06pm
可以嗎
但是雙網卡同IP的話兩個網卡不可能同時使用
?
diag? 發表于:?2003/01/11?11:36pm
應該可以。。我幫看看。。我們的那個NAS?。。就是用FREEBSD?做的。。
兩個網卡做的/
?
無雙? 發表于:?2003/01/11?11:39pm
那把做的方法寫一下吧
大家學學
?
段譽? 發表于:?2003/01/12?00:57am
好啊,多謝diag,把這個寫寫,:)
?
xunle回來啦? 發表于:?2003/01/12?01:00am
可以的,我看過相關文章,不過因為沒用到,所以沒在意,我也找不到那文章了
?
okaxikiss? 發表于:?2003/01/12?07:50am
引用:
下面引用由[u]diag[/u]在?
2003/01/11?11:36pm
?發表的內容:
應該可以。。我幫看看。。我們的那個NAS?。。就是用FREEBSD?做的。。
兩個網卡做的/
寫出來大家學習學習嘛
?
ttyp0? 發表于:?2003/01/12?10:09am
聽說Intel服務器網卡兩個口同一個ip連到Cisco35XX交換機全雙工可以達到400M
?
depike? 發表于:?2003/01/12?03:43pm
沒錯,intel的網卡可以實現雙網卡綁定一個IP地址,但也是有要求的,具體的在Intel的站點上應該有,但我今天沒找到
http://www.gx-wp.com/ycwz/internetadapter.htm
?
clic? 發表于:?2003/01/12?04:06pm
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網卡的兩個口子映射為同一個虛擬接口。
?
depike? 發表于:?2003/01/12?04:15pm
多謝clic,有機會一定一試
?
無雙? 發表于:?2003/01/12?05:05pm
不錯建議精華
而寫到一句話中
?
race? 發表于:?2003/01/12?07:26pm
我以前關心過這個事情,當時因為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程序可以在下面的到:
-?http://www.scyld.com/network/-?http://cesdis.gsfc.nasa.gov/linux/drivers/?(seems?to?be?dead?now)-?ftp://cesdis.gsfc.nasa.goc/pub/linux/drivers/?(seems?to?be?dead?now)
還可以在www.scyld.com得到很多關于ethernet、NWay和MII等信息。Y
對于新版本的驅動,牢的內核補丁和更新的用戶空間工具可以在Willy?Tarreau的網站中得到:
-?http://wtarreau.free.fr/pub/bonding/-?http://www-miaif.lip6.fr/willy/pub/bonding/
為了得到最新的關于Linux?Kernel開發信息,請關注:
http://boudicca.tux.org/hypermail/linux-kernel/latest/
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.?'
文章來源:LinuxAid
?
補充樓主的原創:
????補充理由:我在按照樓主配置方法,實現了mode=1在一個交換機上的實現,但是無法實現在VLAN模式下BOND的工作。后通過交流,最后這個方法能實現創建多個bond的虛設備并來滿足不同VLAN的設置。
????由于保證網絡架構的靈活性的要求,每個機器都支持VLAN的802。1Q協議,通過簡單配置就可以跨VLAN通信。由于VLAN的配置在 服務器中通過虛設備實現,所以在rc.local中通過ifenslave?bond0?eth0?eth1?激活的方式不可行。
????具體配置:
1.編輯虛擬網絡接口配置文件,指定網卡IP?
cp?/etc/sysconfig/network-scripts/ifcfg-eth0?/etc/sysconfig/network-scripts/ifcfg-bond0.2(VLAN2)
修改ifcfg-eth0為
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
eth1同上述配置,只需要修改DEVICE=eth0為DEVICE=eth1
ifcfg-bond0的配置
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
修改ifcfg-bond0.2
也只需要修改DEVICE=eth0為DEVICE=bond0.2,其他配置采用本來的eth0的配置就可以。
如果有其他VLAN,可以再加。
2、?#?vi?/etc/modules.conf?
編輯?/etc/modules.conf?文件,加入如下一行內容,以使系統在啟動時加載bonding模塊,對外虛擬網絡接口設備為?bond0?
?
加入下列兩行?
alias?bond0?bonding?
options?bond0?miimon=100?mode=1?
說明見樓主的說明
3、添加VLAN=yes到/etc/sysconfig/network中
4、最關鍵一步,修改/sbin/ifup
找到#?Ethernet?802.1Q?VLAN?support這一行
修改下面的幾行:
if?echo?${DEVICE}?|?LANG=C?egrep?-v?'(:)'?|?LANG=C?egrep?-q?'eth[0-9][0-9]*\.[0-9][0-9]?[0-9]?[0-9]?'?;?then
修改為
if?echo?${DEVICE}?|?LANG=C?egrep?-v?'(:)'?|?LANG=C?egrep?-q?'(eth|bond)[0-9][0-9]*\.[0-9][0-9]?[0-9]?[0-9]?'?;?then
VID="`echo?${DEVICE}?|?\
????????????LANG=C?egrep?'eth[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$'?|?\
????????????修改為
VID="`echo?${DEVICE}?|?\
????????????LANG=C?egrep?'(eth|bond)[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$'?|?\
????????????
????????PHYSDEV="`echo?${DEVICE}?|?\
????????????LANG=C?egrep?'eth[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$'?|?\
修改為
????????PHYSDEV="`echo?${DEVICE}?|?\
????????????LANG=C?egrep?'(eth|bond)[0-9]+\.[0-9][0-9]?[0-9]?[0-9]?$'?|?\
????????????
這樣就大功告成了,重新啟動或者services?network?restart以后,注意看messages是否成功,或者看ifconfig?-a
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
