理解Linux下網(wǎng)卡的bonding

發(fā)現(xiàn)工作中可能會用到Linux下網(wǎng)卡綁定相關(guān)的知識。找了些文章看,然后一通混剪,各家所長為我所用。

什么是網(wǎng)卡bond

網(wǎng)卡bonding

網(wǎng)卡bond,即網(wǎng)卡綁定,也稱作網(wǎng)卡捆綁。網(wǎng)卡綁定有多種稱謂:Port Trunking, Channel Bonding, Link Aggregation, NIC teaming等等,其實說的是一回事。就是將兩個或者更多的物理網(wǎng)卡綁定成一個虛擬網(wǎng)卡。通過綁定可以達(dá)到鏈路冗余、帶寬倍增、負(fù)載均衡等目的。是生產(chǎn)場景中提高性能和可靠性的一種常用技術(shù)。
Linux內(nèi)置了網(wǎng)卡綁定的驅(qū)動程序,可以將多個物理網(wǎng)卡分別捆綁成多個不同的邏輯網(wǎng)卡(例如把eth0、eth1捆綁成bond0,把eth2、eth3捆綁成bond1)。對于每一個bond接口來說,可以分別定義不同的綁定模式和鏈路監(jiān)視選項。

bond的模式

對應(yīng)于不同的負(fù)載均衡和容錯特性需求,Linux網(wǎng)卡bond的模式共有bond0-bond6共7種。

mode=0(balance-rr)

表示負(fù)載分擔(dān)round-robin,并且是輪詢的方式,比如第一個包走eth0,第二個包走eth1,直到數(shù)據(jù)包發(fā)送完畢。

  • 優(yōu)點:可用帶寬提高一倍
  • 缺點:需要接入交換機(jī)做端口聚合,否則可能無法使用

mode=1(active-backup)

表示主備模式,即同一時間時只有1塊網(wǎng)卡在工作。

  • 優(yōu)點:冗余性高
  • 缺點:鏈路利用率低,兩塊網(wǎng)卡只有1塊在工作,N塊網(wǎng)卡綁定時利用率是1/N

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

表示使用MAC地址的XOR Hash負(fù)載分擔(dān),網(wǎng)絡(luò)上特定的通信雙方會始終經(jīng)由某一個網(wǎng)卡的鏈路通信,和交換機(jī)的聚合強(qiáng)制不協(xié)商方式配合。(需要xmit_hash_policy[1],需要交換機(jī)配置port channel)

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

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

表示所有包從所有綁定的網(wǎng)絡(luò)接口發(fā)出,不考慮均衡流量的分擔(dān),只有冗余機(jī)制,但過于浪費資源。此模式適用于金融行業(yè),因為他們需要高可靠性的網(wǎng)絡(luò),不允許出現(xiàn)任何問題。需要和交換機(jī)的聚合強(qiáng)制不協(xié)商方式配合。

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

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

表示支持802.3ad協(xié)議,和交換機(jī)的聚合LACP方式配合(需要xmit_hash_policy).標(biāo)準(zhǔn)要求所有設(shè)備在聚合操作時,要在同樣的速率和雙工模式。

  • 特點:創(chuàng)建一個聚合組,它們共享同樣的速率和雙工設(shè)定。根據(jù)802.3ad規(guī)范將多個slave工作在同一個激活的聚合體下。外出流量的slave選舉是基于傳輸hash策略,該策略可以通過xmit_hash_policy選項從缺省的XOR策略改變到其他策略。需要注意的是,并不是所有的傳輸策略都是802.3ad適應(yīng)的,尤其考慮到在802.3ad標(biāo)準(zhǔn)43.2.4章節(jié)提及的包亂序問題。不同的實現(xiàn)可能會有不同的適應(yīng)性。
  • 必要條件:
    • 條件1:ethtool支持獲取每個slave的速率和雙工設(shè)定
    • 條件2:switch(交換機(jī))支持IEEE802.3ad Dynamic link aggregation
    • 條件3:大多數(shù)switch(交換機(jī))需要經(jīng)過特定配置才能支持802.3ad模式

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

