什么是bond?
所謂bond,是一種通過把多個物理網卡綁定成一個邏輯網卡實現網卡冗余、負載均衡、提高帶寬,從而實現網絡性能高可用高可靠的技術。
bond有七種模型:
mod0:(balance-rr,平衡輪循環策略,提供負載均衡和容錯能力),數據包傳輸是依次傳輸,第一個包從網卡1傳輸,第二個包從網卡2傳輸,第三個包從網卡3.......,一直循環直到傳輸完最后一個數據包。這種模式的bond有一個不完善的地方,如果一個數據包從不同的網卡傳輸,而中途再經過不同的鏈路,當客戶端接受到數據包的時候,數據包就可能出現無序到達的情況,而無序到達的數據包需要重新發送,這樣網絡的性能便會大大下降。
mod1:(active-backup,主備策略,提供冗余能力),只有一個網卡被使用,當一個網卡宕了之后,馬上由備網卡接替主網卡的工作,為了避免交換機發生混亂,邏輯網卡的mac地址是唯一的。這種模型的bond可提高網絡的可用性,但是它的資源利用率低,只有1/網卡個數(N)。
mod2:(balance-xor,平衡策略,提供負載均衡和容錯能力)---不是很明白實現原理與算法,有哪位大神知道的話,可以在下面留言,讓小弟也開開眼界。
mod3:(broadcast,廣播策略,提供容錯能力)每一個備網卡傳輸每個數據包。
mod4:(802.3ad,動態鏈路聚合),創建聚合組,聚合組中的每個備網卡共享同樣的速率和雙工,必要條件是交換機需要支持802.3ad以及需要ethtool的支持
mod5:(balance-tlb,適配器傳輸負載均衡),在每個網卡上根據當前的壓力負載分配流量,如果正在工作的網卡宕了,另外的網卡接管宕機的網卡的mac地址。必要條件是:需要ethtool的支持。
mod6:(balance-alb,適配器適應負載均衡),該模式包含了balance-tlb模式,同時加上針對IPV4流量的接收負載均衡(receive load balance, rlb),而且不需要任何switch(交換機)的支持。接收負載均衡是通過ARP協商實現的。bonding驅動截獲本機發送的ARP應答,並把源硬件地址改寫為bond中某個slave的唯一硬件地址,從而使得不同的對端使用不同的硬件地址進行通信。
實驗(mod0為例,其他mod大同小異)
創建邏輯網卡的配置文件
[root@bond network-scripts]# catifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.31.100
NETMASK=255.255.255.0
NETWORK=192.168.31.0
GATEWAY=192.168.31.1
BROADCAST=192.168.31.255
BONDING_OPTS="mode=0 miimon=200" #mode指定模式,miimon為探測的時間間隔(毫秒)
USERCTL=no #是否允許非root用戶控制該設備 yes|no
修改物理網卡的配置文件
[root@bond network-scripts]# catifcfg-eno16780032
DEVICE=eno16780032
BOOTPROTO=none
MASTER=bond0 #指定master為bond0
SLAVE=yes #是否為附屬
USERCTL=no
[root@bond network-scripts]# catifcfg-eno33561344
DEVICE=eno33561344
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
USERCTL=no
bond0是通過bonding的驅動來配置的,所以我們還需要為bond0這塊網卡添加驅動支持,將這個驅動添加到 /etc/modprobe.d/ 這個目錄下
[root@bond ~]# cat/etc/modprobe.d/bonding.conf
alias bond0 bonding
加載bonding模塊
[root@bond ~]# modprobe bonding
[root@bond ~]# lsmod |grep bonding
bonding 136705 0
重啟網絡
[root@bond ~]# systemctl restart network
Job for network.service failed because thecontrol process exited with error code. See "systemctl statusnetwork.service" and "journalctl -xe" for details.
bond network[10418]:Bringing up interface bond0: Error:Connection activation failed: No suitable device found for this connection.
bond network[10418]:Bringing up interface eno16780032: Error: Connection activation failed: Master device bond0 unmanaged ornot available for activation
如果發現有如上報錯,需要關閉NetworkManager。
參考(https://access.redhat.com/discussions/2162171)
[root@bond ~]# systemctl stopNetworkManager
[root@bond ~]# systemctl disabledNetworkManager
驗證 #仔細觀察發現物理網卡的mac地址和邏輯網卡的mac地址一樣
[root@bond ~]# ip add show
3: eno16780032: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP>mtu 1500 qdisc mq master bond0 state UP qlen1000
link/ether 00:0c:29:bc:7d:41 brdff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:febc:7d41/64 scopelink
valid_lft forever preferred_lft forever
4: eno33561344: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP>mtu 1500 qdisc mq master bond0 state UP qlen1000
link/ether 00:0c:29:bc:7d:41 brdff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:febc:7d41/64 scopelink
valid_lft forever preferred_lft forever
5: bond0:<BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 00:0c:29:bc:7d:41 brdff:ff:ff:ff:ff:ff
inet 192.168.31.100/24 brd 192.168.31.255 scope global bond0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:febc:7d41/64 scopelink tentative dadfailed
valid_lft forever preferred_lft forever
查看邏輯網口設備的信息
[root@bond ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1(April 27, 2011)
Bonding Mode: load balancing (round-robin) #模式為負載均衡
MII Status: up #狀態為up
MII Polling Interval (ms): 200 #偵測間隔為200ms
Up Delay (ms): 0 #啟動延遲為0ms
Down Delay (ms): 0 #關閉延遲為0ms
Slave Interface: eno16780032
MII Status: up #狀態up
Speed: 10000 Mbps #速率為10000
Duplex: full #全雙工
Link Failure Count: 0
Permanent HW addr: 00:0c:29:bc:7d:41
Slave queue ID: 0
Slave Interface: eno33561344
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:bc:7d:4b
Slave queue ID: 0
測試
冗余測試
模擬宕一個網口
[root@bond ~]# ifconfig eno16780032 down
ping正常
模擬宕另外一個網口
[root@bond ~]# ifconfig eno33561344 down
ping超時
網絡性能測試(通過netperf工具)
有關netperf的使用可以看看這篇文章:http://blog.itpub.net/22664653/viewspace-714569/
邏輯網口的兩個物理網卡正常工作之時
[root@bond ~]# netserver #在服務端運行netserver
[root@localhost ~]# netperf -H192.168.31.100 -l 60 -t TCP_STREAM #-H 指定測試端,-l 指定測試時長,-t 指定測試模型,這里是TCP的批量傳輸
MIGRATED TCP STREAM TEST from 0.0.0.0(0.0.0.0) port 0 AF_INET to 192.168.31.100 () port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 60.00 10151.01
模擬宕一個網卡
[root@bond ~]# ifconfig eno33561344 down
[root@localhost ~]# netperf -H192.168.31.100 -l 60 -t TCP_STREAM
MIGRATED TCP STREAM TEST from 0.0.0.0(0.0.0.0) port 0 AF_INET to 192.168.31.100 () port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 60.00 9509.36 #吞吐量降低
通過測試,做了bond之后,的確可以實現網口的冗余和網絡性能的提高