当前位置: 首页 > 工具软件 > Bond > 使用案例 >

Linux6&7 绑定网卡【bonding和team】

巫马磊
2023-12-01

Linux 网卡绑定

在RHEL 7 之前,网卡绑定常用的是bonding模块,在RHEL7开始,支持使用team作网卡绑定,但在RHEL7中,bonding依然可用。以下主要介绍bonding模块配置双网卡绑定。

Linux网卡绑定模式介绍

模式简介

0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb

常用的有三种模式

mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。

mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。

mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。

mode=4 需要支持802.3ad。

mode5和mode6不需要交换机端的设置,网卡能自动聚合,因为做bonding的这两块网卡是使用不同的MAC地址。

模式详细说明

  1. mode=0(balance-rr)(平衡抡循环策略)
    链路负载均衡,增加带宽,支持容错,一条链路故障会自动切换正常链路。交换机需要配置聚合口,思科叫port channel。
    特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕),此模式提供负载平衡和容错能力;但是我们知道如果一个连接
    或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降

  2. mode=1(active-backup)(主-备份策略)
    这个是主备模式,只有一块网卡是active,另一块是备用的standby,所有流量都在active链路上处理,交换机配置的是捆绑的话将不能工作,因为交换机往两块网卡发包,有一半包是丢弃的。
    特点:只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得,从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。
    此模式只提供了容错能力;由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N

  3. mode=2(balance-xor)(平衡策略)
    表示XOR Hash负载分担,和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy,需要交换机配置port channel)
    特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力

  4. mode=3(broadcast)(广播策略)
    表示所有包从所有网络接口发出,这个不均衡,只有冗余机制,但过于浪费资源。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。需要和交换机的聚合强制不协商方式配合。
    特点:在每个slave接口上传输每个数据包,此模式提供了容错能力

  5. mode=4(802.3ad)(IEEE 802.3ad 动态链接聚合)
    表示支持802.3ad协议,和交换机的聚合LACP方式配合(需要xmit_hash_policy).标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。
    特点:创建一个聚合组,它们共享同样的速率和双工设定。根据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模式

  6. mode=5(balance-tlb)(适配器传输负载均衡)
    是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。该模式要求slave接口的网络设备驱动有某种ethtool支持;而且ARP监控不可用。
    特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
    必要条件:
    ethtool支持获取每个slave的速率

  7. mode=6(balance-alb)(适配器适应性负载均衡)
    在5的tlb基础上增加了rlb(接收负载均衡receive load balance).不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的.
    特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
    来自服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达 时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave。
    使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新 (ARP应答)来解决,应答中包含他们独一无二的硬件地址,从而导致流量重新分布。
    当新的slave加入到bond中时,或者某个未激活的slave重新 激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上
    当某个链路被重新接上,或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个 client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答 不会被switch(交换机)阻截。
    必要条件:
    条件1:ethtool支持获取每个slave的速率;
    条件2:底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管
    其实mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只占了小部分流量。


RHEL 6 网卡绑定操作

验证bonding模块

[root@rac1 ~]# modprobe bonding
[root@rac1 ~]# lsmod |grep  bonding
[root@rac1 ~]# modinfo  bonding
filename:       /lib/modules/4.1.12-94.3.9.el7uek.x86_64/kernel/drivers/net/bonding/bonding.ko
author:         Thomas Davis, tadavis@lbl.gov and many others
description:    Ethernet Channel Bonding Driver, v3.7.1
version:        3.7.1
license:        GPL
alias:          rtnl-link-bond
srcversion:     F8D6873B85C4EE219C56662
depends:        
intree:         Y
vermagic:       4.1.12-94.3.9.el7uek.x86_64 SMP mod_unload modversions 
signer:         Oracle CA Server
sig_key:        87:3F:B2:2B:C5:C1:07:C3:48:F2:D8:5F:43:D7:D7:ED:5D:62:3C:98
sig_hashalgo:   sha512

创建bonding模块配置

[root@rac1 network-scripts]# vi /etc/modprobe.d/bonding.conf 
 --给新创建的bonding.conf中写入:
alias bond0 bonding
options bonding  miimon=100 mode=1

--// miimon 表示每间隔多少毫秒(ms)监控一次bond0
--// mode 表示要创建的bond0网卡的负载模式

创建bonding网卡配置文件

[root@rac1 network-scripts]# cat > /etc/sysconfig/network-scripts/ifcfg-bond0 <<EOF
DEVICE=bond0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
DNS1=114.114.114.114
IPV6INIT=no
USERCTL=no
EOF

