linux-bonding——


linux多網卡綁定聚合-Bond詳細完整版

Linux Bonding

 

一、什么是bonding

Linux bonding 驅動提供了一個把多個網絡接口設備捆綁為單個的網絡接口設置來使用,用於網絡負載均衡及網絡冗余


二、bonding應用方向

1、網絡負載均衡

對 於bonding的網絡負載均衡是我們在文件服務器中常用到的,比如把三塊網卡,當做一塊來用,解決一個IP地址,流量過大,服務器網絡壓力過大的問題。 對於文件服務器來說,比如NFS或SAMBA文件服務器,沒有任何一個管理員會把內部網的文件服務器的IP地址弄很多個來解決網絡負載的問題。如果在內網 中,文件服務器為了管理和應用上的方便,大多是用同一個IP地址。對於一個百M的本地網絡來說,文件服務器在多 個用戶同時使用的情況下,網絡壓力是極大的,特別是SAMABA和NFS服務器。為了解決同一個IP地址,突破流量的限制,畢竟網線和網卡對數據的吞吐量 是有限制的。如果在有限的資源的情況下,實現網絡負載均衡,最好的辦法就是 bonding 

2、網絡冗余

對於服務器來說,網絡設備的穩定也是比較重要的,特別是網卡。在生產型的系統中,網卡的可靠性就更為重要了。在生產型的系統中,大多通過硬件設備的冗余來提供服務器的可靠性和安全性,比如電源。bonding 也能為網卡提供冗余的支持。把多塊網卡綁定到一個IP地址,當一塊網卡發生物理性損壞的情況下,另一塊網卡自動啟用,並提供正常的服務,即:默認情況下只有一塊網卡工作,其它網卡做備份


三、bonding實驗環境及配置

1、實驗環境

系統為:CentOS,使用4塊網卡(eth0、eth1  ==>  bond0;eth2、eth3 ==> bond1)來實現bonding技術

2、bonding配置

第一步:先查看一下內核是否已經支持bonding

1)如果內核已經把bonding編譯進內核,那么要做的就是加載該模塊到當前內核;其次查看ifenslave該工具是否也已經編譯
modprobe  -l   bond*  或者 modinfo   bonding
modprobe   bonding
lsmod | grep 'bonding'
echo  'modprobe bonding &> /dev/null'  >>  /etc/rc.local(開機自動加載bonding模塊到內核)
which  ifenslave
注意:默認內核安裝完后就已經支持bonding模塊了,無需要自己手動編譯

2)如果bonding還沒有編譯進內核,那么要做的就是編譯該模塊到內核
(1)編譯bonding
tar -jxvf  kernel-XXX.tar.gz
cd  kernel-XXX
make  menuconfig
選擇 " Network device support "  ->  " Bonding driver support "
make bzImage
make modules  &&  make modules_install
make install
(2)編譯ifenslave工具
gcc -Wall -O -I   kernel-XXX/include ifenslave.c -o ifenslave

第二步:主要有兩種可選擇(第1種:實現網絡負載均衡,第2種:實現網絡冗余)

例1:實現網絡冗余(即:mod=1方式,使用eth0與eth1)

(1)編輯虛擬網絡接口配置文件(bond0),並指定網卡IP
vi   /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.254
BROADCAST=192.168.0.255
NETMASK=255.255.255.0
NETWORK=192.168.0.0
GATEWAY=192.168.0.1
USERCTL=no
TYPE=Ethernet
注意:建議不要指定MAC地址

vi   /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
注意:建議不要指定MAC地址

vi   /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
注意:建議不要指定MAC地址

(2)編輯模塊載入配置文件(/etc/modprobe.conf),開機自動加載bonding模塊到內核
vi   /etc/modprobe.conf

alias  bond0  bonding  
options  bond0  miimon=100  mode=1

alias  net-pf-10  off   #關閉ipv6支持
說明:miimon是用來進行鏈路監測的。 比如:miimon=100,那么系統每100ms監測一次鏈路連接狀態,如果有一條線路不通就轉入另一條線路;mode的值表示工作模式,他共有0,1,2,3,4,5,6六種模式,常用為0,6,1三種,具體后面會介紹 
mode=0,表示load balancing (round-robin)為負載均衡方式,兩塊網卡都工作,但是與網卡相連的交換必須做特殊配置( 這兩個端口應該采取聚合方式),因為做bonding的這兩塊網卡是使用同一個MAC地址
mode=6,表示load balancing (round-robin)為負載均衡方式,兩塊網卡都工作,但是該模式下無需配置交換機,因為做bonding的這兩塊網卡是使用不同的MAC地址
mode=1,表示fault-tolerance (active-backup)提供冗余功能,工作方式是主備的工作方式,也就是說默認情況下只有一塊網卡工作,另一塊做備份 
注意:bonding只能提供鏈路監測,即從主機到交換機的鏈路是否接通。如果只是交換機對外的鏈路down掉了,而交換機本身並沒有故障,那么bonding會認為鏈路沒有問題而繼續使用

