CentOS网卡制作bond

什么是网卡 bond

网卡绑定,也称作网卡捆绑。就是将两个或者更多的物理网卡绑定成一个虚拟网卡,使其共用一个IP地址。主要用以提供负载均衡或者冗余增加网络带宽;保证当一个网卡坏掉时,不会影响业务。更多使用的是其冗余模式,此时需要注意绑定的网卡需要和不同的交换机连接,提高可靠性。

Kernels 2.4.12 及以后的版本都自带 bonding 模块,可以通过以下命令确定系统内核是否支持 bonding ,这里我以 Vmware 环境中搭建的 CentOS 7.6 为例:

1
2
3
4
5
[root@localhost network-scripts]# cat /etc/redhat-release   # 查看系统版本
CentOS Linux release 7.6.1810 (Core)

[root@localhost network-scripts]# cat /boot/config-3.10.0-957.el7.x86_64 | grep -i bonding
CONFIG_BONDING=m # m即代表支持

网卡 bond 的7种模式

目前网卡绑定共有七种模式(0~6):bond 0、bond 1、bond 2、bond 3、bond 4、bond 5、bond 7。

  1. mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略)
    • 特点:传输数据包顺序是依次传输,即第1个包走eth0,下一个包就走eth1直到最后一个传输完毕;此模式提供负载平衡和容错能力。
    • 缺点:因为数据包从不同的接口发出,客户端很有可能会出现数据包无序到达的问题导致重新发送,降低网络的吞吐量。
  2. mod=1,即: (active-backup) Active-backup policy(主-备份策略)
    • 特点:同一时间只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。提供了容错能力;bond的MAC地址是唯一的,以避免switch(交换机)发生混乱;
    • 缺点:资源利用率较低,在有 N 个网络接口的情况下,资源利用率为1/N。
  3. mod=2,即:(balance-xor) XOR policy(平衡策略)
    • 特点:基于指定的传输 HASH 策略传输数据包,提供负载平衡和容错能力
    • 策略:(源MAC地址 XOR 目标MAC地址) % slave数量,可通过xmit_hash_policy选项指定传输策略。
  4. mod=3,即:broadcast(广播策略)
    • 特点:在所有的网络接口上传输每个数据包,提供了容错能力。
    • 注意:此模式适用于金融等其他对网络可靠性要求较高的场景。
  5. mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 动态链接聚合)
    • 特点:创建一个聚合组,它们共享同样的速率和双工设定。外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。
    • 条件:
      • ethtool支持获取每个slave的速率和双工设定
      • switch(交换机)支持IEEE 802.3ad Dynamic link aggregation 协议
      • 需要对端 switch 做端口聚合配置
  6. mod=5,即:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡)
    • 特点:不需要任何特别的switch(交换机)支持的通道bonding,动态的根据当前负载分配外出流量,如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。并行发送,无法并行接收。
    • 条件:ethtool支持获取每个slave的速率
  7. mod=6,即:(balance-alb) Adaptive load balancing(适配器适应性负载均衡)
    • 特点:mod 5 的基础上增加了对IPV4流量的接收负载均衡(receive load balance, 简称rlb),而且不需要任何switch(交换机)的支持。可并行发送,并行接收数据包。
    • 条件:
      • ethtool支持获取每个slave的速率;
      • 底层驱动支持设置设备的硬件地址,保证每个bond 中的 slave 都有一个唯一的硬件地址。

配置 bond

如下所示,我电脑目前有三张网卡,现需要将网卡 ens37、ens38 绑定为虚拟网卡 bond 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:eb:f3:37 brd ff:ff:ff:ff:ff:ff
inet 192.168.60.132/24 brd 192.168.60.255 scope global noprefixroute dynamic ens33
valid_lft 1439sec preferred_lft 1439sec
inet6 fe80::fa69:4c61:ecd5:d707/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:eb:f3:41 brd ff:ff:ff:ff:ff:ff
inet 192.168.60.139/24 brd 192.168.60.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::e12c:2edf:a904:4721/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:eb:f3:4b brd ff:ff:ff:ff:ff:ff
inet 192.168.60.140/24 brd 192.168.60.255 scope global noprefixroute ens38
valid_lft forever preferred_lft forever
inet6 fe80::8ee5:2f0a:20c:9cd/64 scope link noprefixroute
valid_lft forever preferred_lft forever

关闭 NetworkManager 服务

生产环境下 我们一般都是手动配置网络,以静态地址为主不需要系统的网络管理工具,因此我们就会将它禁用掉,命令如下:

  • network 服务主要管理网卡的配置
  • NetworkManager 用于管理系统网络连接、允许用户管理网络连接的客户端程序
1
2
[root@localhost ~]# systemctl stop NetworkManager       # 临时关闭,开机后恢复
[root@localhost ~]# systemctl disable NetworkManager # 永久关闭,慎用

载入 bond 模块

1
2
3
[root@localhost ~]# modprobe bonding            # 加载bong 模块
[root@localhost ~]# lsmod | grep bonding # 确认模块是否加载成功
bonding 152656 0

