什么是网卡 bond
网卡绑定,也称作网卡捆绑。就是将两个或者更多的物理网卡绑定成一个虚拟网卡,使其共用一个IP地址。主要用以提供负载均衡或者冗余,增加网络带宽;保证当一个网卡坏掉时,不会影响业务。更多使用的是其冗余模式,此时需要注意绑定的网卡需要和不同的交换机连接,提高可靠性。
Kernels 2.4.12 及以后的版本都自带 bonding 模块,可以通过以下命令确定系统内核是否支持 bonding ,这里我以 Vmware 环境中搭建的 CentOS 7.6 为例:
1 | [root@localhost network-scripts] cat /etc/redhat-release # 查看系统版本 |
网卡 bond 的7种模式
目前网卡绑定共有七种模式(0~6):bond 0、bond 1、bond 2、bond 3、bond 4、bond 5、bond 7。
- mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略)
- 特点:传输数据包顺序是依次传输,即第1个包走eth0,下一个包就走eth1直到最后一个传输完毕;此模式提供负载平衡和容错能力。
- 缺点:因为数据包从不同的接口发出,客户端很有可能会出现数据包无序到达的问题导致重新发送,降低网络的吞吐量。
- mod=1,即: (active-backup) Active-backup policy(主-备份策略)
- 特点:同一时间只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。提供了容错能力;bond的MAC地址是唯一的,以避免switch(交换机)发生混乱;
- 缺点:资源利用率较低,在有 N 个网络接口的情况下,资源利用率为1/N。
- mod=2,即:(balance-xor) XOR policy(平衡策略)
- 特点:基于指定的传输 HASH 策略传输数据包,提供负载平衡和容错能力
- 策略:(源MAC地址 XOR 目标MAC地址) % slave数量,可通过xmit_hash_policy选项指定传输策略。
- mod=3,即:broadcast(广播策略)
- 特点:在所有的网络接口上传输每个数据包,提供了容错能力。
- 注意:此模式适用于金融等其他对网络可靠性要求较高的场景。
- 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 做端口聚合配置
- mod=5,即:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡)
- 特点:不需要任何特别的switch(交换机)支持的通道bonding,动态的根据当前负载分配外出流量,如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。并行发送,无法并行接收。
- 条件:ethtool支持获取每个slave的速率
- 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 | [root@localhost ~] ip a |
关闭 NetworkManager 服务
生产环境下 我们一般都是手动配置网络,以静态地址为主不需要系统的网络管理工具,因此我们就会将它禁用掉,命令如下:
- network 服务主要管理网卡的配置
- NetworkManager 用于管理系统网络连接、允许用户管理网络连接的客户端程序
1 | [root@localhost ~] systemctl stop NetworkManager # 临时关闭,开机后恢复 |
载入 bond 模块
1 | [root@localhost ~] modprobe bonding # 加载bong 模块 |
修改网卡配置文件
为需要制作bond的网卡添加MASTER、SLAVE配置项,删除其他多余配置信息。
注:操作前不要忘记为虚拟机打快照或备份原有网卡文件
1 | [root@localhost ~] cd /etc/sysconfig/network-scripts/ |
新建 bond 配置文件
在 /etc/sysconfig/network-scripts/ 目录下新建 bond 配置文件,设置 bond 网卡的IP地址
1 | [root@localhost network-scripts] vi ifcfg-bond0 |
修改 modprobe.d 下的 bonding 文件
若在 /etc/modprobe.d/ 目录下没有 bonding.conf 文件,需要手动新建,输入以下内容:
1 | [root@localhost network-scripts] vi /etc/modprobe.d/bonding.conf |
重启网络使配置生效
此时可以看到网卡 ens37、ens38 上 master 为 bond 0,表示配置成功。注意做了bonding的这两块网卡是使用同一个MAC地址,避免对端交换机发生混乱。
1 | [root@localhost ~] ip a |
测试bond
因为上述配置 mode=1 主备模式,可以在ping百度过程中然后断开一个网卡,此时ping不会中断。
1 | [root@localhost modprobe.d] ping www.baidu.com |
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 | [root@localhost modprobe.d] vi /etc/modprobe.d/bonding.conf |
设置多个 bond 口
①多个 bond 口的模式相同
1 | [root@localhost network-scripts] vi /etc/modprobe.d/bonding.conf |
②多个 bond 口的模式不同
1 | [root@localhost network-scripts] vi /etc/modprobe.d/bonding.conf |