(4)重啟並測試
第一:由於bonding使用的模式為mod=1(網絡冗余),所以eth0、eth1與虛擬的bond0同一個MAC地址


注意:對比上面這兩個圖,可知mode=1模式下,eth0與eth1這兩塊網卡,只有一塊網卡在工作(即:eth0),因為eth1網卡的RX與TX都沒有在發生變化

第二:測試,用ping指令ping虛擬網卡設備bond0的IP地址(192.168.0.254),然后禁用eth0設備看一下能夠繼續ping的通

說明:如上圖可得到,斷開eth0(上圖的右下角),還是可以ping的通的


例2:實現網絡負載均衡和網絡冗余(即:mod=0方式,使用eth0與eth1)
注意:VM中只能做mode=1的實驗,其它的工作模式得用真機來實踐

跟例1的步驟一樣,只需要修改模塊載入配置文件(/etc/modprobe.conf),如下:

alias  bond0  bonding  
options  bond0  miimon=100  mode=0


(1)測試如下
##目前兩塊網卡都處於連接狀態
root@Web:~# ifconfig | grep 'eth' | awk '{print $1}'
eth0
eth1
##禁用了網卡eth0,用ping指令測試


反之,也是一樣的!

例3:實現網絡負載均衡和網絡冗余(即:mod=6方式,使用eth0與eth1,其中eth0設置為primay)

跟例1的步驟一樣,只需要修改模塊載入配置文件(/etc/modprobe.conf),如下:
alias  bond0  bonding  
options  bond0  miimon=100  mode=6


上圖可知:mode=6時,eth0與eth1所使用的MAC是不一樣的

(1)測試如下
##目前兩塊網卡都處於連接狀態
root@Web:~# ifconfig | grep 'eth' | awk '{print $1}'
eth0
eth1
##禁用了網卡eth0,用ping指令測試



四、bonding運用的注意事項

1、bonding的模式:0-6,即:7種模式

第一種模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡掄循環策略)
特點:傳輸數據包順序是依次傳輸(即:第1個包走eth0,下一個包就走eth1....一直循環下去,直到最后一個傳輸完畢), 此模式提供負載平衡和容錯能力;但是我們知道如果一個連接或者會話的數據包從不同的接口發出的話,中途再經過不同的鏈路,在客戶端很有可能會出現數據包無序到達的問題,而無序到達的數據包需要重新要求被發送,這樣網絡的吞吐量就會下降

第二種模式:mod=1,即: (active-backup) Active-backup policy(主-備份策略)
特點:只有一個設備處於活動狀態,當 一個宕掉另一個馬上由備份轉換為主設備。mac地址是外部可見得,從外面看來,bond的MAC地址是唯一的,以避免switch(交換機)發生混亂。此模式只提供了容錯能力;由此可見此算法的優點是可以提供高網絡連接的可用性,但是它的資源利用率較低,只有一個接口處於工作狀態,在有 N 個網絡接口的情況下,資源利用率為1/N

第三種模式:mod=2,即:(balance-xor) XOR policy(平衡策略)
特點:基於指定的傳輸HASH策略傳輸數據包。缺省的策略是:(源MAC地址 XOR 目標MAC地址) % slave數量。其他的傳輸策略可以通過xmit_hash_policy選項指定,此模式提供負載平衡和容錯能力

第四種模式:mod=3,即:broadcast(廣播策略)
特點:在每個slave接口上傳輸每個數據包,此模式提供了容錯能力

第五種模式:mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 動態鏈接聚合)
特點:創建一個聚合組,它們共享同樣的速率和雙工設定。根據802.3ad規范將多個slave工作在同一個激活的聚合體下。
外 出流量的slave選舉是基於傳輸hash策略,該策略可以通過xmit_hash_policy選項從缺省的XOR策略改變到其他策略。需要注意的是, 並不是所有的傳輸策略都是802.3ad適應的,尤其考慮到在802.3ad標准43.2.4章節提及的包亂序問題。不同的實現可能會有不同的適應性。
必要條件:
條件1:ethtool支持獲取每個slave的速率和雙工設定
條件2:switch(交換機)支持IEEE 802.3ad Dynamic link aggregation
條件3:大多數switch(交換機)需要經過特定配置才能支持802.3ad模式