修改物理网卡配置文件

[root@rac1 network-scripts]# cat >> /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
BOOTPROTO=none
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
--取消此配置文件中的IP相关设置
[root@rac1 network-scripts]# cat >> /etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
BOOTPROTO=none
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
--取消此配置文件中的IP相关设置

重启网络

--//重新加载bonding模块,如果修改了bonding.conf之后,需要重新加载
# modprobe -r bonding   

--//重启网络
# service restart network

--//验证bonding状态
# cat /proc/net/bonding/bond0 

独立修改bonding参数

在系统” /sys/class/net/bond/bonding/* ” 目录下,可以单独设置关于bonding的参数。(修改这些参数前,需要停用bonding网卡)

# ifconfig down bond0
# echo 1000 >  /sys/class/net/bond/bonding/miimon
# echo 6 >  /sys/class/net/bond/bonding/mode
# echo balance-alb >  /sys/class/net/bond/bonding/mode
--// 其中mode可以设置为以下数字或字符:
	0 for balance-rr
	1 for active-backup
	2 for balance-xor
	3 for broadcast
	4 for 802.3ad
	5 for balance-tlb
	6 for balance-alb

RHEL 7网卡绑定操作(bonding)

可以使用类似RHEL 6中的,直接修改ifcfg配置文件做bonding,也可以使用NetworkManager工具配置bonding。

RHEL 7开始,bonding已弃用了/etc/modprobe.d/bonding.conf和/etc/modprobe.conf配置bonding

验证bonding模块

与6的相同

方式1:使用修改配置文件的方式

  1. 禁用NetworkManager服务
# systemctl stop NetworkManager
# systemctl disable NetworkManager
# systemctl status NetworkManager
  1. 创建bond0网卡配置文件
# vi /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
TYPE=bond			--//RHEL7中与6的参数不同,必须为bond
NAME=bond0
BONDING_MASTER=yes
BOOTPROTO=static
USERCTL=no
ONBOOT=yes
IPADDR=192.168.0.1
PREFIX=24
GATEWAY=192.168.0.254
DNS=114.114.114.114
BONDING_OPTS="miimon=100 mode=1"
  1. 修改物理网卡配置文件
# vi /etc/sysconfig/network-scripts/ifcfg-ens192
NAME=ens192
DEVICE=ens192
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
DEFROUTE=yes
MASTER=bond0
SLAVE=yes
# vi /etc/sysconfig/network-scripts/ifcfg-ens210
NAME=ens210
DEVICE=ens210
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
DEFROUTE=yes
MASTER=bond0
SLAVE=yes
  1. 重启网络
# modprobe -r bonding
# systemctl restart network
# cat /proc/net/bonding/bond0

方式2:使用nmcli工具的方式

  1. 查看物理网卡信息
# nmcli device
  1. 查看网卡连接信息
# nmcli connection show 
  1. 删除已有connection的物理网卡信息
# nmcli connection delete ens192
# nmcli connection delete ens224
# nmcli connection show

  1. 创建绑定网卡bond0 并设置IP地址
# nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary ens192 ipv4.addresses 192.168.201.231/24


# nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode active-backup primary ens192 ipv4.method manual ipv4.addresses 192.168.201.232/24 ipv4.gateway 192.168.201.254
--//如果使用第二个语句创建bond0,就可以不需要使用下文“7.修改bond0网卡参数”
  1. 创建bond0的子接口
# nmcli connection add type bond-slave ifname ens192 con-name bond0-ens192 master bond0 
# nmcli connection add type bond-slave ifname ens224 con-name bond0-ens224 master bond0 
  1. 查看已激活的网络接口
# nmcli connection show --active 

  1. 修改bond0网卡参数
# nmcli connection modify bond0 ipv4.method manual		--如果不修改此项,则bond0网卡因为bootproto 参数为DHCP而无法UP

# nmcli connection modify bond0 ipv4.gateway 192.168.201.254

如果bond0及其子接口有未激活的,手动激活。

  1. 激活网络接口
# nmcli connection up bond0-ens192
# nmcli connection up bond0-ens224
# nmcli connection up bond0
  1. 查看bond0状态
# cat /proc/net/bonding/bond0

方式3:视图nmtui工具

# nmtui

nmtui参考链接

–//nmtui待完善

RHEL 7网卡绑定(Team)

了解网络成组

联合或合并网络连接,以提供具有较高吞吐量的本地连接或冗余的方式可称为“频道绑定”、“以太网绑定”、“端
口聚合”、“频道成组”、“NIC 成组”、“链接合并” 等等。这个最初在 Linux 内核中应用的概念泛指“绑定”。现使
用网络成组(Network Teaming)代表这个概念的最新应用。这不会影响现有的绑定驱动程序,网络成组会作
为备选方法提供,且不会替换 Red Hat Enterprise Linux 7 中的绑定。

  • team驱动

网络成组或成组旨在通过提供小内核驱动程序,以便使用不同的方法应用这个概念,实现数据包流的快速处理,并让各种用户空间应用程序在用户空间执行各种任务。该驱动程序有一个应用程序编程接口(API),即“成组 Netlink API”,可使用该接口进行 Netlink 通讯。用户空间程序库使用这个 API 与该驱动程序通讯。库指的是 “lib”,可用来进行成组 Netlink 通讯及 RT Netlink 信息在用户空间的换行。

  • teamd守护进程

该守护进程通过使用附加代码(即 “运行程序”)采用负载平衡及 active-backup 逻辑(比如轮询)。通过使用这个方式分离代码,可方便网络成组对负载平衡及冗余要求的扩展及延伸解决方案。例如:使用 teamd 编写自定义运行程序应用新的逻辑可相对简单,即使 teamd 为自选程序,用户仍可编写其自己的应用程序以便使用 libteam。

  • teamctl管理工具

teamdctl 提供一个用来控制使用 D-bus 运行 teamd 实例的工具。它可为 teamd D-Bus API 提供 D-Bus 换行程序。默认情况下,teamd 使用 Unix 域套接字(Unix Domain Socket)进行侦听和通讯,但仍监控 D-Bus。这样做是保证能够在没有 D-Bus 或者尚未载入 D-Bus 的环境中使用 teamd。例如:引导 teamd 链接时不一定载入 D-Bus。可在运行时使用 teamdctl 工具读取配置、连接监控程序状态、端口状态检查及变更、添加和删除端口以及将端口状态在 active 和 backup 状态间切换。

安装teamd daemon

# yum install -y teamd

方式1:使用nmcli配置网络成组

  1. 查看当前的网络连接信息
[root@localhost ~]# nmcli conn show 
NAME                UUID                                  TYPE      DEVICE 
ens33               701ebac7-b4c5-44ac-9707-022b7ec7973f  ethernet  ens33  
Wired connection 1  9a8854d6-36b3-3afe-adb9-fa2cf8916e03  ethernet  ens34  
Wired connection 2  0e11da32-2ab3-3041-9fc0-432788a1852c  ethernet  ens37
  1. 创建team网络接口
[root@localhost ~]# nmcli conn add type team con-name cteam0 ifname iteam0 config '{"runner":{"name":"activebackup"}}'
Connection 'cteam0' (83c35d77-69b3-42ec-8fcb-8375d47ec3dd) successfully added.

[root@localhost ~]# nmcli conn show 
NAME                UUID                                  TYPE      DEVICE 
ens33               701ebac7-b4c5-44ac-9707-022b7ec7973f  ethernet  ens33  
Wired connection 1  9a8854d6-36b3-3afe-adb9-fa2cf8916e03  ethernet  ens34  
Wired connection 2  0e11da32-2ab3-3041-9fc0-432788a1852c  ethernet  ens37  
cteam0              83c35d77-69b3-42ec-8fcb-8375d47ec3dd  team      iteam0

nmcli conn add type team 的语法:

nmcli conn add type team con-name CNAME ifname IFNAME [config JSON]

  • JSON (JavaScript Object Notation)语法格式:‘{“runner”:{“name”:“METHOD”}}’

    METHOD 是以下的其中一个:broadcast、activebackup、roundrobin、loadbalance 或者 lacp。

  1. 为cteam0接口添加物理子接口
[root@localhost ~]# nmcli conn add type team-slave con-name cteam0-port1 ifname ens34 master cteam0
[root@localhost ~]# nmcli conn add type team-slave con-name cteam0-port2 ifname ens37 master cteam0

要启用成组,必须首先激活这些子端口.

[root@localhost ~]# nmcli conn show
NAME                UUID                                  TYPE      DEVICE 
cteam0              83c35d77-69b3-42ec-8fcb-8375d47ec3dd  team      iteam0 
cteam0-port1        2b5c185c-7dad-435e-9658-2f5f2729be53  ethernet  ens34  
cteam0-port2        49d7309d-0223-4c8f-aa51-8813d4c05563  ethernet  ens37  
ens33               701ebac7-b4c5-44ac-9707-022b7ec7973f  ethernet  ens33  
Wired connection 1  9a8854d6-36b3-3afe-adb9-fa2cf8916e03  ethernet  --     
Wired connection 2  0e11da32-2ab3-3041-9fc0-432788a1852c  ethernet  --      
  1. 为team接口配置IP等
[root@localhost ~]# nmcli connection modify cteam0 ipv4.addresses "192.168.0.110/24" ipv4.method manual 
[root@localhost ~]# nmcli connection modify cteam0 ipv4.gateway "192.168.0.1"
  1. 依次序激活网卡
[root@localhost ~]# nmcli connection up cteam0-port1 
[root@localhost ~]# nmcli connection up cteam0-port2
[root@localhost ~]# nmcli connection up cteam0
  1. 修改team接口的 team.config配置
[root@localhost ~]# nmcli connection modify cteam0 team.config '{"runner":{"name":"activebackup"},"link_watch":{"name":"ethtool"}}'
  1. 测试team网卡连通性
  • 在服务器侧分别断开只其中一个物理接口的线缆或者down掉接口,测试与team网卡的连通性。
  • 当前team网卡状态
[root@localhost ~]# teamdctl iteam0 state view
setup:
  runner: activebackup
ports:
  ens34
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 0
  ens37
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 0
runner:
  active port: ens34
  • down掉当前主网卡
[root@localhost ~]# nmcli connection down cteam0-port1
Connection 'cteam0-port1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/21)
[root@localhost ~]# teamdctl iteam0 state view
setup:
  runner: activebackup
ports:
  ens37
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
        down count: 0
runner:
  active port: ens37
  • 然后重新up主网卡,然后down掉另一个网卡,测试。
  • 测试结果
......
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=4ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=17ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=5ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=9ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=11ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=5ms TTL=64
来自 192.168.0.110 的回复: 字节=32 时间=3ms TTL=64

192.168.0.110 的 Ping 统计信息:
    数据包: 已发送 = 71,已接收 = 71,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 3ms,最长 = 39ms,平均 = 5ms
  • 不加任何config参数的配置如下
#默认team接口的配置:
[root@localhost ~]# nmcli conn add type team con-name cteam0 ifname iteam0 
team.config:                            --
team.notify-peers-count:                0 (disabled)
team.notify-peers-interval:             0 (default)
team.mcast-rejoin-count:                0 (disabled)
team.mcast-rejoin-interval:             0 (default)
team.runner:                            roundrobin
team.runner-hwaddr-policy:              --
team.runner-tx-hash:                    --
team.runner-tx-balancer:                --
team.runner-tx-balancer-interval:       -1
team.runner-active:                     no
team.runner-fast-rate:                  no
team.runner-sys-prio:                   -1
team.runner-min-ports:                  -1
team.runner-agg-select-policy:          --
team.link-watchers:                     --

方式2:使用ifcfg配置文件创建team组

在 /etc/sysconfig/network-scripts/ 目录中创建一个team主接口的配置文件,配置参考如下:

文件名:ifcfg-cteam0

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0
TEAM_CONFIG="{\"runner\": {\"name\": \"activebackup\"}, \"link_watch\": {\"name\": \"ethtool\"}}"
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=cteam0
UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
DEVICE=iteam0
ONBOOT=yes
DEVICETYPE=Team
IPADDR=192.168.0.110
PREFIX=24
  1. 然后创建子接口的配置文件

文件名:ifcfg-cteam0-port1

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0-port1 
NAME=cteam0-port1
UUID=2b5c185c-7dad-435e-9658-2f5f2729be53
DEVICE=ens34
ONBOOT=yes
TEAM_MASTER_UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
TEAM_MASTER=iteam0
DEVICETYPE=TeamPort

文件名:ifcfg-cteam0-port2

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-cteam0-port2
NAME=cteam0-port2
UUID=49d7309d-0223-4c8f-aa51-8813d4c05563
DEVICE=ens37
ONBOOT=yes
TEAM_MASTER_UUID=83c35d77-69b3-42ec-8fcb-8375d47ec3dd
TEAM_MASTER=iteam0
DEVICETYPE=TeamPort

子接口的配置中可以加 优先级参数 TEAM_PORT_CONFIG='{"prio": 100}'

其中:prio的取值范围是 -3276732767 之间

prio默认为0.

  1. 启动接口
# ifup cteam0
# ip link show 
 类似资料: