網(wǎng)卡陣列配置
1.修改vi /etc/rc.d/rc.local文件,增加以下內(nèi)容(注意這里添加的是eth0、eth1兩個(gè)網(wǎng)口)
ifenslave bond0 eth0 eth1
#如果一塊網(wǎng)卡失效,系統(tǒng)會(huì)按照/etc/rc.d/rc.local里順序啟動(dòng)網(wǎng)卡,起到失效保護(hù)作用。
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
#添加路由來(lái)設(shè)定發(fā)送規(guī)則
2.修改配置文件/etc/sysconfig/network-scripts
新增ifcfg-bond0文件,內(nèi)容如下:
DEVICE=bond0 #設(shè)備名稱(chēng)
BOOTPROTO=static #不啟用DHCP
ONBOOT=yes #開(kāi)機(jī)自啟動(dòng)
IPADDR=192.168.101.X #網(wǎng)卡陣列的ip地址
NETMASK=255.255.255.0 #掩碼
GATEWAY=192.168.101.1 #網(wǎng)關(guān)
修改ifcfg-eth0,ifcfg-eth1文件,根據(jù)實(shí)際配置文件新增修改部分如下:
MASTER=bond0
SLAVE=yes
BOOTPROTO=static #配置靜態(tài)地址,不開(kāi)啟DHCP
ONBOOT=yes #開(kāi)機(jī)網(wǎng)卡自啟動(dòng)
3.修改/etc/modprobe.d/dist.conf(按esc用:$回車(chē)抵達(dá)最后一行在末尾添加下面兩句)
alias bond0 bonding
(Bonding只能提供鏈路監(jiān)測(cè),從主機(jī)到交換機(jī)的鏈路是否連通,如果只是交換機(jī)對(duì)外的鏈路down掉,而交換機(jī)本身沒(méi)有故障,bonding會(huì)認(rèn)為沒(méi)有故障而繼續(xù)使用)
options bond0 miimon=100 mode=1
(miimon用來(lái)進(jìn)行鏈路監(jiān)測(cè),每100ms監(jiān)測(cè)一次鏈路連接狀態(tài),如果一條不同轉(zhuǎn)入另一條線路;mode的值表示工作模式,共有1,2,3,4四種模式
Mode=0表示load balancing(round-robin)為負(fù)載均衡模式
Mode=1表示fault- tolerance(active-backup)為冗余模式,主備工作模式)
alias net-pf-10 off #關(guān)閉ipv6支持,可以不加
對(duì)于級(jí)聯(lián)小交換機(jī)
alias bond0 bonding
options bond0 mode=1 arp_interval=500 arp_ip_target=192.168.101.254 arp_validate=all primary=eth0
#通過(guò)定時(shí)器,每個(gè)slave接口不斷發(fā)送ARP包來(lái)不斷更換交換機(jī)端口與MAC的對(duì)應(yīng)關(guān)系
使得每個(gè)網(wǎng)卡都在進(jìn)行工作。這個(gè)ARP的發(fā)送規(guī)則是:
每arp_interval(MS)間隔向arp_ip_target發(fā)送arp請(qǐng)求,可以向多個(gè)arp_ip_target發(fā)送arp請(qǐng)求。
4.增加/etc/udev/rules.d/50-hwinterfaces.rules
(鎖定網(wǎng)卡物理地址,SYSFS{address}==""雙引號(hào)中輸入物理地址)
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"
防止機(jī)器網(wǎng)卡的mac地址發(fā)生漂移
5.查看網(wǎng)卡陣列的配置情況
#ifconfig -a|grep HWaddr
查看網(wǎng)卡mac信息,如果bond0,eth0,eth1硬件地址一致,則配置成功
#cat /proc/net/bonding/bond0
查看bond0工作狀態(tài)
網(wǎng)卡常用操作方法筆記
1.bond0上的mac地址修改成一致,這些網(wǎng)卡接在同一臺(tái)交換機(jī)上,那么該交換機(jī)的arp表同一mac地址對(duì)應(yīng)的端口有多個(gè),交換機(jī)無(wú)法判斷數(shù)據(jù)包發(fā)往的端口,所以要求交換機(jī)的相應(yīng)端口采取聚合模式,聚合后的端口采用同一mac地址。
2.使網(wǎng)卡配置馬上生效,不用重啟機(jī)器,命令
#service network restart或
#/etc/rc.d/init.d/network restart
必須關(guān)閉NetworkManager服務(wù)
#service NetworkManager stop //當(dāng)前環(huán)境下關(guān)閉服務(wù)
#chkconfig NetworkManager off //開(kāi)機(jī)啟動(dòng)關(guān)閉服務(wù)
3.重新啟動(dòng)網(wǎng)卡,命令
#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模式,網(wǎng)卡的負(fù)載均衡模式
#defineBOND_MODE_ACTIVEBACKUP 1.active-backup模式,網(wǎng)卡的容錯(cuò)模式
#defineBOND_MODE_XOR 2.balance-xor模式,需要交換機(jī)支持
#defineBOND_MODE_BROADCAST 3.broadcast模式
#defineBOND_MODE_8023AD 4.IEEE 802.3ad動(dòng)態(tài)鏈路聚合模式,需要交換機(jī)支持#defineBOND_MODE_TLB 5.自定義傳輸負(fù)載均衡模式
#defineBOND_MODE_ALB 6.網(wǎng)卡虛擬化方式
bonding模塊的所有工作模式可以分為兩類(lèi):多主型工作模式和主備型工作模式,balance-rr 和broadcast屬于多主型工作模式而active-backup屬于主備型工作模式。(balance-xor、自適應(yīng)傳輸負(fù)載均衡模式 (balance-tlb)和自適應(yīng)負(fù)載均衡模式(balance-alb)也屬于多主型工作模式,IEEE 802.3ad動(dòng)態(tài)鏈路聚合模式(802.3ad)屬于主備型工作模式。
(1)BOND_MODE_ROUNDROBIN模式下,bonding對(duì)于發(fā)送和接收數(shù)據(jù)的處理邏輯是不一致的,對(duì)于數(shù)據(jù)的接收,bonding基本不做任何處理,純粹依靠交換機(jī)端口與MAC的變化來(lái)實(shí)現(xiàn)交替接收數(shù)據(jù)。發(fā)送的話,交換機(jī)會(huì)根據(jù)數(shù)據(jù)的源MAC來(lái)學(xué)習(xí)端口和MAC之間的關(guān)系,所以bonding 做到的就是選擇不一樣的網(wǎng)卡發(fā)送。
(2)網(wǎng)卡的容錯(cuò)模式(mode =BOND_MODE_ACTIVEBACKUP),容錯(cuò)模式的配置方法和負(fù)載均衡模式基本差不多,只不過(guò)修改一下/etc/modprobe.conf即可。
5.arp檢測(cè)模式
觀察交換機(jī)端口上所學(xué)習(xí)到的MAC地址,發(fā)現(xiàn)MAC會(huì)在兩個(gè)端口上反復(fù)切換在BOND_MODE_ROUNDROBIN模式下,bonding對(duì)于發(fā)送和接收數(shù)據(jù)的處理邏輯是不一致的,對(duì)于數(shù)據(jù)的接收,bonding基本不做任何處理,純粹依靠交換機(jī)端口與MAC的變化來(lái)實(shí)現(xiàn)交替接收數(shù)據(jù)。發(fā)送的話,交換機(jī)會(huì)根據(jù)數(shù)據(jù)的源MAC來(lái)學(xué)習(xí)端口和MAC之間的關(guān)系,所以bonding 做到的就是選擇不一樣的網(wǎng)卡發(fā)送。
對(duì)于數(shù)據(jù)的發(fā)送,
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的發(fā)送函數(shù)被注冊(cè)為bond_xmit_roundrobin。通過(guò)bond_xmit_roundrobin的實(shí)現(xiàn)可以發(fā)現(xiàn)。
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會(huì)通過(guò)curr_active_slave指針?biāo)赶虻脑O(shè)備來(lái)進(jìn)行發(fā)送,當(dāng)然 curr_active_slave會(huì)在調(diào)用bond_dev_queue_xmit完成實(shí)際的發(fā)送之后指向下一個(gè)slave設(shè)備。 bond_dev_queue_xmit實(shí)際是調(diào)用通用的發(fā)送函數(shù)dev_queue_xmit來(lái)進(jìn)行的,它傳遞給dev_queue_xmit的是一個(gè) skb,在傳遞之前skb->dev就被指定為了當(dāng)前的slave設(shè)備,這樣內(nèi)核就會(huì)找到對(duì)應(yīng)的真實(shí)網(wǎng)卡設(shè)備來(lái)進(jìn)行發(fā)送,最后 curr_active_slave指針的輪詢切換,實(shí)現(xiàn)了bonding的負(fù)載均衡工作模式。
從這種模式可以看到,bonding實(shí)現(xiàn)了一個(gè)類(lèi)似網(wǎng)卡驅(qū)動(dòng)的模塊,對(duì)應(yīng)的bond0設(shè)備是一個(gè)純粹的虛設(shè)備,數(shù)據(jù)發(fā)送雖然說(shuō)經(jīng)過(guò)了它,但通過(guò)一系列調(diào)用,轉(zhuǎn)了一圈之后才回到真正的網(wǎng)卡設(shè)備那里進(jìn)行發(fā)送,無(wú)疑會(huì)消耗一定的系統(tǒng)性能。
簡(jiǎn)單用100Mbps速率的UDP數(shù)據(jù)包測(cè)試了一下BOND_MODE_ROUNDROBIN模式。
測(cè)試過(guò)程中發(fā)現(xiàn)接收端會(huì)有較多的亂序包,觀察交換機(jī)端口情況,端口之間的切換頻率不規(guī)則,這個(gè)和交換機(jī)的配置或者性能應(yīng)該有很大聯(lián)系,有必要的話需要進(jìn)一步研究。數(shù)據(jù)的正確性和時(shí)序性能否保證需要進(jìn)一步仔細(xì)測(cè)試。
6. mii鏈路檢測(cè)方式
與之前arp檢測(cè)方式不同。這兩種鏈路檢測(cè)方式在各種mode下都是可以使用的,但要注意不能同時(shí)使用。
bonding的mii檢測(cè)實(shí)現(xiàn)。首先和arp-monitor一樣,mii也是定時(shí)器觸發(fā)
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函數(shù)其本質(zhì)的原理就是檢測(cè)網(wǎng)卡的鏈路狀態(tài),bonding定義網(wǎng)卡有4個(gè)鏈路狀態(tài):BOND_LINK_UP:
正常狀態(tài)(處于該狀態(tài)的網(wǎng)卡是是潛在的發(fā)送數(shù)據(jù)包的候選者)
BOND_LINK_FAIL:網(wǎng)卡出現(xiàn)故障,向狀態(tài)BOND_LINK_DOWN 切換中
BOND_LINK_DOWN:失效狀態(tài)
BOND_LINK_BACK:網(wǎng)卡恢復(fù),向狀態(tài)BOND_LINK_UP切換中
從上到下,表示了網(wǎng)卡鏈路從正常到失效再到恢復(fù)狀態(tài)。bond_mii_monitor函數(shù)就是依次檢查網(wǎng)卡的鏈路狀態(tài)是否處于這些狀態(tài),然后通過(guò)標(biāo)記 do_failover變量來(lái)說(shuō)明當(dāng)前是否需要切換slave網(wǎng)卡。代碼篇幅較大,但邏輯還是很清晰的,故此處不羅列了。
在BOND_MODE_ACTIVEBACKUP模式下,兩塊網(wǎng)卡其實(shí)有一塊是不工作的,被設(shè)置為IFF_NOARP的狀態(tài)。同時(shí),bond虛設(shè)備,還有 slave設(shè)備的MAC地址均一致,所以這張網(wǎng)卡不會(huì)被外界察覺(jué)存在。交換機(jī)也不存在想該端口發(fā)包的情況。當(dāng)bond的mii檢測(cè)發(fā)現(xiàn)當(dāng)前的active 設(shè)備失效了之后,會(huì)切換到這個(gè)備份設(shè)備上。
在bond_change_active_slave函數(shù)中
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);
}
}
這個(gè)就是在BOND_MODE_ACTIVEBACKUP模式下的切換邏輯,很簡(jiǎn)單,需要注意的是,在 bond_set_slave_inactive_flags(old_active)中,需要將接口的狀態(tài)設(shè)置為IFF_NOARP,不然交換機(jī)就可能 會(huì)把數(shù)據(jù)包發(fā)送到一個(gè)錯(cuò)誤的端口上。