第六種模式:mod=5,即:(balance-tlb) Adaptive transmit load balancing(適配器傳輸負載均衡)
特點:不需要任何特別的switch(交換機)支持的通道bonding。在每個slave上根據當前的負載(根據速度計算)分配外出流量。如果正在接受數據的slave出故障了,另一個slave接管失敗的slave的MAC地址。
該模式的必要條件:ethtool支持獲取每個slave的速率

第七種模式:mod=6,即:(balance-alb) Adaptive load balancing(適配器適應性負載均衡)
特點:該模式包含了balance-tlb模式,同時加上針對IPV4流量的接收負載均衡(receive load balance, rlb),而且不需要任何switch(交換機)的支持。接收負載均衡是通過ARP協商實現的。bonding驅動截獲本機發送的ARP應答,並把源硬件地址改寫為bond中某個slave的唯一硬件地址,從而使得不同的對端使用不同的硬件地址進行通信。
來 自服務器端的接收流量也會被均衡。當本機發送ARP請求時,bonding驅動把對端的IP信息從ARP包中復制並保存下來。當ARP應答從對端到達 時,bonding驅動把它的硬件地址提取出來,並發起一個ARP應答給bond中的某個slave。使用ARP協商進行負載均衡的一個問題是:每次廣播 ARP請求時都會使用bond的硬件地址,因此對端學習到這個硬件地址后,接收流量將會全部劉翔當前的slave。這個問題通過給所有的對端發送更新 (ARP應答)來解決,應答中包含他們獨一無二的硬件地址,從而導致流量重新分布。當新的slave加入到bond中時,或者某個未激活的slave重新 激活時,接收流量也要重新分布。接收的負載被順序地分布(round robin)在bond中最高速的slave上
當某個鏈路被重新接上,或者 一個新的slave加入到bond中,接收流量在所有當前激活的slave中全部重新分配,通過使用指定的MAC地址給每個 client發起ARP應答。下面介紹的updelay參數必須被設置為某個大於等於switch(交換機)轉發延時的值,從而保證發往對端的ARP應答 不會被switch(交換機)阻截。
必要條件:
條件1:ethtool支持獲取每個slave的速率;
條件2:底層驅動支持設置 某個設備的硬件地址,從而使得總是有個slave(curr_active_slave)使用bond的硬件地址,同時保證每個bond 中的slave都有一個唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址將會被新選出來的 curr_active_slave接管
其實mod=6與mod=0的區別:mod=6,先把eth0流量占滿,再占eth1,....ethX;而mod=0的話,會發現2個口的流量都很穩定,基本一樣的帶寬。而mod=6,會發現第一個口流量很高,第2個口只占了小部分流量


2、bonding驅動選項

Bonding驅動的選項是通過在加載時指定參數來設定的。可以通過insmod或modprobe命令的命令行參數來指定,但通常在/etc/modprobe.conf配置文件中指定,或其他的配置文件中

下 面列出可用的bonding驅動參數。如果參數沒有指定,驅動會使用缺省參數。剛開始配置bond的時候,建議在一個終端窗口中運行"tail -f /var/log/messages"來觀察bonding驅動的錯誤信息【譯注:/var/log/messages一般會打印內核中的調試信息】
有些參數必須要正確的設定,比如miimon、arp_interval和arp_ip_target,否則在鏈接故障時會導致嚴重的網絡性能退化。很少的設備不支持miimon,因此沒有任何理由不使用它們。
有些選項不僅支持文本值的設定,出於兼容性的考慮,也支持數值的設定,比如,"mode=802.3ad"和"mode=4"效果是一樣的

具體的參數列表:
1)primay
指 定哪個slave成為主設備(primary device),取值為字符串,如eth0,eth1等。只要指定的設備可用,它將一直是激活的slave。只有在主設備(primary device)斷線時才會切換設備。這在希望某個slave設備優先使用的情形下很有用,比如,某個slave設備有更高的吞吐率
注意:  primary選項只對active-backup模式有效

2)updelay
指定當發現一個鏈路恢復時,在激活該鏈路之前的等待時間,以毫秒計算。該選項只對miimon鏈路偵聽有效。updelay應該是miimon值的整數倍,如果不是,它將會被向下取整到最近的整數。缺省值為0

3)arp_interval
指 定ARP鏈路監控頻率,單位是毫秒(ms)。如果APR監控工作於以太兼容模式(模式0和模式2)下,需要把switch(交換機)配置為在所有鏈路上均 勻的分發網絡包。如果switch(交換機)被配置為以XOR方式分發網絡包,所有來自ARP目標的應答將會被同一個鏈路上的其他設備收到,這將會導致其 他設備的失敗。ARP監控不應該和miimon同時使用。設定為0將禁止ARP監控。缺省值為0

