【介紹】 算法
網卡bond通常主要用於網絡吞吐量很大,以及對於網絡穩定性要求較高的場景。 服務器
主要是經過將多個物理網卡綁定到一個邏輯網卡上,實現了本地網卡的冗餘,帶寬擴容以及負載均衡。 網絡
Linux下一共有七種網卡bond方式,實現以上某個或某幾個具體功能。 併發
最多見的三種模式是bond0,bond1,bond6. 負載均衡
【bond0】 學習
平衡輪循環策略,有自動備援,不過須要"Switch"支援及設定。 spa
balance-rr(Round-robin policy) rest
方式: 接口
傳輸數據包的順序是依次傳輸(即:第一個包走eth0,第二個包就走eth1……,一直到全部的數據包傳輸完成)。 ip
優勢:
提供負載均衡和容錯能力。
缺點:
同一個連接或者會話的數據包從不通的接口發出的話,中間會通過不一樣的鏈路,在客戶端可能會出現數據包沒法有序到達的狀況,而無序到達的數據包將會被要求從新發送,網絡吞吐量反而會降低。
【bond1】
主-備份策略
active-backup(Active -backup policy)
方式:
只有一個設備處於活動狀態,一個宕掉以後另外一個立刻切換爲主設備。
mac地址爲外部可見,從外面看,bond的mac地址是惟一的,switch不會發生混亂。
優勢:
提升了網絡鏈接的可靠性。
缺點:
此模式只提供容錯能力,資源利用性較低,只有一個接口處於active狀態,在有N個網絡接口bond的狀態下,利用率只有1/N。
【bond2】
平衡策略
balance-xor(XOR policy)
方式:
基於特性的Hash算法傳輸數據包。
缺省的策略爲:(源MAC地址 XOR 目標MAC地址) % slave數量。 # XRO爲異或運算,值不一樣時結果爲1,相同爲0
能夠經過xmit_hash_policy選項設置傳輸策略。
特色:
提供負載均衡和容錯能力。
【bond3】
廣播策略
broadcast
方式:
在每一個slave接口上傳輸每個數據包。
特色:
提供容錯能力。
【bond4】
IEEE 802.3ad 動態連接聚合
802.3ad( IEEE 802.3ad Dynamic link aggregation)
方式:
建立一個聚合組,共享一樣的速率和雙工設定。
根據802.3ad規範將多個slave工做在同一個激活的聚合體下。外出流量的slave選舉基於傳輸Hash策略,一樣,此策略也能夠經過xmit_hash_policy選項進行修改。
注意:
並非全部的傳輸策略都是802.3ad所適應的。
條件:
1. ethtool支持獲取每一個slave的速率和雙工設定。
2. switch支持IEEE 802.3ad Dynamic link aggregation(大多數交換機須要設定才支持)
【bond5】
適配器傳輸負載均衡
balance-tlb(Adaptive transmit load balancing)
方式:
在每一個slave上根據當前的負載(依據速度)分配外出流量,接收時使用當前輪到的slave。
若是正在接受數據的slave出故障了,另外一個slave接管失敗的slave的MAC地址。
條件:
ethtool支持獲取每一個slave的速率。
特色:
不須要任何特別的switch(交換機)支持的通道bonding。
【bond6】
適配器適應性負載均衡
balance-alb(Adaptive load balancing)
方式:
此模式包含了bond5的balance-tlb,同時增長了針對IPV4流量的接收負載均衡。(receive load balance, rlb)
接收負載均衡是經過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出了故障,則它的硬件地址會被從新選舉產生的slave接管。
與bond0最大的區別在於,bond0的多張網卡里面的流量幾乎是相同的,可是bond6裏面的流量是先佔滿eth0,再佔滿eth1……依次
【網卡綁定】
咱們假定前條件:
2個物理網口eth0,eth1
綁定後的虛擬口爲bond0
服務器IP爲10.10.10.1
配置文件:
1. vi /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0 BOOTPROTO=none ONBOOT=yes IPADDR=10.10.10.1 NETMASK=255.255.255.0 NETWORK=192.168.0.0 |
2. vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=none MASTER=bond0 SLAVE=yes |
3. vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1 BOOTPROTO=none MASTER=bond0 SLAVE=yes |
修改modprobe相關設定文件,並加載bonding模塊:
1. vi /etc/modprobe.d/bonding.conf
alias bond0 bonding options bonding mode=0 miimon=200 |
2. 加載模塊
modprobe bonding |
3. 確認是否加載成功
[root@slb ~]# lsmod | grep bonding
bonding 100065 0
4. 重啓網絡
[root@slb ~]# /etc/init.d/network restart
[root@slb ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
……
[root@slb ~]# 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
以上信息能夠確認:
a. 如今的bonding模式是active-backup
b. 如今Active的網口是eth0
c. bond0, eth1的物理地址和處於active狀態下的eth0的物理地址相同,這樣是爲了不上位交換機發生混亂。
能夠隨意拔掉一根網線或者在交換機上shutdown一個網口,查看網絡是否依舊聯通。
5. 系統啓動自動綁定並增長默認網關(可選)
[root@slb ~]# vi /etc/rc.d/rc.local
ifenslave bond0 eth0 eth1
route add default gw 10.10.10.1
【多網卡綁定】
上面只是兩個網卡綁定一個bond0的狀況,若是咱們要設置多個bond口,就不能這樣作了。
·/etc/modprobe.d/bonding.conf·的修改能夠以下:
1. 多個bond的模式同樣的狀況
alias bond0 bonding alias bond1 bonding options bonding max_bonds=2 miimon=200 mode=1 |
2. 多個bond的模式不同的狀況
alias bond0 bonding options bond0 miimon=100 mode=1 install bond1 /sbin/modprobe bonding -o bond1 miimon=200 mode=0install bond2 /sbin/modprobe bonding -o bond2 miimon=100 mode=1 |