1)修改vi /etc/rc.d/rc.local文件,增長如下內容(注意這裏添加的是eth0、eth1兩個網口) ifenslave bond0 eth0 eth1 #若是一塊網卡失效,系統會按照/etc/rc.d/rc.local裏順序啓動網卡,起到失效保護做用。 echo "0" >>/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts setsebool ftpd_disable_trans 1 service vsftpd restart route add -net 224.0.0.0/4 dev bond0 #添加路由來設定發送規則 2)修改配置文件/etc/sysconfig/network-scripts 新增ifcfg-bond0文件,內容以下: DEVICE=bond0 #設備名稱 BOOTPROTO=static #不啓用DHCP ONBOOT=yes #開機自啓動 IPADDR=192.168.101.X #網卡陣列的ip地址 NETMASK=255.255.255.0 #掩碼 GATEWAY=192.168.101.1 #網關 修改ifcfg-eth0,ifcfg-eth1文件,根據實際配置文件新增修改部分以下: MASTER=bond0 SLAVE=yes BOOTPROTO=static #配置靜態地址,不開啓DHCP ONBOOT=yes #開機網卡自啓動 3)修改/etc/modprobe.d/dist.conf(按esc用:$回車抵達最後一行在末尾添加下面兩句) alias bond0 bonding (Bonding只能提供鏈路監測,從主機到交換機的鏈路是否連通,若是隻是交換機對外的鏈路down掉,而交換機自己沒有故障,bonding會認爲沒有故障而繼續使用) options bond0 miimon=100 mode=1 (miimon用來進行鏈路監測,每100ms監測一次鏈路鏈接狀態,若是一條不一樣轉入另外一條線路;mode的值表示工做模式,共有1,2,3,4四種模式 Mode=0表示load balancing(round-robin)爲負載均衡模式 Mode=1表示fault- tolerance(active-backup)爲冗餘模式,主備工做模式) alias net-pf-10 off #關閉ipv6支持,能夠不加 對於級聯小交換機 alias bond0 bonding options bond0 mode=1 arp_interval=500 arp_ip_target=192.168.101.254 arp_validate=all primary=eth0 #經過定時器,每一個slave接口不斷髮送ARP包來不斷更換交換機端口與MAC的對應關係 使得每一個網卡都在進行工做。這個ARP的發送規則是: 每arp_interval(MS)間隔向arp_ip_target發送arp請求,能夠向多個arp_ip_target發送arp請求。 4)增長/etc/udev/rules.d/50-hwinterfaces.rules (鎖定網卡物理地址,SYSFS{address}==""雙引號中輸入物理地址) KERNEL=="eth*",SYSFS{address}=="",NAME="eth0" KERNEL=="eth*",SYSFS{address}=="",NAME="eth1" KERNEL=="eth*",SYSFS{address}=="",NAME="eth2" KERNEL=="eth*",SYSFS{address}=="",NAME="eth3" KERNEL=="eth*",SYSFS{address}=="",NAME="eth4" 防止機器網卡的mac地址發生漂移 5)查看網卡陣列的配置狀況 #ifconfig -a|grep HWaddr 查看網卡mac信息,若是bond0,eth0,eth1硬件地址一致,則配置成功 #cat /proc/net/bonding/bond0 查看bond0工做狀態 附錄: 1.bond0上的mac地址修改爲一致,這些網卡接在同一臺交換機上,那麼該交換機的arp表同一mac地址對應的端口有多個,交換機沒法判斷數據包發往的端口,因此要求交換機的相應端口採起聚合模式,聚合後的端口採用同一mac地址。 2. 使網卡配置立刻生效,不用重啓機器,命令 #service network restart或 #/etc/rc.d/init.d/network restart 必須關閉NetworkManager服務 #service NetworkManager stop //當前環境下關閉服務 #chkconfig NetworkManager off //開機啓動關閉服務 3.從新啓動網卡,命令 #ifconfig bond0 down/ifdown bond0 #ifconfig eth0 down/ifdown eth0 #ifconfig eth1 down/ifdown eth1 #ifenslave bond0 eth0 #ifenslave bond0 eth1 #ifconfig bond0 up/ifup bond0 #ifconfig eth0 up/ifup eth0 #ifconfig eth1 up/ifup eth1 4. Bonding的模式一共有7種: #defineBOND_MODE_ROUNDROBIN 0.balance-rr模式,網卡的負載均衡模式 #defineBOND_MODE_ACTIVEBACKUP 1.active-backup模式,網卡的容錯模式 #defineBOND_MODE_XOR 2.balance-xor模式,須要交換機支持 #defineBOND_MODE_BROADCAST 3.broadcast模式 #defineBOND_MODE_8023AD 4.IEEE 802.3ad動態鏈路聚合模式,須要交換機支持#defineBOND_MODE_TLB 5.自定義傳輸負載均衡模式 #defineBOND_MODE_ALB 6.網卡虛擬化方式 bonding模塊的全部工做模式能夠分爲兩類:多主型工做模式和主備型工做模式,balance-rr 和broadcast屬於多主型工做模式而active-backup屬於主備型工做模式。(balance-xor、自適應傳輸負載均衡模式 (balance-tlb)和自適應負載均衡模式(balance-alb)也屬於多主型工做模式,IEEE 802.3ad動態鏈路聚合模式(802.3ad)屬於主備型工做模式。 1)BOND_MODE_ROUNDROBIN模式下,bonding對於發送和接收數據的處理邏輯是不一致的,對於數據的接收,bonding基本不作任何處理,純粹依靠交換機端口與MAC的變化來實現交替接收數據。發送的話,交換機會根據數據的源MAC來學習端口和MAC之間的關係,因此bonding 作到的就是選擇不同的網卡發送。 2)網卡的容錯模式(mode =BOND_MODE_ACTIVEBACKUP),容錯模式的配置方法和負載均衡模式基本差很少,只不過修改一下/etc/modprobe.conf便可。 5.arp檢測模式 觀察交換機端口上所學習到的MAC地址,發現MAC會在兩個端口上反覆切換在BOND_MODE_ROUNDROBIN模式下,bonding對於發送和接收數據的處理邏輯是不一致的,對於數據的接收,bonding基本不作任何處理,純粹依靠交換機端口與MAC的變化來實現交替接收數據。發送的話,交換機會根據數據的源MAC來學習端口和MAC之間的關係,因此bonding 作到的就是選擇不同的網卡發送。 對於數據的發送, static inline voidbond_set_mode_ops(struct net_device *bond_dev, int mode) { switch(mode) { case BOND_MODE_ROUNDROBIN: bond_dev->hard_start_xmit =bond_xmit_roundrobin; break; ... bond的發送函數被註冊爲bond_xmit_roundrobin。經過bond_xmit_roundrobin的實現能夠發現。 static int bond_xmit_roundrobin(structsk_buff *skb, struct net_device *bond_dev) { ead_lock(&bond->curr_slave_lock); slave = start_at = bond->curr_active_slave; read_unlock(&bond->curr_slave_lock); bond_for_each_slave_from(bond, slave, i,start_at) { if(IS_UP(slave->dev) && (slave->link == BOND_LINK_UP) && (slave->state ==BOND_STATE_ACTIVE)) { res =bond_dev_queue_xmit(bond, skb, slave->dev); write_lock(&bond->curr_slave_lock); bond->curr_active_slave= slave->next; write_unlock(&bond->curr_slave_lock); break; } bond_xmit_roundrobin會經過curr_active_slave指針所指向的設備來進行發送,固然 curr_active_slave會在調用bond_dev_queue_xmit完成實際的發送以後指向下一個slave設備。 bond_dev_queue_xmit實際是調用通用的發送函數dev_queue_xmit來進行的,它傳遞給dev_queue_xmit的是一個 skb,在傳遞以前skb->dev就被指定爲了當前的slave設備,這樣內核就會找到對應的真實網卡設備來進行發送,最後 curr_active_slave指針的輪詢切換,實現了bonding的負載均衡工做模式。 從這種模式能夠看到,bonding實現了一個相似網卡驅動的模塊,對應的bond0設備是一個純粹的虛設備,數據發送雖說通過了它,但經過一系列調用,轉了一圈以後纔回到真正的網卡設備那裏進行發送,無疑會消耗必定的系統性能。 簡單用100Mbps速率的UDP數據包測試了一下BOND_MODE_ROUNDROBIN模式。 測試過程當中發現接收端會有較多的亂序包,觀察交換機端口狀況,端口之間的切換頻率不規則,這個和交換機的配置或者性能應該有很大聯繫,有必要的話須要進一步研究。數據的正確性和時序性可否保證須要進一步仔細測試。 6. mii鏈路檢測方式 與以前arp檢測方式不一樣。這兩種鏈路檢測方式在各類mode下都是可使用的,但要注意不能同時使用。 bonding的mii檢測實現。首先和arp-monitor同樣,mii也是定時器觸發 if(bond->params.miimon) { /* link checkinterval, in milliseconds. */ init_timer(mii_timer); mii_timer->expires= jiffies + 1; mii_timer->data = (unsigned long)bond_dev; mii_timer->function = (void*)&bond_mii_monitor; add_timer(mii_timer); } bond_mii_monitor函數其本質的原理就是檢測網卡的鏈路狀態,bonding定義網卡有4個鏈路狀態:BOND_LINK_UP: 正常狀態(處於該狀態的網卡是是潛在的發送數據包的候選者) BOND_LINK_FAIL:網卡出現故障,向狀態BOND_LINK_DOWN 切換中 BOND_LINK_DOWN:失效狀態 BOND_LINK_BACK:網卡恢復,向狀態BOND_LINK_UP切換中 從上到下,表示了網卡鏈路從正常到失效再到恢復狀態。bond_mii_monitor函數就是依次檢查網卡的鏈路狀態是否處於這些狀態,而後經過標記 do_failover變量來講明當前是否須要切換slave網卡。代碼篇幅較大,但邏輯仍是很清晰的,故此處不羅列了。 在BOND_MODE_ACTIVEBACKUP模式下,兩塊網卡其實有一塊是不工做的,被設置爲IFF_NOARP的狀態。同時,bond虛設備,還有 slave設備的MAC地址均一致,因此這張網卡不會被外界察覺存在。交換機也不存在想該端口發包的狀況。當bond的mii檢測發現當前的active 設備失效了以後,會切換到這個備份設備上。 在bond_change_active_slave函數中 if (bond->params.mode ==BOND_MODE_ACTIVEBACKUP) { if (old_active) { bond_set_slave_inactive_flags(old_active); } if (new_active) { bond_set_slave_active_flags(new_active); } } 這個就是在BOND_MODE_ACTIVEBACKUP模式下的切換邏輯,很簡單,須要注意的是,在 bond_set_slave_inactive_flags(old_active)中,須要將接口的狀態設置爲IFF_NOARP,否則交換機就可能 會把數據包發送到一個錯誤的端口上。 BOND_MODE_ACTIVEBACKUP模式下的數據發送很是簡單,可想而知curr_active_slave指針始終都指向當前可用的設備,所 以直接發送就能夠,沒有以前BOND_MODE_ROUNDROBIN模式下slave設備切換的過程。