4)arp_ip_target
指 定一組IP地址用於ARP監控的目標,它只在arp_interval > 0時有效。這些IP地址是ARP請求發送的目標,用於判定到目標地址的鏈路是否工作正常。該設定值為ddd.ddd.ddd.ddd格式。多個IP地址通 過逗號分隔。至少指定一個IP地址。最多可以指定16個IP地址。缺省值是沒有IP地址

5)downdelay
指定一個時間,用於在發現鏈路故障后,等待一段時間然后禁止一個slave,單位是毫秒(ms)。該選項只對miimon監控有效。downdelay值應該是miimon值的整數倍,否則它將會被取整到最接近的整數倍。缺省值為0

6)lacp_rate
指定在802.3ad模式下,我們希望的鏈接對端傳輸LACPDU包的速率。可能的選項:
(1)slow 或者 0
請求對端每30s傳輸LACPDU
(2)fast 或者 1
請求對端每1s傳輸LACPDU
(3)缺省值是slow

7)max_bonds
為bonding驅動指定創建bonding設備的數量。比如:如果max_bonds為3,而且bonding驅動還沒有加載,那么bond0,bond1,bond2將會被創建。缺省值為1

6)miimon
指定MII鏈路監控頻率,單位是毫秒(ms)。這將決定驅動檢查每個slave鏈路狀態頻率
0表示禁止MII鏈路監控。100可以作為一個很好的初始參考值。下面的use_carrier選項將會影響如果檢測鏈路狀態。更多的信息可以參考“高可靠性”章節。缺省值為0

8)mode
指定bonding的策略。缺省是balance-rr (round robin,循環賽)。可選的mode包括:0,1,2,3,4,5,6

3、bonding鏈路監測方法

官方文檔里說有兩種針對鏈路的監測方法(注意:這兩種監測不能同時使用)

第一種:miimon(這種方法是最常見的,此方法使用系統的mii-tool命令進行監測)

模塊加載設置(/etc/modprobe.conf):
# Start of bonding configure
alias bond0 bonding
options  bond0 miimon=100 mode=1
注意:使用cat /proc/net/bonding/bond0,可查看Bonding Mode: load balancing (round-robin)狀態
options  bond0 miimon=100 mode=0
注意:使用cat /proc/net/bonding/bond0,可查看Bonding Mode: load balancing ((active-backup))狀態                        

root@Web:~# mii-tool
eth0: negotiated 100baseTx-HD, link ok
eth1: negotiated 100baseTx-HD, link ok

缺 點:這種方法,只能監測交換機與該網卡之間的鏈路;如果它們之外的鏈路的地方斷了,而交換機本身沒有問題,也就是說你的網卡和交換機之間還是UP狀態,它 是不會認為網絡中斷,除非你的網卡是DOWN狀態,它才會把鏈路轉到另一塊網卡上,就像是拔掉網線一樣,或者把交換機端口shutdown一樣

第二種:arp(這種方法比較實用,你可以把它看作是arp的ping(二層ping),但是可能會給網關造成一定的壓力)

模塊加載:
alias bond0 bonding
options  bond0  arp_interval=100  arp_ip_target=192.168.1.1  mode=active-backup   primary=eth0
解析如下:
arp_interval=100,表示arp的檢測時間,等同於miimon=100的作用
arp_ip_target=192.168.1.1,表示arp檢測的目標IP,必須是同網段的,最好就是網關
注意:如果使用arp來ping網關不通,那么在/proc/net/bonding/bond0里會一會down,一會up的

優點:使用arp這種方法,如果交換機的上出現問題,網絡不通,它就會把鏈轉到另一塊網卡上,但是不管是哪種方法,在第一塊網卡出現問題,鏈路轉到第二塊后,如果第一塊恢復正常,鏈路自己不會恢復的


五、bonding參考資料

1、linux系統中有一份原文幫助文件(很詳細):/usr/share/doc/iputils-20020927/README.bonding
2、http://www.itqun.net/content-detail/86623_2.html
3、redhat linux內核升級補丁下載
http://people.redhat.com/jwilson/el5---內核升級補丁(這里可以得到免費的升級包)
http://people.redhat.com/jwilson/el5/198.el5/i686/kernel-2.6.18-198.el5.i686.rpm
http://people.redhat.com/jwilson/el5/198.el5/i686/kernel-devel-2.6.18-198.el5.i686.rpm
http://people.redhat.com/jwilson/el5/198.el5/i686/kernel-2.6.18-i686.config
http://rhn.redhat.com/errata---內核補丁(注意:得使用Red Hat Network來下載這些update包)
http://rhn.redhat.com/errata/RHSA-2010-0178.html

 

