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
MASTER=bond0
SLAVE=yes
vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
(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),如下:
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)
options bond0 miimon=100 mode=6
上圖可知:mode=6時,eth0與eth1所使用的MAC是不一樣的
四、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),但是可能會給網關造成一定的壓力)
子產品加載:
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包)
<a href="http://rhn.redhat.com/errata/RHSA-2010-0178.html">http://rhn.redhat.com/errata/RHSA-2010-0178.html</a>
本文轉自 Mr_sheng 51CTO部落格,原文連結:http://blog.51cto.com/sf1314/2074459