一、什么是Bond?
Bond
技术,也被称为网卡绑定或网卡捆绑,是将两个或更多的物理网卡绑定成一个虚拟的网卡(Bond
)。通过这一技术,多块网卡对外呈现为一个单独的以太网接口设备,并具有相同的IP
地址。Bond
技术主要用于解决网卡单点故障或网卡负载较高的场景,旨在提高服务的可靠性和网络带宽。
二、查看LINUX内核是否支持Bond
在LINUX
中,Kernels 2.4.12
及以后的版本均供bonding
模块,可以这样查看:
[root@shad0w-top ~]# cat /boot/config-3.10.0-1127.el7.x86_64 | grep -i bonding
CONFIG_BONDING=m
[root@localhost ~]#
三、Bond技术原理
3.1虚拟网卡创建
通过Bond
技术,多块物理网卡被虚拟成一张网卡。对于多物理网卡的Bond
网卡,其中一块物理网卡会被设置为Master
(主设备),其他网卡则为Slave
(从设备)。Bond
网卡的MAC
地址通常取自Master
物理网卡,并复制到其他物理网卡上。
3.2Bond的工作模式
bond
的模式常用的有两种:
#1) mode=0
表示负载分担round-robin,并且是轮询的方式比如第一个包走eth0,第二个包走eth1,直到数据包发送完毕。
优点:流量提高一倍
缺点:需要接入交换机做端口聚合,否则可能无法使用
#2) mode=1
表示主备模式,即active-backup,在此模式下,只有主网卡工作,备份网卡处于待机状态。当主网卡失效时,备份网卡将接管数据传输,确保服务的连续性。
优点:冗余性高
缺点:链路利用率低,两块网卡只有1块在工作
bond
其他模式:
#1) mode=2
Balance-xor(平衡策略),它基于HASH算法的负载均衡模式,网卡的分流按照xmit_hash_policy的TCP协议层设置来进行HASH计算分流,使得各种不同处理来源的访问都尽量在同一个网卡上进行处理。
Balance-xor模式通常与交换机的聚合强制不协商方式配合。如果网卡连接到交换机,交换机对应的端口可能需要采取聚合方式。
#2) mode=3
broadcast,即广播模式式。所有数据包从所有网络接口发出,该模式只有冗余能力,过于浪费资源。
#3) mode=4
IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad动态链接聚合)
特点:创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。
外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应性。
必要条件:
条件1:ethtool支持获取每个slave的速率和双工设定
条件2:switch(交换机)支持IEEE 802.3ad Dynamic link aggregation
条件3:大多数switch(交换机)需要经过特定配置才能支持802.3ad模式
#4) mode=5
Adaptive transmit load balancing(适配器传输负载均衡)
特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
该模式的必要条件:ethtool支持获取每个slave的速率
#5) mode=6
即:(balance-alb) Adaptive load balancing(适配器适应性负载均衡)
特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
注:以上模式使用小结:
mode5和mode6不需要交换机端的设置,网卡能自动聚合。
mode4需要支持802.3ad。
mode0,mode2和mode3理论上需要静态聚合方式。
四、配置举例
4.1禁用NetworkManager
[root@shad0w-top ~]# systemctl stop NetworkManager
[root@shad0w-top ~]# systemctl disable NetworkManager
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
Removed symlink /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service.
[root@shad0w-top ~]#
4.2查看当前网卡信息
[root@shad0w-top ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond1 state UP qlen 1000
link/ether 20:04:0f:f8:38:08 brd ff:ff:ff:ff:ff:ff
3: em2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond1 state UP qlen 1000
link/ether 20:04:0f:f8:38:08 brd ff:ff:ff:ff:ff:ff
4: em3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond2 state UP qlen 1000
link/ether 20:04:0f:f8:38:0a brd ff:ff:ff:ff:ff:ff
5: em4: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond2 state UP qlen 1000
link/ether 20:04:0f:f8:38:0a brd ff:ff:ff:ff:ff:ff
以em1
和em2
为例,插上网线,网卡端口处于up
状态。
4.3创建Bond配置文件
[root@shad0w-top ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond1
TYPE=Bond
BOOTPROTO=static
DEVICE=bond1
NAME=em1
ONBOOT=yes
IPADDR=192.168.250.11
NETMASK=255.255.255.0
GATEWAY=192.168.250.1
BONDING_OPTS="mode=4 miimon=100"
4.4修改两个聚合网卡的配置文件
# em1:
[root@shad0w-top ~]# vim /etc/sysconfig/network-scripts/ifcfg-em1
DEVICE=em1
NAME=em1
BOOTPROTO=none
ONBOOT=yes
SLAVE=yes
MASTER=bond1
# em2:
[root@shad0w-top ~]# vim /etc/sysconfig/network-scripts/ifcfg-em2
DEVICE=em2
NAME=em2
BOOTPROTO=none
ONBOOT=yes
SLAVE=yes
MASTER=bond1
4.5重启服务
[root@shad0w-top ~]# systemctl restart network
[root@shad0w-top ~]#