【Linux】Linux雙網卡綁定實現

Linux雙網卡綁定實現就是使用兩塊網卡虛擬成為一塊網卡,這個聚合起來的設備看起來是一個單獨的以太網接口設備,通俗點講就是兩塊網卡具有相同的IP地址而並行鏈接聚合成一個邏輯鏈路工作。
   在正常情況下,網卡只接收目的硬件地址(MAC Address)是自身Mac的以太網幀,對於別的數據幀都濾掉,以減輕驅動程序的負擔。但是網卡也支持另外一種被稱為混雜promisc的模式,可以接收網絡上所有的幀,比如說tcpdump,就是運行在這個模式下。bonding也運行在這個模式下,而且修改了驅動程序中的mac地址,將兩塊網卡的Mac地址改成相同,可以接收特定mac的數據幀。然后把相應的數據幀傳送給bond驅動程序處理
測試環境版本:
CentOS release 5.3 (Final) X86_64
2.6.18-128.el5
具體的配置步驟如下:
1 新建/etc/sysconfig/network-scripts/ifcfg-bond0
[root@rac4 network-scripts]# cat ifcfg-bond0      
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=bond0
BOOTPROTO=static
IPADDR=10.250.7.220
NETMASK=255.255.255.0
BROADCAST=10.250.7.255
ONBOOT=yes
TYPE=Ethernet
GATEWAY=10.250.7.254
USERCTL=no
2 更改需要bond的網卡的屬性:
[root@rac4 network-scripts]# cat ifcfg-eth0       
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
[root@rac4 network-scripts]# cat ifcfg-eth1
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
3 編輯/etc/modprobe.conf文件,加入以下紅色標記的內容      
[root@rac4 network-scripts]# vi /etc/modprobe.conf
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptspi
alias scsi_hostadapter2 ata_piix
alias eth0 e1000
alias eth1 e1000
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)提供冗余功能,工作方式是主備的工作方式,也就是說默認情況下只有一塊網卡工作,另一塊做備份.
4 加入/etc/rc.d/rc.local啟動項 紅色標記內容 
[root@rac4 network-scripts]# vi /etc/rc.d/rc.local 
#!/bin/sh
# This script. will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style. init stuff.
touch /var/lock/subsys/local
ifenslave bond0 eth0 eth1
5 啟動bond0
[root@rac4 network-scripts]# ifconfig  bond0 10.250.7.220 up
當使用ifenslave 啟動的時候報出如下錯誤:啟動bond0的時候已經將eth0 eth1添加到/sys/class/net/bond0/bonding/slaves 里面了
[root@rac4 network-scripts]# ifenslave  bond0 eth0 eth1
Illegal operation: The specified slave interface 'eth0' is already a slave
Master 'bond0', Slave 'eth0': Error: Enslave failed
Illegal operation: The specified slave interface 'eth1' is already a slave
Master 'bond0', Slave 'eth1': Error: Enslave failed
[root@rac4 network-scripts]# ifenslave  bond0  eth1    
Illegal operation: The specified slave interface 'eth1' is already a slave
Master 'bond0', Slave 'eth1': Error: Enslave failed
最后重啟服務器:
[root@rac4 ~]# reboot
下面討論一下綁定網卡的特性:
當bonding 屬性 mode=1時,綁定網卡工作在主備模式下,這時eth1作為備份網卡是no arp的 
驗證網卡的配置信息:
[root@rac4 ~]# ifconfig                                
bond0     Link encap:Ethernet  HWaddr 00:50:56:8F:22:48  
          inet addr:10.250.7.220  Bcast:10.250.7.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe8f:2248/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:1109 errors:0 dropped:0 overruns:0 frame.:0
          TX packets:120 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:84101 (82.1 KiB)  TX bytes:13835 (13.5 KiB)
eth0      Link encap:Ethernet  HWaddr 00:50:56:8F:22:48  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:566 errors:0 dropped:0 overruns:0 frame.:0
          TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:43053 (42.0 KiB)  TX bytes:5791 (5.6 KiB)
          Base address:0x2000 Memory:d8920000-d8940000 
eth1      Link encap:Ethernet  HWaddr 00:50:56:8F:22:48  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:543 errors:0 dropped:0 overruns:0 frame.:0
          TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:41048 (40.0 KiB)  TX bytes:8214 (8.0 KiB)
          Base address:0x2040 Memory:d8940000-d8960000 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:5694 errors:0 dropped:0 overruns:0 frame.:0
          TX packets:5694 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:8581664 (8.1 MiB)  TX bytes:8581664 (8.1 MiB)