是根據(jù)每個slave的負(fù)載情況選擇slave進(jìn)行發(fā)送,接收時使用當(dāng)前輪到的slave。該模式要求slave接口的網(wǎng)絡(luò)設(shè)備驅(qū)動有某種ethtool支持;而且ARP監(jiān)控不可用。

  • 特點:不需要任何特別的switch(交換機(jī))支持的通道bonding。在每個slave上根據(jù)當(dāng)前的負(fù)載(根據(jù)速度計算)分配外出流量。如果正在接受數(shù)據(jù)的slave出故障了,另一個slave接管失敗的slave的MAC地址。
  • 必要條件:
    • ethtool支持獲取每個slave的速率

mode=6(balance-alb)(適配器適應(yīng)性負(fù)載均衡)

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

與交換機(jī)對接的要求

模式1、模式5和模式6不需要交換機(jī)端的設(shè)置,網(wǎng)卡能自動聚合。模式4需要支持802.3ad。模式0,模式2和模式3理論上需要靜態(tài)聚合方式。(據(jù)說實測中模式0可以通過mac地址欺騙的方式在交換機(jī)不設(shè)置的情況下不太均衡地進(jìn)行接收。)

Linux下的配置方法

第一步:創(chuàng)建ifcfg-bond0

創(chuàng)建ifcfg-bond0文件,配置IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)等參數(shù)。

# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0 
IPADDR=192.168.1.12 
NETMASK=255.255.255.0 
GATEWAY=192.168.1.1 
USERCTL=no 
BOOTPROTO=none 
ONBOOT=yes

第二步:修改網(wǎng)卡配置文件ifcfg-eth*(以三個網(wǎng)卡綁定為例)

修改eth0、eth1、eth2的配置文件,注釋或刪除IP地址、掩碼、網(wǎng)關(guān)和MAC地址的配置,添加關(guān)于MASTER和SLAVE的設(shè)置

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 
BOOTPROTO=none 
ONBOOT=yes 
# Settings for Bond 
MASTER=bond0 
SLAVE=yes

# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1 
BOOTPROTO=none  
ONBOOT=yes 
USERCTL=no 
# Settings for bonding 
MASTER=bond0 
SLAVE=yes

# cat /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2 
BOOTPROTO=none 
ONBOOT=yes 
MASTER=bond0 
SLAVE=yes

第三步:確定選用何種bonding模式

根據(jù)實際需求,選擇合適的bonding模式,為bond0設(shè)置bonding kernel module。
/etc/modprobe.conf中添加以下內(nèi)容

# bonding commands 
alias bond0 bonding 
options bond0 mode=1 miimon=200

有些Linux是在/etc/modprobe.d/下創(chuàng)建一個新的設(shè)置文件bonding.conf

options中
miimon:監(jiān)視網(wǎng)絡(luò)鏈接的頻度,單位是毫秒,我們設(shè)置的是200毫秒。為0則不檢測
max_bonds:配置的bond口個數(shù)
mode:bond模式,主要有0-6共7種,在一般的實際應(yīng)用中,0和1用的比較多

第四步:激活bonding驅(qū)動

# modprobe bonding

確認(rèn)模塊是否加載成功

#lsmod | grep bonding 

第五步:重啟網(wǎng)絡(luò),并確認(rèn)一下bond0的狀態(tài)。

重啟網(wǎng)絡(luò)(或重啟主機(jī)):

# service network restart

查看bond0的狀態(tài):

# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver
Bonding Mode: adaptive load balancing 
Primary Slave: None 
Currently Active Slave: eth2 
MII Status: up 
MII Polling Interval (ms): 100 
Up Delay (ms): 0 
Down Delay (ms): 0
Slave Interface: eth2 
MII Status: up 
Link Failure Count: 0 
Permanent HW addr: 00:13:72:80: 62:f0

另外還可以使用ifconfig -a | grep HWaddr查看bond0接口是否處于活動狀態(tài),以及各網(wǎng)卡MAC地址情況。

# ifconfig | grep HWaddr  
bond0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74  
eth0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74  
eth1 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74 
eth2 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74 

從上面的確認(rèn)信息中,我們可以看到3個重要信息:
1.現(xiàn)在的bonding模式是active-backup
2.現(xiàn)在Active狀態(tài)的網(wǎng)口是eth2
3.bond0,eth0、eth1、的物理地址和處于active狀態(tài)下的eth2的物理地址相同,這樣是為了避免上位交換機(jī)發(fā)生混亂。