修改网卡配置文件

为需要制作bond的网卡添加MASTER、SLAVE配置项,删除其他多余配置信息。
注:操作前不要忘记为虚拟机打快照或备份原有网卡文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp -a ifcfg-ens37 ifcfg-ens37.bak # -a 参数为保留原文件属性的前提下复制文件
[root@localhost network-scripts]# cp -a ifcfg-ens38 ifcfg-ens38.bak
[root@localhost network-scripts]# vi ifcfg-ens37
TYPE="Ethernet"
BOOTPROTO="static"
DEVICE="ens37"
ONBOOT="yes"
SLAVE="yes" # 增加该项
MASTER="bond0" # 增加该项
[root@localhost network-scripts]# vi ifcfg-ens38
TYPE="Ethernet"
BOOTPROTO="static"
DEVICE="ens38"
ONBOOT="yes"
SLAVE="yes" # 增加该项
MASTER="bond0" # 增加该项

新建 bond 配置文件

/etc/sysconfig/network-scripts/ 目录下新建 bond 配置文件,设置 bond 网卡的IP地址

1
2
3
4
5
6
7
8
[root@localhost network-scripts]# vi ifcfg-bond0
DEVICE="bond0"
BOOTPROTO="static"
ONBOOT="yes"
TYPE="bond"
IPADDR="192.168.60.139"
GATEWAY="192.168.60.2"
NETMASK="255.255.255.0"

修改 modprobe.d 下的 bonding 文件

若在 /etc/modprobe.d/ 目录下没有 bonding.conf 文件,需要手动新建,输入以下内容:

1
2
3
[root@localhost network-scripts]# vi /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bond0 miimon=100 mode=1 # mode=1 表示网卡bond模式为1;miimon=100代表网络链路检测频率100ms检查一次,如果出现问题则切换到备用网卡。

重启网络使配置生效

此时可以看到网卡 ens37、ens38 上 master 为 bond 0,表示配置成功。注意做了bonding的这两块网卡是使用同一个MAC地址,避免对端交换机发生混乱。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:eb:f3:37 brd ff:ff:ff:ff:ff:ff
inet 192.168.60.142/24 brd 192.168.60.255 scope global dynamic ens33
valid_lft 1622sec preferred_lft 1622sec
inet6 fe80::20c:29ff:feeb:f337/64 scope link
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 00:0c:29:eb:f3:41 brd ff:ff:ff:ff:ff:ff
4: ens38: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 00:0c:29:eb:f3:41 brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:eb:f3:41 brd ff:ff:ff:ff:ff:ff
inet 192.168.60.139/24 brd 192.168.60.255 scope global bond0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:feeb:f341/64 scope link
valid_lft forever preferred_lft forever

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup) # bonding模式是主备
Primary Slave: None
Currently Active Slave: ens37 # 目前使用的网卡
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens37
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:eb:f3:41
Slave queue ID: 0

Slave Interface: ens38
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:eb:f3:4b
Slave queue ID: 0

测试bond

因为上述配置 mode=1 主备模式,可以在ping百度过程中然后断开一个网卡,此时ping不会中断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost modprobe.d]# ping www.baidu.com
PING www.a.shifen.com (39.156.66.18) 56(84) bytes of data.
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=1 ttl=128 time=46.7 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=2 ttl=128 time=56.0 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=3 ttl=128 time=35.4 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=4 ttl=128 time=69.9 ms
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=5 ttl=128 time=115 ms
^C
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4026ms
rtt min/avg/max/mdev = 35.406/64.817/115.845/27.920 ms
[root@localhost modprobe.d]# ifdown ens37 # 关掉ens37网卡
[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: ens38 # 主网卡已经切换为ens38
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Q&A

VMware环境测试不适配问题

问题描述: linux网卡bonging的备份模式在vmware workstation虚拟中做就会出现错误,导致 bond 0 启动后无备份模式的效果。当使用ifdown eth0后,网络出现不通现象。

原因分析:bond0获取mac地址有两种方式:①从第一个活跃网卡中获取mac地址,然后其余的SLAVE网卡的mac地址都使用该mac地址、②使用fail_over_mac参数,使bond0使用当前活跃网卡的mac地址,mac地址随着活跃网卡的转换而变。

解决方法:在配置 bonding 文件时设置 fail_over_mac=1

1
2
3
[root@localhost modprobe.d]# vi /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bond0 miimon=100 mode=1 fail_over_mac=1

设置多个 bond 口

①多个 bond 口的模式相同

1
2
3
4
[root@localhost network-scripts]# vi /etc/modprobe.d/bonding.conf
alias bond0 bonding
alias bond1 bonding
options bonding max_bonds=2 miimon=200 mode=1 # max_bonds表示配置的bond口个数

②多个 bond 口的模式不同

1
2
3
4
[root@localhost network-scripts]# vi /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bond0 miimon=100 mode=1
install bond1 /sbin/modprobe bonding -o bond1 miimon=200 mode=0