[root@rac4 ~]# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.2.4 (January 28, 2008)
Bonding Mode: fault-tolerance (active-backup) 主備模式
Primary Slave: None
Currently Active Slave: eth0 當前工作網卡為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:50:56:8f:22:48
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:50:56:8f:7d:6
mode=1時,當一個網絡接口失效時(例如主交換機掉電等),不回出現網絡中斷,系統會按照cat /etc/rc.d/rc.local里指定網卡的順序工作,機器仍能對外服務,起到了失效保護的功能.
對於mode=0 負載均衡工作模式,此模式能提供兩倍的帶寬, 在這種情況下出現一塊網卡失效,僅僅會是服務器出口帶寬下降,也不會影響網絡使用。通過查看bond0的工作狀態查詢能詳細的掌握bonding的工作狀態:
[root@rac4 ~]#  cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.2.4 (January 28, 2008)
Bonding Mode: load balancing (round-robin)--負載模式
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:50:56:8f:22:48
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:50:56:8f:7d:6f
[root@rac4 ~]# ifconfig
bond0     Link encap:Ethernet  HWaddr 00:50:56:8F:22:48  
          inet addr:10.250.7.220  Bcast:10.250.7.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe8f:2248/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:376 errors:0 dropped:0 overruns:0 frame.:0
          TX packets:121 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:29934 (29.2 KiB)  TX bytes:13014 (12.7 KiB)
eth0      Link encap:Ethernet  HWaddr 00:50:56:8F:22:48  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:203 errors:0 dropped:0 overruns:0 frame.:0
          TX packets:61 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:15858 (15.4 KiB)  TX bytes:8146 (7.9 KiB)
          Base address:0x2000 Memory:d8920000-d8940000 
eth1      Link encap:Ethernet  HWaddr 00:50:56:8F:22:48  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:173 errors:0 dropped:0 overruns:0 frame.:0
          TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:14076 (13.7 KiB)  TX bytes:4868 (4.7 KiB)
          Base address:0x2040 Memory:d8940000-d8960000 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3080 errors:0 dropped:0 overruns:0 frame.:0
          TX packets:3080 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4806596 (4.5 MiB)  TX bytes:4806596 (4.5 MiB)
 

Linux雙網卡綁定bond詳解

   網卡bond是通過多張網卡綁定為一個邏輯網卡,實現本地網卡的冗余,帶寬擴容和負載均衡,在生產場景中是一種常用的技術。Kernels 2.4.12及以后的版本均供bonding模塊,以前的版本可以通過patch實現。可以通過以下命令確定內核是否支持 bonding:

1
2
3
[root@lixin network-scripts] #cat /boot/config-2.6.32-573.el6.x86_64 |grep -i bonding
CONFIG_BONDING=m
[root@lixin network-scripts] #

2 bond的模式

 

bond的模式常用的有兩種:

  mode=0(balance-rr)

    表示負載分擔round-robin,並且是輪詢的方式比如第一個包走eth0,第二個包走eth1,直到數據包發送完畢。

    優點:流量提高一倍

    缺點:需要接入交換機做端口聚合,否則可能無法使用

  mode=1(active-backup)

    表示主備模式,即同時只有1塊網卡在工作。

    優點:冗余性高

    缺點:鏈路利用率低,兩塊網卡只有1塊在工作