測試驗證

可以ping一個遠(yuǎn)程地址,然后斷開Active狀態(tài)的eth2口網(wǎng)線,驗證主備模式是否能正常切換,業(yè)務(wù)是否受到影響。

ifenslave命令

將網(wǎng)口添加到bond中:ifenslave bond eth0 eth1【bond要先up】
將bond中刪除網(wǎng)口:ifenslave -d bond eth0
bond中網(wǎng)口主備倒換:ifenslave -c bond eth1

多個bond口如何處理

前面只是3個網(wǎng)口綁定成一個bond1的情況,如果我們要設(shè)置多個bond口,比如物理網(wǎng)口eth0和eth1組成bond0,eth2和eth3組成bond1應(yīng)該如何設(shè)置呢?
網(wǎng)口設(shè)置文件的設(shè)置方法和上面第1步講的方法相同,只是/etc/modprobe.d/bonding.conf的設(shè)定就不能像下面這樣簡單的疊加了:

alias bond0 bonding  
options bonding mode=1 miimon=200  
alias bond1 bonding  
options bonding mode=1 miimon=200 

正確的設(shè)置方法有2種:
第一種:你可以看到,這種方式的話,多個bond口的模式就只能設(shè)成相同的了:

alias bond0 bonding  
alias bond1 bonding  
options bonding max_bonds=2 miimon=200 mode=1 

第二種:這種方式,不同的bond口的mode可以設(shè)成不一樣:

alias bond0 bonding  
options bond0 miimon=100 mode=1  
install bond1 /sbin/modprobe bonding -o bond1 miimon=200 mode=0 

按照上面這2種設(shè)置方法,現(xiàn)在如果是要設(shè)置3個,4個,甚至更多的bond口,可是可以的。

參考資料:
中文:
https://blog.csdn.net/shengerjianku/article/details/79221886
https://www.cnblogs.com/tcicy/p/8554014.html
https://www.cnblogs.com/fan-gx/p/11069845.html
http://www.itdecent.cn/p/1919bdb7e8c2
英文:
https://www.thegeekdiary.com/what-are-the-network-bonding-modes-in-centos-rhel/
http://www.enterprisenetworkingplanet.com/linux_unix/article.php/3850636/Understanding-NIC-Bonding-with-Linux.htm
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/overview-of-bonding-modes-and-the-required-settings-on-the-switch
http://www.linuxhowto.in/2012/08/modes-of-bonding-network-bonding.html
https://www.cloudibee.com/network-bonding-modes/


  1. xmit_hash_policy的解釋:這個參數(shù)可用于mode2和mode4,有以下幾種:
    layer2:使用二層幀頭作為計算分發(fā)出口的參數(shù),這導(dǎo)致通過同一個網(wǎng)關(guān)的數(shù)據(jù)流將完全從一個端口發(fā)送,為了更加細(xì)化分發(fā)策略,必須使用一些三層信息,然而卻增加了計算開銷。
    layer2+3:在1的基礎(chǔ)上增加了三層的ip報頭信息,計算量增加了,然而負(fù)載卻更加均衡了,一個個主機(jī)到主機(jī)的數(shù)據(jù)流形成并且同一個流被分發(fā)到同一個端口,根據(jù)這個思想,如果要使負(fù)載更加均衡。
    layer3+4:可以形成一個個端口到端口的流,負(fù)載更加均衡。通過TCP及UDP端口及其IP地址進(jìn)行HASH計算。
    miimon和arp:使用miimon僅能檢測鏈路層的狀態(tài),也就是鏈路層的端到端連接(即交換機(jī)某個口和與之直連的本地網(wǎng)卡口),然而交換機(jī)的上行口如果down掉了還是無法檢測到,因此必然需要網(wǎng)絡(luò)層的狀態(tài)檢測,最簡單也是最直接的方式就是arp了,可以直接arp網(wǎng)關(guān),如果定時器到期網(wǎng)關(guān)還沒有回復(fù)arp reply,則認(rèn)為鏈路不通了。 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容