Ⅰ bonding後交換機怎麼配置
一、什麼是bonding 多塊網卡綁在一起,作為一個網卡用,實現負載均衡和提高帶寬,linux雙網卡綁定一個IP地址,實質工作就是使用兩塊網卡虛擬為一塊,使用同一個IP地址,是我們能夠得到更好的更快的服務。 二、配置過程 配置很簡單,一共四個步驟: 實驗的操作系統是Redhat Linux Enterprise 3.0 綁定的前提條件:晶元組型號相同,而且網卡應該具備自己獨立的BIOS晶元。 1.編輯虛擬網路介面配置文件,指定網卡IP 代碼如下: vi /etc/sysconfig/ network-scripts/ ifcfg-bond0 p[[emailprotected] root]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-bond0 將第一行改成 DEVICE=bond0 代碼如下: # cat ifcfg-bond0 pDEVICE=bond0 pBOOTPROTO=static pIPADDR=172.31.0.13 pNETMASK=255.255.252.0 pBROADCAST=172.31.3.254 pONBOOT=yes pTYPE=Ethernet 這里要主意,不要指定單個網卡的IP 地址、子網掩碼或網卡 ID。將上述信息指定到虛擬適配器(bonding)中即可。 代碼如下: [[emailprotected] network-scripts]# cat ifcfg-eth0 pDEVICE=eth0 pONBOOT=yes pBOOTPROTO=dhcp p[[emailprotected] network-scripts]# cat ifcfg-eth1 pDEVICE=eth0 pONBOOT=yes pBOOTPROTO=dhcp 3 # vi /etc/moles.conf 編輯 /etc/moles.conf 文件,加入如下一行內容,以使系統在啟動時載入bonding模塊,對外虛擬網路介面設備為 bond0 加入下列兩行 代碼如下: alias bond0 bonding poptions bond0 miimon=100 mode=1 說明:miimon是用來進行鏈路監測的。 比如:miimon=100,那麼系統每100ms監測一次鏈路連接狀態,如果有一條線路不通就轉入另一條線路;mode的值表示工作模式,他共有0,1,2,3四種模式,常用的為0,1兩種。 mode=0表示load balancing (round-robin)為負載均衡方式,兩塊網卡都工作。 mode=1表示fault-tolerance (active-backup)提供冗餘功能,工作方式是主備的工作方式,也就是說默認情況下只有一塊網卡工作,另一塊做備份. bonding只能提供鏈路監測,即從主機到交換機的鏈路是否接通。如果只是交換機對外的鏈路down掉了,而交換機本身並沒有故障,那麼bonding會認為鏈路沒有問題而繼續使用 4 # vi /etc/rc.d/rc.local 加入兩行 代碼如下: ifenslave bond0 eth0 eth1 proute add -net 172.31.3.254 netmask 255.255.255.0 bond0 到這時已經配置完畢重新啟動機器. 重啟會看見以下信息就表示配置成功了 ................ Bringing up interface bond0 OK Bringing up interface eth0 OK Bringing up interface eth1 OK Bonding的工作模式 Linux Bonding默認使用輪轉策略。 基本類別是主備模式與負載均衡兩種模式: balance-rr (mode=0) 輪轉(Round-robin)策略:從頭到尾順序的在每一個slave介面上面發送數據包。本模式提供負載均衡和容錯的能力。 active-backup(mode=1) 活動-備份(主備)策略:在綁定中,只有一個slave被激活。當且僅當活動的slave介面失敗時才會激活其他slave。為了避免交換機發生混亂此時綁定的MAC地址只有一個外部埠上可見。在bongding的2.6.2及其以後的版本中,主備模式下發生一次故障遷移時,bonding將在新激活的slave上會送一個或者多個gratuitous ARP.bonding的主salve介面上以及配置在介面上的所有VLAN介面都會發送gratuitous ARP,只要這些介面上配置了至少一個IP地址。VLAN介面上發送的的gratuitous ARP將會附上適當的VLAN id。本模式提供容錯能力,primary option,documented below會影響本模式的行為。 balance-xor(mode=2) XOR策略:基於所選擇的傳送hash策略。 本模式提供負載均衡和容錯的能力。 broadcast(mode=3) 廣播策略:在所有的slave介面上傳送所有的報文。本模式提供容錯能力。 802.3ad(mode=4) IEEE 802.3ad 動態鏈路聚合。創建共享相同的速率和雙工模式的聚合組。能根據802.3ad規范利用所有的slave來建立聚合鏈路。Salve的出站選擇取決於傳輸的hash策略,默認策略是簡單的XOR策略,而hash策略則可以通xmit_hash_policy選項加以改變。需要注意的是:不是所有的傳輸策略都與802.3ad兼容,尤其是802.3ad標準的43.2.4章節中關於 packet mis-ordering要求的地方。不同個體的實現往往出現很大的不兼容。 先決條件: 1. 每個slave的基本驅動支持Ehtool獲取速率和雙工狀態。 2.交換機支持IEEE 802.3ad動態鏈路聚合。大多數的交換機都需要使用某種配置方式來啟用802.3ad模式。 balance-tlb(mode=5) 自適應傳輸負載均衡:信道綁定不需要特殊的交換機支持。出口流量的分布取決於當前每個slave的負載(計算相對速度)。進口流量從當前的slave的接收。如果接收salve出錯,其他的slave接管失敗的slave的MAC地址繼續接收。 先決條件: 每個slave的基本驅動支持Ehtool獲取速率狀態。 balance-alb(mode=6) 自適應負載均衡:包括balance-tlb(模式5)以及用於IPV4流量的接收負載均衡,並且不需要特殊的交換機支持。接收負載均衡通過ARP協商實現。bonding的驅動攔截本機發出的ARP Replies(ARP回應報文),並且用bond的某一個slave的硬體地址改寫ARP報文的源地址,使得本伺服器對不同的設備使用不同的硬體地址。本伺服器建立的連接的接收流量也是負載均衡的。當本機發送ARP Request時,bonding驅動通過ARP報文復制並保存節點的IP信息。當從其他節點接收到ARP Reply,bonding驅動獲取節點的硬體地址並且會回應一個包含綁定好的slave的硬體地址的ARP Reply給發送的節點。用ARP協商的負載均衡的有一個問題是每次用bond的硬體地址廣播ARP報文,那麼其他節點發送的數據全部集中在一個slave上,處理ARP更新給其他所有節點的時候,每個節點會重新學習硬體地址,導致流量重新分配。當新加入一個slave或者一個非激活的slave重新激活的時候也會導致接收流量重新分配。接收流量負載是串列(輪轉)的分配在bond的一組速率最高的slave上。
Ⅱ 多網卡同IP和同網卡多IP技術
將多個網卡埠綁定為一個,可以提升網路的性能。在linux系統上有兩種技術可以實現,Linux 網路組和bond,通過綁定多個網卡作為一個邏輯網口並配置單個的IP地址,大幅提升伺服器的網路吞吐。
目前發布各個Linux版本內核均已包含了此模塊,大多數情況下不需要重新編譯內核。 Linux 的 bonding 驅動提供了綁定/集成(bond)多個網卡為一個虛擬邏輯網口的功能。 一般來說綁定的網口(bonded)有多種工作模式,主要有熱後備(hot standby) 和 負載均衡(load balancing).
1.創建bond0配置文件
vi /etc/sysconfig/network-scripts/ifcfg-bond0 添加配置參數
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes(設置從屬關系)
BOOTPROTO=none
HWADDR=00:15:17:CC:FC:35
eth1的配置文件與之相同,只是device的值改為eth1即可。
編輯/etc/modprobe.conf或者/etc/moles.conf文件,加入如下內容,使系統啟動時載入bonding模塊驅動
alias bond0 bonding
option bond0 miimon=100 mode=1
說明:
1).miimon=100 用來進行鏈路監測的。即每100ms監測一次鏈路狀態。bonding只監測主機與交換機之間鏈路。如果交換機出去的鏈路出問題而本身沒有問題,那麼bonding認為鏈路沒有問題而繼續使用。
2).mode=1 表示提供冗餘功能。除此之外還可以為0、2、3,共四種模式。0表示負載均衡
ifenslave bond0 eth0 eth1
route add -net 192.168.1.254 netmask 255.255.255.0 bond0 #如有需要才加該路由
首先執行命令裝載bonding模塊:modprobe bonding
重啟網路服務,並確認bond0正確啟動:service network restart
確認設備已經正確載入:less /proc/net/bonding/bond0
至此,bond 的設置就基本結束了
刪除bond
ifconfig bond0 down
rmmod bonding
網路組:是將多個網卡聚合在一起方法,從而實現冗錯和提高吞吐量,網路組不同於舊版中bonding 技術,能提供更好的性能和擴展性,網路組由內核驅動和teamd 守護進程實現.
nmcli connection add type team con-name TEAMname ifname INTname [config JSON]
TEAMname 指定連接名,INname指定介面名,JSON指定runner方式,格式為:'{"runner":{"name":"METHOD"}}'
METHOD 可以是broadcast、roundrobin、activebackup、loadbalance、lacp
(1)創建網路介面組team0
[root@centos7 ~]# nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"loadbalance"}}'
Connection 'team0' (e70483a1-2688-4eb2-9466-8e732360291d) successfully added.
(2)給網路組team0配置IP地址
[root@centos7 ~]# nmcli connection modify team0 ipv4.method manual ipv4.addresses 200.200.200.200/24 gw4 200.200.200.1
既就是生成組TEAM組成員的配置文件,這個配置文件和網卡配置文件是相互獨立的。
nmcli connection add type team-slave con-name SLAVEname ifname INname master TEAMname
SLAVEname 指定連接名,INTname指定網路介面名(相當於指定要加入網路組的網卡名),TEAMnmae指定所屬網路組。
若連接名不指定,默認為team-slave-IFACE
創建介面組
這里使用ens34、ens38兩塊網卡
[root@centos7 ~]# nmcli connection add con-name team0-ens34 type team-slave ifname ens34 master team0
[root@centos7 ~]# nmcli connection add con-name team0-ens38 type team-slave ifname ens38 master team0
啟用網路組:nmcli connection up team0
啟用組成員:nmcli connection up SLAVEname
[root@centos7 ~]# nmcli connection up team0
[root@centos7 ~]# nmcli connection up team0-ens34
[root@centos7 ~]# nmcli connection up team0-ens38
teamdctl TEAMname state
[root@centos7 ~]# teamdctl team0 state
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
ens38
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
(1)MASTER配置文件
[root@centos7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-team0
(2)組成員(SLAVE)配置文件
[root@centos7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-team0-ens34
(1)斷開連接
[root@centos7 ~]# nmcli connection down team0
再次查看狀態
[root@centos7 ~]# teamdctl team0 state
[root@centos7 ~]# nmcli connection show
可以看到已經關閉成功
(2)刪除TEAM組成員
[root@centos7 ~]# nmcli connection delete team0-ens34
[root@centos7 ~]# nmcli connection delete team0-ens38
(3)刪除TEAM組
[root@centos7 ~]# nmcli connection delete team0
不同的工作環境通常IP地址以及相關網路屬性通常是不一樣的.如果我們每次都是手動去修改,那將是非常繁瑣的.所以我們去修改一些網路配置讓網卡去自適應工作環境.在linux系統上配置同一個網卡擁有多個IP的技術也就是為網卡添加多個子網卡,如eth0:0、eth1:1這種網路介面,LINUX最多可以支持255個IP子網卡。
在linux系統上有兩種方式添加子網卡。一種是使用網路配置命令,這種方式會立即生效,但不會永久生效,如果重啟則會立即丟失。如果想要永久生效則是另一種方式去修改網路配置文件。配置子網卡命令前要卸載或者禁用NetworkManager服務,因為和NetworkManager有沖突。
使用ifconfig命令管理子網卡:
ifconfig device[label] [address] [up|down]
ifconfig eth0:0 192.168.1.100/24 up(添加並啟用eth0:0子網卡)
ifconfig eth0:0 down(禁用eth0:0子網卡)
使用ip命令管理子網卡:
ip addr add [address] device [label]
ip addr add 172.16.1.2/16 dev eth0(為eth0網卡添加一個IP)
ip addr add 172.16.1.1/16 dev eth0 label eth0:0(為eth0網卡添加一個IP並且指定label)
ip addr del 172.16.1.1/16 dev eth0 label eth0:0(刪除eth0上172.16.1.1/16這條IP)
ip addr flush dev eth0 label eth0:0(刷新)
把相關配置寫入文件
將上邊的命令ifconfig加入到rc.local中去(永久生效)
所有網卡的配置文件都保存在/etc/sysconfig/network-scripts目錄中,一個網卡對應一個配置文件
手工添加IP地址的
以下是網卡配置文件的部分信息說明,其他類似信息默認即可:
配置完成重啟網卡即可:service network restart
Ⅲ Linux系統下多網卡綁定操作方法
在Linux系統中,通常會將多個網卡綁定為一個邏輯網卡,這樣可以提高網路的穩定性,那麼要如何將多個網路綁定為一個呢?下面小編就給大家介紹下Linux下多網卡綁定的bond模式原理。
將多個Linux網路埠綁定為一個,可以提升網路的性能,比如對於備份伺服器,需要在一個晚上備份幾個T的數據,如果使用單個的千兆網口將會是很嚴
重的瓶頸。其它的應用,比如ftp伺服器,高負載的下載網站,
都有類似的問題。因此使用Linux
teaming或bond來綁定多個網卡作為一個邏輯網口,配置單個的IP地址,會大幅提升伺服器的網路吞吐(I/O)。
Linux的多網卡綁定功能使用的是內核中的“bonding”模塊,關於此模塊可以參考Linux
Ethernet
Bonding
Driver文檔,
但是目前發布各個Linux版本內核均已包含了此模塊,大多數情況下不需要重新編譯內核。
Linux
的
bonding
驅動提供了綁定/集成(bond)多個網卡為一個虛擬邏輯網口的功能。並請注意綁定的網口(bonded)有多種工作模式;
一般來說,分為
熱後備(hot
standby)
和
負載均衡(load
balancing)。
在Redhat/Fedora和其它類Redhat
Linux中是比較容易配置的。
1.創建bond0配置文件
vi
/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
--物理設備名字
IPADDR=192.168.1.2
--IP地址
NETMASK=255.255.255.0
--子網掩碼
GATEWAY=192.168.1.1
--網關
DNS=8.8.8.8
--DNS
ONBOOT=yes
--隨機啟動
NAME=bond0
BOOTPROTO=none
USERCTL=no
--是否允許非root用戶控制該設備
2.修改被綁定的eth0和eth1的配置文件
vi
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=“eth0”
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
HWADDR=00:15:17:CC:FC:35
eth1的配置文件與之相同,只是device的值改為eth1即可。
3.裝在bond模塊驅動
編輯/etc/modprobe.conf或者/etc/moles.conf文件,加入如下內容,使系統啟動時載入bonding模塊驅動
alias
bond0
bonding
option
bond0
miimon=100
mode=1
說明:
1).miimon=100
用來進行鏈路監測的。即每100ms監測一次鏈路狀態。bonding只監測主機與交換機之間鏈路。如果交換機出去的鏈路出問題而本身沒有問題,那麼bonding認為鏈路沒有問題而繼續使用。
2).mode=1
表示提供冗餘功能。除此之外還可以為0、2、3,共四種模式。0表示負載均衡
4.在/etc/rc.d/rc.local文件中加入如下語句,使得系統啟動自動運行
ifenslave
bond0
eth0
eth1
route
add
-net
192.168.1.254
netmask
255.255.255.0
bond0
#如有需要才加該路由
5.檢測、驗證配置
首先執行命令裝載bonding模塊:modprobe
bonding
重啟網路服務,並確認bond0正確啟動:service
network
restart
確認設備已經正確載入:less
/proc/net/bonding/bond0
列出所有網口:ifconfig
上面就是Linux下多網卡綁定bond模式原理的介紹了,bond模式原來一般有7種,這里只介紹了其中的一種,希望對你有所幫助。
Ⅳ linux如何配置bond
1、編輯虛擬網路介面配置文件,指定網卡IP:
#
vi
/etc/sysconfig/network-scripts/ifcfg-bond0
或者下面命令
#
cp
/etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-bond02、#vi
ifcfg-bond0
將第一行改成
DEVICE=bond0:
#
cat
ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.61.72
NETMASK=255.255.255.240
#BROADCAST=192.168.61.79
#GATEWAY=192.168.61.77
這里要注意,不要指定單個網卡的IP
地址、子網掩碼或網卡
ID。將上述信息指定到虛擬適配器(bonding)中即可。
#
cat
ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:15:17:CC:FC:35
MASTER=bond0
SLAVE=yes
#
cat
ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:15:17:CC:FC:34
MASTER=bond0
SLAVE=yes3、
#
vi
/etc/moles.conf
編輯
/etc/modprobe.conf或者/etc/moles.conf文件,加入如下兩行內容,以使系統在啟動時載入bonding模塊,對外虛擬網路介面設備為
bond0.加入下列兩行:
alias
bond0
bonding
options
bond0
miimon=100
mode=1
說明:miimon是用來進行鏈路監測的。
比如:miimon=100,那麼系統每100ms監測一次路連接狀態,如果有一條線路不通就轉入另一條線路;mode的值表示工作模式,他共有0,1,2,3四種模式,常用的為0,1兩種。
mode=0表示load
balancing
(round-robin)為負載均衡方式,兩塊網卡都工作。
mode=1表示fault-tolerance
(active-backup)提供冗餘功能,工作方式是主備的工作方式,也就是說默認情況下只有一塊網卡作,另一塊做備份.
bonding只能提供鏈路監測,即從主機到交換機的鏈路是否接通。如果只是交換機對外的鏈路down掉了,而交換機本身並沒有故障,那麼bonding會認為鏈路沒有問題而繼續使用4、
#
vi
/etc/rc.d/rc.local
加入兩行,加在啟動自運行文件裡面ifenslave
bond0
eth0
eth1
route
add
-net
172.31.3.254
netmask
255.255.255.0
bond0
#如果需要的話加路由,不需要不用加到這時已經配置完畢重新啟動機器.
重啟會看見以下信息就表示配置成功了Bringing
up
interface
bond0
OK
Bringing
up
interface
eth0
OK
Bringing
up
interface
eth1
OK
Ⅳ linux bonding 怎麼做到fast failover (技術)
Linux網卡bonding
隨著科學技術的日益革新,數據的安全性已經逐漸體現出了它的重要意義。可以設想,當一個人所有的個人資料都不負存在,那是多麼可怕的事情。網路技術的深入使用,數據的網路化傳輸已經成為了重要,甚至主要的傳輸方式。所以數據伺服器能夠正常提供網路服務是所有供應商都需要考慮的問題。
在這個背景下,單網卡的應用已經捉襟見肘,設備冗餘技術的普及已是枝繁葉茂。本文之後就引用Linux操作系統下的多網卡bonding技術來闡述這一容錯概念。
負載均衡功能也是網卡bonding的另一個功能,它可以實現多網卡同時工作,提高系統網路處理的吞吐能力。
一、網卡的負載均衡模式(mode = BOND_MODE_ROUNDROBIN)
1)建立bond虛設備
建立一個ifcfg-bond0的設備,然後配置如下信息即可。
DEVICE=bond0
BOOTPROTO=static
IPADDR=172.16.64.208
NETMASK=255.255.224.0
ONBOOT=yes
TYPE=Ethernet
2)配置介面文件
由於使用一個虛擬的ip地址,所以,其他介面設備都不配置ip信息。
3)配置bonding工作方式
打開/etc/modprobe.conf文件,將bonding的工作模式配置為如下模式。
alias bond0 bonding
options bond0 mode=0 arp_interval=500 arp_ip_target=172.16.64.86
4)啟動bonding
需要添加路由來制定發送規則,這個可以自定義添加。配置完後重啟設備即可。
ifenslave bond0 eth0 eth1
route add -net 0/0 gw 172.16.64.254
bond0 Link encap:Ethernet HWaddr 00:14:10:70:00:25
inet addr:172.16.64.208 Bcast:172.16.95.255 Mask:255.255.224.0
inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:39335 errors:0 dropped:0 overruns:0 frame:0
TX packets:3178 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3020656 (2.8 MiB) TX bytes:269722 (263.4 KiB)
eth0 Link encap:Ethernet HWaddr 00:14:10:70:00:25
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:18208 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1371589 (1.3 MiB) TX bytes:378 (378.0 b)
eth1 Link encap:Ethernet HWaddr 00:14:10:70:00:25
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:21128 errors:0 dropped:0 overruns:0 frame:0
TX packets:3174 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1649127 (1.5 MiB) TX bytes:269498 (263.1 KiB)
如上圖所示,這種模式下bonding模塊會將虛介面和所有的slave介面的MAC地址設置為一致。通過定時器,每個slave介面不斷發送ARP包來不斷更換交換機埠與MAC的對應關系。
這樣使得每個網卡都在進行工作。這個ARP的發送規則是:
每arp_interval(MS)間隔向arp_ip_target發送arp請求。也可以向多個arp_ip_target發送arp請求。
觀察交換機埠上所學習到的MAC地址,發現MAC會在兩個埠上反復切換。
在BOND_MODE_ROUNDROBIN模式下,bonding對於發送和接收數據的處理邏輯是不一致的,對於數據的接收,bonding基本不做任何處理,純粹依靠交換機埠與MAC的變化來實現交替接收數據。發送的話,交換機會根據數據的源MAC來學習埠和MAC之間的關系,所以bonding做到的就是選擇不一樣的網卡發送。
對於數據的發送,
static inline void bond_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(struct sk_buff *skb, struct net_device *bond_dev)
{
read_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模式。
測試過程中發現接收端會有較多的亂序包,觀察交換機埠情況,埠之間的切換頻率不規則,這個和交換機的配置或者性能應該有很大聯系,有必要的話需要進一步研究。數據的正確性和時序性能否保證需要進一步仔細測試。
2、網卡的容錯模式(mode = BOND_MODE_ACTIVEBACKUP)
容錯模式的配置方法和負載均衡模式基本差不多,只不過修改一下/etc/modprobe.conf即可。
alias bond0 bonding
options bond0 mode=1 miimon=100
這里使用的是mii鏈路檢測方式,與之前arp檢測方式不同。當然這兩種鏈路檢測方式在各種mode下都是可以使用的,但要注意不能同時使用。
介紹一下bonding的mii檢測實現。首先和arp-monitor一樣,mii也是定時器觸發
if (bond->params.miimon) { /* link check interval, 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設備切換的過程。
3、網卡虛擬化方式(mode = BOND_MODE_ALB)
經過考察,許多磁碟陣列設備採用了網卡虛擬化方式進行多網卡應用。實際就是Linux的bonding技術。它採用了mode = BOND_MODE_ALB的方式。
BOND_MODE_ALB的實現方式比較復雜,還有一些不理解的地方,就不做深入分析了。其核心思想可以用下圖解釋:
從這個圖中可以看到,客戶端A與伺服器的傳輸使用的是MAC A;而客戶端B與伺服器傳輸使用的是MAC B,但對於IP層來說,客戶端A與B都與伺服器X.X.X.X 的IP地址進行通訊,並不感知底層傳輸介面的變化。這樣,伺服器對於客戶端整體上的工作模式就處於負載均衡的狀態。當然,這個過程的控制就是bonding模塊所完成的。
通過測試發現兩台客戶端展現的arp表是一致的,如下(伺服器端地址為172.16.64.208,伺服器端首選介面的MAC為00-14-10-70-00-25)
CLIENT A
172.16.64.208 00-14-10-70-00-25 dynamic
CLIENT B
172.16.64.208 00-14-10-70-00-25 dynamic
通過抓包可以看到,兩次回復的ARP應答的源MAC地址是不一樣的,分別為
00-14-10-70-00-25和
00-14-10-70-00-26。
所以說,能夠實現這種處理方法的原因就是bonding修改了ARP應答的源地址導致,使得外界並不感知伺服器存在多網卡的狀態,在網路上確定了IP和MAC的唯一對應關系,保證了上層業務傳輸的邏輯一致性。同時內部的處理又交給不同的網卡,實現了負載均衡。
另外,也給了我們一定的容錯性,當一個介面失效後,bonding會迅速將另外一塊網卡設置為首選slave設備,並修改其MAC地址。由於外界學習到的伺服器MAC地址始終是不變的,所以鏈路的狀態不會受很大影響。
Bonding的模式一共有7種:
#define BOND_MODE_ROUNDROBIN 0
#define BOND_MODE_ACTIVEBACKUP 1
#define BOND_MODE_XOR 2
#define BOND_MODE_BROADCAST 3
#define BOND_MODE_8023AD 4
#define BOND_MODE_TLB 5
#define BOND_MODE_ALB 6
每種方式都有它的特點,有些需要交換機支持,比如 BOND_MODE_8023AD和BOND_MODE_XOR。本文就介紹了3種方式,可以在無需交換機支持或者簡單配置交換機的情況下運行。