bond其他模式:

  mode=2(balance-xor)(平衡策略)

    表示XOR Hash負載分擔,和交換機的聚合強制不協商方式配合。(需要xmit_hash_policy,需要交換機配置port channel)

    特點:基於指定的傳輸HASH策略傳輸數據包。缺省的策略是:(源MAC地址 XOR 目標MAC地址) % slave數量。其他的傳輸策略可以通過xmit_hash_policy選項指定,此模式提供負載平衡和容錯能力

  mode=3(broadcast)(廣播策略)

    表示所有包從所有網絡接口發出,這個不均衡,只有冗余機制,但過於浪費資源。此模式適用於金融行業,因為他們需要高可靠性的網絡,不允許出現任何問題。需要和交換機的聚合強制不協商方式配合。

    特點:在每個slave接口上傳輸每個數據包,此模式提供了容錯能力

  mode=4(802.3ad)(IEEE 802.3ad 動態鏈接聚合)

    表示支持802.3ad協議,和交換機的聚合LACP方式配合(需要xmit_hash_policy).標准要求所有設備在聚合操作時,要在同樣的速率和雙工模式,而且,和除了balance-rr模式外的其它bonding負載均衡模式一樣,任何連接都不能使用多於一個接口的帶寬。

    特點:創建一個聚合組,它們共享同樣的速率和雙工設定。根據802.3ad規范將多個slave工作在同一個激活的聚合體下。外出流量的slave選舉是基於傳輸hash策略,該策略可以通過xmit_hash_policy選項從缺省的XOR策略改變到其他策略。需要注意的是,並不是所有的傳輸策略都是802.3ad適應的,尤其考慮到在802.3ad標准43.2.4章節提及的包亂序問題。不同的實現可能會有不同的適應性。

    必要條件:

        條件1:ethtool支持獲取每個slave的速率和雙工設定

        條件2:switch(交換機)支持IEEE802.3ad Dynamic link aggregation

        條件3:大多數switch(交換機)需要經過特定配置才能支持802.3ad模式

  mode=5(balance-tlb)(適配器傳輸負載均衡)

    是根據每個slave的負載情況選擇slave進行發送,接收時使用當前輪到的slave。該模式要求slave接口的網絡設備驅動有某種ethtool支持;而且ARP監控不可用。

    特點:不需要任何特別的switch(交換機)支持的通道bonding。在每個slave上根據當前的負載(根據速度計算)分配外出流量。如果正在接受數據的slave出故障了,另一個slave接管失敗的slave的MAC地址。

    必要條件:

        ethtool支持獲取每個slave的速率

  mode=6(balance-alb)(適配器適應性負載均衡)

    在5的tlb基礎上增加了rlb(接收負載均衡receiveload balance).不需要任何switch(交換機)的支持。接收負載均衡是通過ARP協商實現的.

    特點:該模式包含了balance-tlb模式,同時加上針對IPV4流量的接收負載均衡(receiveload balance, rlb),而且不需要任何switch(交換機)的支持。接收負載均衡是通過ARP協商實現的。bonding驅動截獲本機發送的ARP應答,並把源硬件地址改寫為bond中某個slave的唯一硬件地址,從而使得不同的對端使用不同的硬件地址進行通信。來自服務器端的接收流量也會被均衡。當本機發送ARP請求時,bonding驅動把對端的IP信息從ARP包中復制並保存下來。當ARP應答從對端到達時,bonding驅動把它的硬件地址提取出來,並發起一個ARP應答給bond中的某個slave。使用ARP協商進行負載均衡的一個問題是:每次廣播 ARP請求時都會使用bond的硬件地址,因此對端學習到這個硬件地址后,接收流量將會全部流向當前的slave。這個問題可以通過給所有的對端發送更新(ARP應答)來解決,應答中包含他們獨一無二的硬件地址,從而導致流量重新分布。當新的slave加入到bond中時,或者某個未激活的slave重新激活時,接收流量也要重新分布。接收的負載被順序地分布(round robin)在bond中最高速的slave上當某個鏈路被重新接上,或者一個新的slave加入到bond中,接收流量在所有當前激活的slave中全部重新分配,通過使用指定的MAC地址給每個 client發起ARP應答。下面介紹的updelay參數必須被設置為某個大於等於switch(交換機)轉發延時的值,從而保證發往對端的ARP應答不會被switch(交換機)阻截。

bond模式小結:

    mode5和mode6不需要交換機端的設置,網卡能自動聚合。mode4需要支持802.3ad。mode0,mode2和mode3理論上需要靜態聚合方式。

3 配置bond

 

測試環境:

1
2
3
4
5
[root@lixin ~] # cat/etc/redhat-release
CentOS release 6.7 (Final)
[root@lixin ~] # uname -r
2.6.32-573.el6.x86_64
[root@lixin~] #

 

1、配置物理網卡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@lixin network-scripts] #cat ifcfg-eth0    
DEVICE=eth0
TYPE=Ethernet
ONBOOT= yes
BOOTPROTO=none
MASTER=bond0
SLAVE= yes          // 可以沒有此字段,就需要開機執行ifenslave bond0 eth0 eth1命令了。
[root@lixin network-scripts] #
[root@lixin network-scripts] #cat ifcfg-eth1    
DEVICE=eth1
TYPE=Ethernet
ONBOOT= yes
BOOTPROTO=none
MASTER=bond0
SLAVE= yes       
[root@lixin network-scripts] #

 

2、配置邏輯網卡bond0

1
2
3
4
5
6
7
8
9
10
11
[root@lixin network-scripts] #cat ifcfg-bond0     //需要我們手工創建
DEVICE=bond0
TYPE=Ethernet
ONBOOT= yes
BOOTPROTO=static
IPADDR=10.0.0.10
NETMASK=255.255.255.0
DNS2=4.4.4.4
GATEWAY=10.0.0.2
DNS1=10.0.0.2
[root@lixin network-scripts] #

由於沒有這個配置文件我們可以使用拷貝一個ifcfg-eth1來用:cp ifcfg-{eth0,bond1}

 

3、加載模塊,讓系統支持bonding

1
2
3
4
[root@lixin ~] # cat/etc/modprobe.conf  //不存在的話,手動創建(也可以放在modprobe.d下面)
alias  bond0 bonding
options bond0 miimon=100 mode=0
[root@lixin ~] #

配置bond0的鏈路檢查時間為100ms,模式為0。

 

注意:

  linux網卡bonging的備份模式實驗在真實機器上做完全沒問題(前提是linux內核支持),但是在vmware workstation虛擬中做就會出現如下圖問題。  

wKiom1cltR7iDq7qAAAZty5SqTM486.png

  配置完成后出現如上圖問題,但是bond0能夠正常啟動也能夠正常使用,只不過沒有起到備份模式的效果。當使用ifdown eth0后,網絡出現不通現象。

內核文檔中有說明:bond0獲取mac地址有兩種方式,一種是從第一個活躍網卡中獲取mac地址,然后其余的SLAVE網卡的mac地址都使用該mac地址;另一種是使用fail_over_mac參數,是bond0使用當前活躍網卡的mac地址,mac地址或者活躍網卡的轉換而變。  

  既然vmware workstation不支持第一種獲取mac地址的方式,那么可以使用fail_over_mac=1參數,所以這里我們添加fail_over_mac=1參數

1
2
3
4
[root@lixin etc] # cat/etc/modprobe.d/modprobe.conf
alias  bond0 bonding
options bond0 miimon=100 mode=0fail_over_mac=1
[root@lixin etc] #

 

4、加載bond module

1
[root@lixin etc] # modprobe bonding

 

5、查看綁定結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@lixin etc] # cat/proc/net/bonding/bond0
Ethernet Channel BondingDriver: v3.7.1 (April 27, 2011)
  
Bonding Mode: load balancing(round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
  
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr:00:50:56:28:7f:51
Slave queue ID: 0
  
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr:00:50:56:29:9b:da
Slave queue ID: 0
[root@lixin etc] #

4 測試bond

 

   由於使用的是mode=0,負載均衡的方式,這時我們ping百度,然后斷開一個網卡,此時ping不會中斷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@lixin etc] # pingbaidu.com
PING baidu.com (111.13.101.208)56(84) bytes of data.
64 bytes from 111.13.101.208:icmp_seq=1 ttl=128  time =10.6 ms
64 bytes from 111.13.101.208:icmp_seq=2 ttl=128  time =9.05 ms
64 bytes from 111.13.101.208:icmp_seq=3 ttl=128  time =11.7 ms
64 bytes from 111.13.101.208:icmp_seq=4 ttl=128  time =7.93 ms
64 bytes from 111.13.101.208:icmp_seq=5 ttl=128  time =9.50 ms
64 bytes from 111.13.101.208:icmp_seq=6 ttl=128  time =7.17 ms
64 bytes from 111.13.101.208:icmp_seq=7 ttl=128  time =21.2 ms
64 bytes from 111.13.101.208:icmp_seq=8 ttl=128  time =7.46 ms
64 bytes from 111.13.101.208:icmp_seq=9 ttl=128  time =7.82 ms
64 bytes from 111.13.101.208:icmp_seq=10 ttl=128  time =8.15 ms
64 bytes from 111.13.101.208:icmp_seq=11 ttl=128  time =6.89 ms
64 bytes from 111.13.101.208: icmp_seq=12ttl=128  time =8.33 ms
64 bytes from 111.13.101.208:icmp_seq=13 ttl=128  time =8.65 ms
64 bytes from 111.13.101.208:icmp_seq=14 ttl=128  time =7.16 ms
64 bytes from 111.13.101.208:icmp_seq=15 ttl=128  time =9.31 ms
64 bytes from 111.13.101.208:icmp_seq=16 ttl=128  time =10.5 ms
64 bytes from 111.13.101.208:icmp_seq=17 ttl=128  time =7.61 ms
64 bytes from 111.13.101.208:icmp_seq=18 ttl=128  time =10.2 ms
^C
--- baidu.com  ping  statistics---
18 packets transmitted, 18received, 0% packet loss,  time  17443ms
rtt min /avg/max/mdev  = 6.899 /9 .417 /21 .254 /3 .170 ms
// 用另一個終端手動關閉eth0網卡, ping 並沒有中斷
[root@lixin etc] # !ca
cat  /proc/net/bonding/bond0
Ethernet Channel BondingDriver: v3.7.1 (April 27, 2011)
  
Bonding Mode: load balancing(round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
  
Slave Interface: eth0
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr:00:50:56:28:7f:51
Slave queue ID: 0
  
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr:00:50:56:29:9b:da
Slave queue ID: 0
[root@lixin etc] #

//查看bond0狀態,發現eth0,down了,但是bond正常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM