Linux网卡bond

  • 1 bonding模块
    • 1.1 模块加载
    • 1.2 bonding参数
    • 1.3 几个重要文件
  • 2 设置网卡bond
    • 2.1 ifcfg配置文件
    • 2.2 使bond配置生效
  • 3 参数详解
    • 3.1 最重要的参数 -- mode
      • mode=0(balance-rr) 循环均衡模式
      • mode=1(active-backup) 主备模式
      • mode=2(balance-xor) 异或均衡模式
      • mode=3(broadcast) 广播模式
      • mode=4(802.3ad) LACP模式
      • mode=5(balance-tlb) 发送均衡模式
      • mode=6(balance-alb) 收发都均衡模式
    • 3.2 链路监视
      • 3.2.1 MII 链路监视
      • 3.2.2 ARP 链路监视
    • 3.3 hash策略 -- xmit_hash_policy
    • 3.4 其他参数
  • 参考文献

Red Hat Enterprise Linux 7 支持将多个网络接口绑定在一起作为一个网络接口(bonding),实现增加带宽,提供容错的效果。

不支持对不使用网络交换机的直接线缆连接进行绑定操作。如果没有网络交换机,在此论述的这个故障转移机制就无法工作。详情请查看 Red Hat 知识库文章《为什么在使用交叉线缆的直接连接中不支持绑定?》

mode=1(active-backup)、mode=5(balance-tlb) 和 mode=6(balance-alb) 模式不需要交换机的任何特殊配置。其他绑定模式需要配置交换机以便整合链接。例如:Cisco 交换机需要在mode=0、2 和 3 中使用 EtherChannel,但在mode=4中需要 LACP 和 EtherChannel。有关交换机附带文档,请查看 https://www.kernel.org/doc/Documentation/networking/bonding.txt。

环境:CentOS 7
bonding模块版本:3.7.1

1 bonding模块

1.1 模块加载

判断模块是否已加载

# 模块未加载时无输出
[root@localhost ~]# lsmod |grep bonding# 模块已加载时有输出
[root@localhost ~]# lsmod |grep bonding
bonding               152979  0

加载模块,可以传递模块参数,例如:max_bonds=0

[root@localhost ~]# modprobe bonding max_bonds=0

卸载模块

[root@localhost network-scripts]# modprobe -r bonding

1.2 bonding参数

查看bonding模块支持哪些参数

[root@localhost ~]# modinfo bonding
filename:       /lib/modules/3.10.0-1127.el7.x86_64/kernel/drivers/net/bonding/bonding.ko.xz
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
retpoline:      Y
rhelversion:    7.8
srcversion:     02BB340820F6F1A042A3033
depends:
intree:         Y
vermagic:       3.10.0-1127.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        69:0E:8A:48:2F:E7:6B:FB:F2:31:D8:60:F0:C6:62:D8:F1:17:3D:57
sig_hashalgo:   sha256
parm:           max_bonds:Max number of bonded devices (int)
parm:           tx_queues:Max number of transmit queues (default = 16) (int)
parm:           num_grat_arp:Number of peer notifications to send on failover event (alias of num_unsol_na) (int)
parm:           num_unsol_na:Number of peer notifications to send on failover event (alias of num_grat_arp) (int)
parm:           miimon:Link check interval in milliseconds (int)
parm:           updelay:Delay before considering link up, in milliseconds (int)
parm:           downdelay:Delay before considering link down, in milliseconds (int)
parm:           use_carrier:Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default) (int)
parm:           mode:Mode of operation; 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 (charp)
parm:           primary:Primary network device to use (charp)
parm:           primary_reselect:Reselect primary slave once it comes up; 0 for always (default), 1 for only if speed of primary is better, 2 for only on active slave failure (charp)
parm:           lacp_rate:LACPDU tx rate to request from 802.3ad partner; 0 for slow, 1 for fast (charp)
parm:           ad_select:802.3ad aggregation selection logic; 0 for stable (default), 1 for bandwidth, 2 for count (charp)
parm:           min_links:Minimum number of available links before turning on carrier (int)
parm:           xmit_hash_policy:balance-alb, balance-tlb, balance-xor, 802.3ad hashing method; 0 for layer 2 (default), 1 for layer 3+4, 2 for layer 2+3, 3 for encap layer 2+3, 4 for encap layer 3+4 (charp)
parm:           arp_interval:arp interval in milliseconds (int)
parm:           arp_ip_target:arp targets in n.n.n.n form (array of charp)
parm:           arp_validate:validate src/dst of ARP probes; 0 for none (default), 1 for active, 2 for backup, 3 for all (charp)
parm:           arp_all_targets:fail on any/all arp targets timeout; 0 for any (default), 1 for all (charp)
parm:           fail_over_mac:For active-backup, do not set all slaves to the same MAC; 0 for none (default), 1 for active, 2 for follow (charp)
parm:           all_slaves_active:Keep all frames received on an interface by setting active flag for all slaves; 0 for never (default), 1 for always. (int)
parm:           resend_igmp:Number of IGMP membership reports to send on link failure (int)
parm:           packets_per_slave:Packets to send per slave in balance-rr mode; 0 for a random slave, 1 packet per slave (default), >1 packets per slave. (int)
parm:           lp_interval:The number of seconds between instances where the bonding driver sends learning packets to each slaves peer switch. The default is 1. (uint)

这些参数可以作为命令行参数提供给modprobe命令,更常见的做法是写入/etc/modprobe.d/*.conf 配置文件中。当新创建的bond没有指定具体参数时(即没有在ifcfg-bond0的BONDING_OPTS中设置的参数),会采用模块加载时设置的参数作为默认值。

[root@localhost ~]# cat /etc/modprobe.d/dist.conf
options bonding max_bonds=0 miimon=100

注意:如果在ifcfg-bond0的BONDING_OPTS中设置了某个参数(例如:primary=eth1),当你想要取消这个设置时,需要显式地在BONDING_OPTS中将该参数修改回其默认值(例如:primary=none),而不是仅仅在BONDING_OPTS中删除该参数(例如:仅删除了primary=eth1)。

1.3 几个重要文件

/sys/class/net/bonding_masters中保存了所有master的名称,可以使用echo命令向此文件中增加/删除master,此文件中有的master才会展示在ip address中。

[root@localhost ~]# cat /sys/class/net/bonding_masters
bond0

/proc/net/bonding/目录下为每个bond保存了一个详细信息的文件,能够查看到这个bond的参数、slave状态等。
此文件中看到的Permanent HW addr是slave的真实mac地址,而ifconfig、ip address命令中看到的是被bonding驱动程序修改过的mac地址。

[root@localhost ~]# ll /proc/net/bonding/
-r--r--r-- 1 root root 0 Jul 22 12:48 bond0[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8c:be:47
Slave queue ID: 0Slave Interface: eth2
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:8c:be:6f
Slave queue ID: 0

/sys/class/net/bond0是一个软链接,指向/sys/devices/virtual/net/bond0目录。其中/sys/devices/virtual/net/bond0/bonding/slaves保存了所有slave设备的名称。可以使用echo命令向此文件中增加/删除slave,此文件中的设备名称会一直作为slave展示在ip address中。

[root@localhost ~]# ll /sys/class/net/bond0
lrwxrwxrwx 1 root root 0 Jul 22 11:13 /sys/class/net/bond0 -> /sys/devices/virtual/net/bond0[root@localhost ~]# ll /sys/devices/virtual/net/bond0
-r--r--r--  1 root root 4096 Jul 22 11:12 addr_assign_type
-r--r--r--  1 root root 4096 Jul 22 13:03 address
-r--r--r--  1 root root 4096 Jul 22 13:03 addr_len
drwxr-xr-x  2 root root    0 Jul 22 11:13 bonding
-r--r--r--  1 root root 4096 Jul 22 13:03 broadcast
-rw-r--r--  1 root root 4096 Jul 22 13:03 carrier
-r--r--r--  1 root root 4096 Jul 22 13:03 carrier_changes
-r--r--r--  1 root root 4096 Jul 22 13:03 dev_id
-r--r--r--  1 root root 4096 Jul 22 13:03 dev_port
-r--r--r--  1 root root 4096 Jul 22 13:03 dormant
-r--r--r--  1 root root 4096 Jul 22 13:03 duplex
-rw-r--r--  1 root root 4096 Jul 22 13:03 flags
-rw-r--r--  1 root root 4096 Jul 22 13:03 gro_flush_timeout
-rw-r--r--  1 root root 4096 Jul 22 13:03 ifalias
-r--r--r--  1 root root 4096 Jul 22 11:12 ifindex
-r--r--r--  1 root root 4096 Jul 22 11:12 iflink
-r--r--r--  1 root root 4096 Jul 22 13:03 link_mode
lrwxrwxrwx  1 root root    0 Jul 22 13:03 lower_eth1 -> ../../../pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth1
lrwxrwxrwx  1 root root    0 Jul 22 13:03 lower_eth2 -> ../../../pci0000:00/0000:00:16.1/0000:0c:00.0/net/eth2
-rw-r--r--  1 root root 4096 Jul 22 13:03 mtu
-rw-r--r--  1 root root 4096 Jul 22 13:03 netdev_group
-r--r--r--  1 root root 4096 Jul 22 13:03 operstate
-r--r--r--  1 root root 4096 Jul 22 13:03 phys_port_id
-r--r--r--  1 root root 4096 Jul 22 11:12 phys_port_name
-r--r--r--  1 root root 4096 Jul 22 13:03 phys_switch_id
drwxr-xr-x  2 root root    0 Jul 22 12:46 power
-rw-r--r--  1 root root 4096 Jul 22 13:03 proto_down
drwxr-xr-x 34 root root    0 Jul 22 11:12 queues
lrwxrwxrwx  1 root root    0 Jul 22 13:03 slave_eth1 -> ../../../pci0000:00/0000:00:16.0/0000:0b:00.0/net/eth1
lrwxrwxrwx  1 root root    0 Jul 22 13:03 slave_eth2 -> ../../../pci0000:00/0000:00:16.1/0000:0c:00.0/net/eth2
-r--r--r--  1 root root 4096 Jul 22 13:03 speed
drwxr-xr-x  2 root root    0 Jul 22 12:46 statistics
lrwxrwxrwx  1 root root    0 Jul 22 11:12 subsystem -> ../../../../class/net
-rw-r--r--  1 root root 4096 Jul 22 13:03 tx_queue_len
-r--r--r--  1 root root 4096 Jul 22 11:12 type
-rw-r--r--  1 root root 4096 Jul 22 11:12 uevent[root@localhost ~]# cat /sys/devices/virtual/net/bond0/bonding/slaves
eth1 eth2

2 设置网卡bond

2.1 ifcfg配置文件

Master网卡(逻辑网卡)配置文件

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0
TYPE=Ethernet
BOOTPROTO=static
DEVICE=bond0
ONBOOT=yes
NM_CONTROLLED=no
IPADDR=192.168.1.66
NETMASK=255.255.255.0
BONDING_OPTS='mode=0 miimon=100'

Slave网卡(物理网卡)配置文件

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes

2.2 使bond配置生效

新增bond

# 第一步可省略,因为ifup bond0的过程中会执行第一步
[root@localhost ~]# echo +bond0 > /sys/class/net/bonding_masters
[root@localhost ~]# ifup bond0

注意:如果遇到echo +bond0 > /sys/net/class/bonding_masters命令报错-bash: echo: write error: File exists,说明/sys/net/class/bonding_masters中已经有了bond0,可能是由以下两种场景造成的:
1.bonding模块加载时会默认创建1个bond(参数max_bonds的缺省默认值为1),名称就是bond0。如果指定了模块参数max_bonds为3,则会默认创建3个bond,名称依次为bond0,bond1,bond2。这些bond都是空的master,没有任何slave。此时遇到报错-bash: echo: write error: File exists是正常的,忽略即可。
2.你确实曾经创建过bond0,此时遇到报错-bash: echo: write error: File exists说明,如果继续执行ifup bond0将覆盖原来的bond0配置。

减少slave

# 修改ifcfg-eth1,删除`MASTER=bond0`和`SLAVE=yes`这两行,重新为其配置IP
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1
# 解除eth1与bond0的绑定关系
[root@localhost ~]# echo -eth1 > /sys/devices/virtual/net/bond0/bonding/slaves
# 完成以上两步后,ip address中就能看到eth1已经不是slave了,/proc/net/bonding/bond0中也没有这个slave了
# 但是eth1处于未启用的状态,所以需要单独启用一下eth1
[root@localhost ~]# ifup eth1

增加slave

# 修改ifcfg-eth3,配置成Slave
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth3
# 添加eth3与bond0的绑定关系
[root@localhost ~]# echo +eth3 > /sys/class/net/bond0/bonding/slaves
# 完成以上两步后,ip address中就能看到eth3已经变成slave了,/proc/net/bonding/bond0中也有了这个新slave了,并且eth1处于启用的状态

修改bond配置项:例如BONDING_OPTS、IP等

# 修改ifcfg-bond0配置项:例如BONDING_OPTS、IP等
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0
# 先关闭bond0
[root@localhost ~]# ifdown bond0
# 再启用bond0,此时ip address和/proc/net/bonding/bond0中就能看到已修改了
[root@localhost ~]# ifup bond0

删除bond

# 修改ifcfg-eth2和ifcfg-eth3,删除`MASTER=bond0`和`SLAVE=yes`这两行,重新为其配置IP
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth2
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth3
# 删除ifcfg-bond0
[root@localhost ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-bond0
# 在bonding模块中删除bond0这个Master
[root@localhost ~]# echo -bond0 > /sys/class/net/bonding_masters
# 完成以步骤后,ip address中就能看到eth2和eth3已经不是slave了,bond0中也没有了,但是eth2和eth3处于未启用的状态,所以需要单独启用一下
[root@localhost ~]# ifup eth2
[root@localhost ~]# ifup eth3

3 参数详解

3.1 最重要的参数 – mode

参数mode指定bond的模式。

mode=0(balance-rr) 循环均衡模式

rr:round-robin
效果:发送负载均衡 + 容错
交换机要求:需要交换机的特殊配置,例如Cisco 交换机需要使用 EtherChannel。
系统要求:无
mac:对外,所有对端arp表项中的mac地址都是相同的(bond的mac)。对内,ifconfig中看到所有slave的mac地址都是相同的(bond的mac)。
可配置参数:packets_per_slave,resend_igmp,链路监视参数。
介绍:从第一个可用的slave到最后一个slave,依次发送数据包。第一个数据包走eth1,下一个数据包就走eth2。
实验
在ifcfg-bond0中设置BONDING_OPTS='mode=0 miimon=100'

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

ifconfig能看到eth1,eth2的TX packets都在增加,基本上均分了bond0的TX packets。说明两个slave网卡轮流发送数据包,提供发送的负载均衡。手动关闭eth1(ifdown eth1),则所有bond0的数据包都由eth2发送,说明提供容错。

mode=1(active-backup) 主备模式

效果:容错
交换机要求:无
系统要求:无
可配置参数:fail_over_mac,primary,primary-reselect,num_grat_arp,num_unsol_na,resend_igmp,链路监视参数。
mac:对外,所有对端arp表项中的mac地址都是相同的(bond的mac)。对内,ifconfig中看到每个slave的mac地址是否相同取决于fail_over_mac参数。
介绍:只有一个slave是Currently Active Slave,负责发送数据包。当且仅当它发生故障时,才会选举出另一个slave作为新的Currently Active Slave,即通过主备切换提供容错效果。
实验
在ifcfg-bond0中设置BONDING_OPTS='mode=0 miimon=100'

[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: eth1
...

/proc/net/bonding/bond0中能看到Currently Active Slave: eth1,同时ifconfig能看到只有eth1的TX packets在增加,等于bond0的TX packets,而eth2的TX packets一直为0。说明只有Currently Active Slave在发送数据包。

手动关闭eth1,/proc/net/bonding/bond0中能看到Currently Active Slave变成eth2,同时ifconfig能看到所有bond0的数据包都只从eth2上发送,说明自动完成主备切换,提供容错。

mode=2(balance-xor) 异或均衡模式

效果:发送负载平衡 + 容错
交换机要求:需要交换机的特殊配置,例如Cisco 交换机需要使用 EtherChannel。
系统要求:无
可配置参数:xmit_hash_policy,链路监视参数。
mac:对外,所有对端arp表项中的mac地址都是相同的(bond的mac)。对内,ifconfig中看到所有slave的mac地址都是相同的(bond的mac)。
介绍:发送给同一个对端的数据包总是分配给同一个slave来发送。通过参数xmit_hash_policy(缺省默认值为layer2)指定分配时采用的hash策略。
实验
在ifcfg-bond0中设置BONDING_OPTS='mode=2 miimon=100 xmit_hash_policy=layer2+3'

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer2+3 (2)
...

当只ping一个客户端(IP)时,ifconfig能看到只有一个slave网卡的TX packets在增加,等于bond0的TX packets。当同时ping另一个客户端(IP)时,ifconfig能看到另一个slave网卡的TX packets才开始增加。

mode=3(broadcast) 广播模式

效果:容错
交换机要求:需要交换机的特殊配置,例如Cisco 交换机需要使用 EtherChannel。
系统要求:无
可配置参数:链路监视参数
mac:对外,所有对端arp表项中的mac地址都是相同的(bond的mac)。对内,ifconfig中看到所有slave的mac地址都是相同的(bond的mac)。
介绍:所有slave同时发送同样的数据包,通过冗余提供容错效果。
实验
在ifcfg-bond0中设置BONDING_OPTS='mode=3 miimon=100'

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

ifconfig能看到eth1,eth2的TX packets都在增加且相等,都等于bond0的TX packets。说明两个网卡都在发同样的数据包。
手动关闭eth1,也不会影响eth2,因为eth2本身已经在发数据包了,只是重复包的数量会减少1份。说明提供的是冗余的容错。

mode=4(802.3ad) LACP模式

效果:发送负载均衡 + 容错
交换机要求:需要交换机的特殊配置,例如Cisco 交换机需要使用 LACP(802.3 ad 模式)和 EtherChannel。
系统要求:系统支持 Ethtool,用于获取每个slave的速度和双工信息。
可配置参数:xmit_hash_policy,lacp_rate,ad_select,min_links,链路监视参数。
mac:对外,所有对端arp表项中的mac地址都是相同的(bond的mac)。对内,ifconfig中看到所有slave的mac地址都是相同的(bond的mac)。
介绍:bonding模块将创建有相同速度和双工设置的聚合组(aggregation groups)。根据 802.3ad 规范,使用激活聚合器(active aggregator)中的所有slave发送数据包。注意,并非所有的传输策略都符合 802.3ad 标准,特别是在 802.3ad 标准第43.2.4节的错误排序要求方面。不同的对端对不遵从可能有不同的容忍度。
实验
在ifcfg-bond0中设置BONDING_OPTS='mode=4 miimon=100 xmit_hash_policy=layer2+3'

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2+3 (2)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0802.3ad info
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: 00:0c:29:0c:b3:9a
Active Aggregator Info:Aggregator ID: 1Number of ports: 1Actor Key: 15Partner Key: 1Partner Mac Address: 00:00:00:00:00:00Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:0c:b3:9a
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: churned
Actor Churned Count: 0
Partner Churned Count: 1
details actor lacp pdu:system priority: 65535system mac address: 00:0c:29:0c:b3:9aport key: 15port priority: 255port number: 1port state: 205
details partner lacp pdu:system priority: 65535system mac address: 00:00:00:00:00:00oper key: 1port priority: 255port number: 1port state: 3Slave Interface: eth2
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:0c:b3:a4
Slave queue ID: 0
Aggregator ID: 2
Actor Churn State: churned
Partner Churn State: churned
Actor Churned Count: 1
Partner Churned Count: 1
details actor lacp pdu:system priority: 65535system mac address: 00:0c:29:0c:b3:9aport key: 15port priority: 255port number: 2port state: 197
details partner lacp pdu:system priority: 65535system mac address: 00:00:00:00:00:00oper key: 1port priority: 255port number: 1port state: 3

即使我们没有主动ping客户端,也能在ifconfig看到bond0,eth1,eth2的TX packets都在一直增加。这是因为它们在发送LACP数据包。

mode=5(balance-tlb) 发送均衡模式

tlb:transmit load balancing
效果:发送负载均衡 + 容错
交换机要求:无
系统要求

  1. 系统支持 Ethtool,用于获取每个slave的速度信息。
  2. 系统支持在设备UP时设置设备的mac地址。这是必需的,以便在bond中始终有一个slave使用的是bond的mac地址(Currently Active Slave),同时能够为bond中的每个slave都提供一个唯一的mac地址。当Currently Active Slave发生故障时,它将与新选出的 Currently Active Slave互换mac地址。

可配置参数:tlb_dynamic_lb,xmit_hash_policy,primary,primary_reselect,resend_igmp,lp_interval,链路监视参数。
mac:对外,所有对端arp表项中的mac地址都是相同的(bond的mac)。对内,ifconfig中看到每个slave的mac地址各不相同。
介绍:动态地根据每个slave的当前负载,分配发送流量。

bond0的所有slave的mac地址构成一个mac池。其中一个会作为bond0的mac地址,对外只提供这一个mac地址,由Currently Active Slave持有bond0的mac地址并负责接收所有传入流量。如果它发生故障,将选举出另一个slave作为Currently Active Slave负责接收并接管bond0的mac地址。其他slave从剩余的mac池中各取一个地址,互不重复。于是,抓包能看到在发送的数据包中,源IP相同,但源mac地址不同(各个slave的独有mac)。在接收的数据包中,目的mac地址都相同(bond的mac)。

参数tlb_dynamic_lb=1(默认),表示使用动态策略分配流量,即根据每个slave的速度计算其当前负载,分配发送流量,这样的负载均衡效果更好,但是可能导致数据包重新排序(packet reordering)。如果重新排序的问题对你来说很重要,则需要设置tlb_dynamic_lb=0 。0 表示禁用动态策略,只根据参数xmit-hash-policy分配发送流量,不会考虑slave的当前负载。

实验
在ifcfg-bond0中设置了tlb_dynamic_lb=0时:BONDING_OPTS="mode=5 miimon=100 tlb_dynamic_lb=0"
能够在/proc/net/bonding/bond0看到一行Transmit Hash Policy: layer2 (0),说明是基于Hash策略分配发送流量。

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: transmit load balancing
Transmit Hash Policy: layer2 (0)
Primary Slave: None
Currently Active Slave: eth1
...

在ifcfg-bond0中设置了tlb_dynamic_lb=1(缺省默认值)时:BONDING_OPTS="mode=5 miimon=100"
看不到Transmit Hash Policy: layer2 (0),说明是基于动态策略(根据速度计算当前负载)分配发送流量。

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: transmit load balancing
Primary Slave: None
Currently Active Slave: eth1
...

/proc/net/bonding/bond0看到一行Currently Active Slave: eth1,表示现在是由eth1负责接收并持有bond0的mac地址。ifconfig看到eth1的mac地址与bond0的mac地址相同,eth2的mac地址不同。手动关闭eth1,则ifconfig看到bond0的mac地址没有变化,但eth2的mac地址变成了bond0的mac地址。此时/proc/net/bonding/bond0看到Currently Active Slave: eth2。说明只有一个slave负责接收,即不提供接收的负载均衡。

抓包看到当只ping一个客户端时,发给该客户端的数据包都走的eth1,当同时ping另一个客户端时,发给第二个客户端的数据包都走的eth2。手动关闭eth1,则发给两个客户端的数据包都走的eth2。说明提供发送的负载均衡和容错。

即使我们没有主动ping客户端,也能在ifconfig看到bond0,eth1,eth2的TX packets都在一直增加。这是因为它们在发送Configuration Test Protocol (loopback)数据包,其作用基本相当于二层协议的ping。

mode=6(balance-alb) 收发都均衡模式

alb:adaptive load balancing
效果:发送负载均衡 + 接收负载均衡 + 容错。
交换机要求:无
系统要求

  1. 系统支持 Ethtool,用于获取每个slave的速度信息。
  2. 系统支持在设备UP时设置设备的mac地址。

可配置参数:tlb_dynamic_lb,xmit_hash_policy,primary,primary_reselect,resend_igmp,lp_interval,链路监视参数。
mac:对外,不同对端arp表项中的mac地址可能不同(slave的独有mac)。对内,ifconfig中看到每个slave的mac地址各不相同(slave的独有mac)。
介绍:包含了 mode=5(balance-tlb),并且增加了针对 IPv4流量的接收负载平衡(rlb: receive load balancing)。

通过 ARP 协商实现接收负载均衡。

  • 当本地系统(服务端)收到ARP请求包时,目的mac填写的是bond的mac地址。为了实现接收负载均衡,bonding驱动程序会拦截本地系统向外回复的ARP响应包,将源mac填写为某个slave的独有mac地址,此后从该客户端传入的数据包就都由这个slave负责接收。
  • 当本地系统(服务端)向外发送ARP请求包时,源mac填写的是bond的mac地址,于是收到的客户端ARP响应包,目的mac填写的是bond的mac地址。为了实现接收负载均衡,bonding驱动程序会再额外发起一个ARP响应包给这个客户端,源mac填写的是某个slave的独有mac地址,此后从该客户端传入的数据包就都由这个slave负责接收。

为什么bonding驱动程序会再额外发起一个ARP响应包给客户端?
使用ARP协商进行负载均衡的一个问题是,每次广播ARP请求包时,都使用的是bond的mac地址。因此,客户端学习到的mac地址是bond的,这会导致接收流量都只分配到Currently Active Slave上(因为Currently Active Slave负责持有bond的mac地址)。这个问题是通过发送更新的ARP响应包来解决的,即给每个客户端再额外发送一个ARP响应包,其中源mac是某个slave的独有mac地址,这样的接收流量就会被重新均衡分配到各个slave上。当一个新slave被添加到bond中,或者一个未启用的slave被重新启用时,接收流量也会被重新分配。

bonding模块按照顺序轮流(round robin)把客户端分配到各个slave之间。例如:第一个客户端(IP)分给了eth1,以后就由eth1负责接收该IP的所有传入流量。下一个客户端(IP)就分给eth2。

注意:如果启用了 MII 链路监视,则updelay参数必须设置为大于等于交换机的转发延迟(forwarding delay)的值,以便发送给客户端的ARP响应包不会被交换机阻塞。

实验
在ifcfg-bond0中设置:BONDING_OPTS="mode=6 miimon=100"

[root@localhost network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: eth1
...

3.2 链路监视

bonding模块提供了两类链路监视器,用来检测slave是否发生故障:MII 链路监视、 ARP 链路监视。两种不能同时使用。

3.2.1 MII 链路监视

miimon
默认值为0。
指定 MII 链路监视的频率(以毫秒为单位)。例如指定miimon=100,则模块将以每100毫秒一次的频率检查slave是否发生故障。
miimon=0表示禁用 MII 链路监视。

use_carrier
默认值是1,表示使用netif_carrier_ok()。其他可选值为0,表示使用MII 或 ETHTOOL。
miimon参数指定了 MII 链路监视的频率,此参数指定如何实现监视,即具体使用哪种工具来判断Slave是否故障。
一类工具是 MII 或 ETHTOOL ioctls,缺点是效率较低。
另一类工具是 netif_carrier_ok(),缺点是有的网络设备驱动可能不支持。
如果发现slave已经故障了,但bonding模块仍然显示该slave正常,说明可能是您的网络设备驱动程序不支持netif_carrier_ok(),此时应设置use_carrier=0

updelaydowndelay
默认值为0。此参数只对 MII 链路监视器有效。此参数值应该是 miimon 值的倍数; 如果不是,将被四舍五入到最接近的倍数。
updelay指定当检测到slave已恢复正常后,延迟指定的毫秒数后再正式启用这个slave。
downdelay指定当检测到slave发生故障后,延迟指定的毫秒数后再正式禁用这个slave。

3.2.2 ARP 链路监视

arp_interval
默认值为0,表示禁用 ARP 链路监视。
指定 ARP 链路监视的频率(以毫秒为单位)。
如果在mode=0(balance-rr)、mode=2(balance-xor)的bond中使用 ARP 监视器,则交换机需配置成均匀分发数据包的模式,不能配置成异或分发数据包模式。

arp_ip_target
默认值是none,无IP地址。
指定用作 ARP 链路监视的对端 IP 地址,最多可以设置16个,用逗号分隔。

arp_all_targets
此参数只对mode=1(active-backup)有效。
在启用 ARP 链路监视的情况下,指定至少要有多少个arp_ip_target的是通的才能视为slave在正常运行。

arp_validate
在启用 ARP 链路监视的情况下,指定对ARP包的校验和过滤规则。
可选值:
none 或 0
active 或 1
backup 或 2
all 或 3
filter 或 4
filter_active 或 5
filter_backup 或 6
各参数值含义详见https://www.kernel.org/doc/Documentation/networking/bonding.txt

3.3 hash策略 – xmit_hash_policy

xmit_hash_policy参数只对mode=2(balance-xor)、mode=4(802.3ad)、mode=5(balance-tlb)、mode=6(balance-alb)有效。
在支持发送负载平衡的mode中,指定按照什么策略生成hash值,bonding模块会用hash值对slave数量取模,得到的是几,就会分配第几个slave来发送数据包。
此参数值体现在/proc/net/bonding/bond0Transmit Hash Policy字段中。

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer2+3 (2)

默认值为layer2。
可选值:
layer2
只利用二层协议的信息进行计算,即根据mac地址和数据包类型ID(packet type ID)的异或(XOR)来生成hash值。
公式:
hash = source MAC XOR destination MAC XOR packet type ID
slave number = hash modulo slave count
此策略的效果是一个对端上的所有流量都会走同一个slave网卡。
此策略与 802.3 ad 规范兼容。

layer2+3
如果三层协议信息可用,则利用二层(mac、packet type ID)+ 三层(IP)协议信息的异或(XOR)生成hash值。
公式:
hash = source MAC XOR destination MAC XOR packet type ID
hash = hash XOR source IP XOR destination IP
hash = hash XOR (hash RSHIFT 16)
hash = hash XOR (hash RSHIFT 8)
slave number = hash modulo slave count
此策略的效果是一个对端上的所有流量都会走同一个slave网卡。
如果你的大多数对端都需要经过三层网关才能通信,此策略能够提供一个更加平衡的流量分配方式。
此策略与 802.3 ad 规范兼容。

layer3+4
如果四层协议信息可用,则利用三层(IP)+ 四层(port)协议信息生成hash值。
公式:
hash = source port, destination port (as in the header)
hash = hash XOR source IP XOR destination IP
hash = hash XOR (hash RSHIFT 16)
hash = hash XOR (hash RSHIFT 8)
slave number = hash modulo slave count
此策略的效果是一个对端上的流量可以走多个slave网卡,但是单个连接(connection)上的流量只会走一个slave网卡。
此算法不完全符合802.3 ad规范。

encap2+3
此策略使用与 layer2 + 3 相同的公式,但是依赖于 skb _flow _dissection 来获取头字段,这会导致在使用封装协议(encapsulation protocol)的情况下获取到的是内部头字段(inner headers)。例如,此策略能够改善使用隧道协议的流量分配。

encap3+4
此策略使用的是与 layer3 + 4相同的公式,其他与 encap2+3 类似。

3.4 其他参数

max_bonds
指定当bonding模块加载时,默认创建的bond数量。此参数的缺省默认值是1,即模块会默认创建一个bond0设备。如果指定max_bonds=3,则会创建bond0、 bond1、bond2三个设备,这些由模块默认创建的设备此时都没有slave,都是mode=0的round-robin(参数mode的缺省默认值)。如果指定max_bonds=0,则只加载模块,但不会创建任何bond设备。一般设置为max_bonds=0
注意:max_bonds只能作为模块参数,不能作为bond的具体参数,即不能在ifcfg-bond0中设置BONDING_OPTS='max_bonds=3',会报错
导致bond启用失败。

[root@localhost ~]# modprobe bonding max_bonds=3[root@localhost ~]# cat /sys/class/net/bonding_masters
bond0 bond1 bond2[root@localhost ~]# ip address
....
6: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether 0e:32:9b:0f:19:3f brd ff:ff:ff:ff:ff:ff
7: bond1: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether da:ff:2d:a1:4f:9b brd ff:ff:ff:ff:ff:ff
8: bond2: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether 26:41:b9:e5:ee:d3 brd ff:ff:ff:ff:ff:ff[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: load balancing (round-robin)
MII Status: down
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0[root@localhost ~]# cat /sys/devices/virtual/net/bond0/bonding/slaves

tx_queues
bonding驱动程序支持多队列(multiqueue),并会在驱动初始化时默认创建16个队列(参见https://www.kernel.org/doc/Documentation/networking/multiqueue.txt)。如果需要更多或更少的队列,则需要设置此模块参数。一般无需设置。

num_grat_arpnum_unsol_na
此参数只对mode=1(active-backup)有效。
默认值是1,参数值的有效范围是0-255。
指定发生故障转移或slave上线时,向对端发送的免费ARP包(用于IPv4)的数量和unsolicited Neighbor Advertisements包(用于IPv6)的数量。发这两种包是为了告诉对端自己的新mac地址是多少。一般无需设置。

primary
此参数只对mode=1(active-backup)、mode=5(balance-tlb)、mode=6(balance-alb)有效。
参数值是一个slave设备名称,例如:eth0、 eth1等。
指定哪个slave将始终作为Currently Active Slave,只要该slave是正常可用的。只有当该slave故障时,其他slave才会变为Currently Active Slave。一般是因为某个slave网卡的吞吐量更高,才会设置此参数。
此参数值体现在/proc/net/bonding/bond0Primary Slave字段中。

[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: eth1 (primary_reselect better)
Currently Active Slave: eth1
...

primary_reselect
如果primary slave恢复正常了,当符合什么条件时,primary slave将重新成为Currently Active Slave
可选值:
always 或 0 (缺省默认值):无条件,如果primary slave恢复正常了,它总是会重新成为Currently Active Slave
better 或 1:条件是primary slave比当前作为Currently Active Slave的slave网卡的速度和双工性都更好。
failure 或 2:条件是当前作为Currently Active Slave的slave网卡发生故障了。
此参数值体现在/proc/net/bonding/bond0Primary Slave字段中。

lacp_rate
此参数只对mode=4(802.3ad)有效。
指定要求link partner传输 LACPDU 数据包的速率。
可选值:
slow 或 0(缺省默认值):要求link partner每30秒发送一次 LACPDU 数据包。
fast 或 1:要求link partner每1秒发送一次 LACPDU 数据包。
此参数值体现在/proc/net/bonding/bond0的LACP rate字段中。

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2+3 (2)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0802.3ad info
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
...

ad_select
此参数只对mode=4(802.3ad)有效。
指定根据什么条件来选择active aggregator。
可选值:
stable 或 0:
bandwidth 或 1
count 或 2
此参数值体现在/proc/net/bonding/bond0的Aggregator selection policy字段中。
各参数值含义详见https://www.kernel.org/doc/Documentation/networking/bonding.txt

min_links
此参数只对mode=4(802.3ad)有效。
默认值是0。
指定aggregator中最少要有多少个可用的link,它才能被视为acitve。如果要确保bond网卡的最低带宽,可以设置此选项。
此参数值体现在/proc/net/bonding/bond0的Min links字段中。

fail_over_mac
此参数只对mode=1(active-backup)有效。
指定mac地址的设置策略。
可选值:
none 或 0(缺省默认值):bond和所有slave都共用一个相同的mac地址(bond启用时Currently Active Slave的mac地址),故障切换时,bond的mac地址就能对外保持不变。
active 或 1:每个slave都使用其原本的mac地址,bond的mac地址等于Currently Active Slave的,每次故障切换时,bond的mac地址就会变成新的Currently Active Slave的,即bond的mac地址对外随之变化。主要用于系统驱动不支持修改设备mac地址的情况。
follow or 2:每个slave都使用其原本的mac地址,bond的mac地址等于Currently Active Slave的,每次故障切换时,新选出的Currently Active Slave的mac地址会变成bond的,这样bond的mac地址就能对外保持不变。
此参数值体现在/proc/net/bonding/bond0的Bonding Mode字段中。

[root@localhost ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active)
...

all_slaves_active
默认值是0,表示丢弃重复包。
指定重复包(即在inactive slave上收到的数据包)是否丢弃。

resend_igmp
指定发生故障转移时,向组播成员发送IGMP报告包的数量。这个选项对于mode=0(balance-rr)、mode=1(active-backup)、mode=5(balance-tlb)、mode=6(balance-alb)非常有用。
默认值为1。可选值为0-255。0表示发生故障转移时,不向组播成员发送任何IGMP报告包。

packets_per_slave
此参数只对mode=0(balance-rr)有效。
指定在一个slave上发送多少数据包后才转移到下一个slave上发送。
默认值是1。可选值是0-65535。0表示随机选择slave。

lp_interval
此参数只对mode=5(balance-tlb)、mode=6(balance-alb)有效。
指定bonding驱动程序向slave的对端交换机发送学习包(learning packets)的间隔秒数。
默认值为1。可选值为1-0x7fffff 。

tlb_dynamic_lb
此参数只对mode=5(balance-tlb)、mode=6(balance-alb)有效。
指定是否动态分配流量。
默认值为1。
可选值:
1 (缺省默认值),表示使用动态策略分配流量,即根据每个slave的速度计算其当前负载,分配发送流量,这样的负载均衡效果更好,但是可能导致数据包重新排序(packet reordering)。如果重新排序的问题对你来说很重要,则需要设置tlb_dynamic_lb = 0。
0 表示禁用动态策略,只根据xmit-hash-policy分配发送流量,不会考虑slave的当前负载。

参考文献

  1. Red Hat Enterprise Linux7 >> Networking Guide >> Chapter 7. Configure Network Bonding
  2. https://www.kernel.org/doc/Documentation/networking/bonding.txt
  3. Kernel module (简体中文)

Linux网卡bond相关推荐

  1. Linux 网卡 bond 的七种模式详解

    点击下方"民工哥技术之路",选择"设为星标" 回复"1024"获取独家整理的学习资料! 像Samba.Nfs这种共享文件系统,网络的吞吐量非 ...

  2. linux网卡Bond模式

    运行环境:centos6:centos7 :vmware 一.Bond模式介绍 网卡Bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡.通过Bond技术让多块网卡看起来 ...

  3. Linux bond6配置文件,Linux网卡bond

    网卡bond的模式 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6. 常用的有三种: mode=0:平衡负载模式,有自动备援,但 ...

  4. linux中bond网卡是什么意思,linux 网卡bond

    SCC(超级计算集群)简介 SCC概述 超级计算集群(Super Computing Cluster,SCC)使用高速RDMA网络互联的CPU以及GPU等异构加速设备,面向高性能计算.人工智能/机器学 ...

  5. linux关闭bond网卡,Linux 网卡Bond

    服务器共四块网卡,现要将四块网绑,进行两两绑定,只简单介绍实践过程. 说明:网卡绑定有多种模式,详细信息请google 在Linux系统下实现网卡绑定的步骤: 1.在/ect/sysconfig/ne ...

  6. 0网卡开启_中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程

    中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程.所谓bond,就是把多个物理网卡绑定成一个逻辑网卡,使用同一个IP工作,在增加带宽的同时也可以提高冗余性,一般使用较多的就是来提 ...

  7. linux网卡汇聚模式,Linux网卡聚合 linux多网卡绑定聚合之bond模式原理

    Linux网卡聚合 linux多网卡绑定聚合之bond模式原理 发布时间:2014-10-14 09:44:35   作者:佚名   我要评论 将多个Linux网络端口绑定为一个,可以提升网络的性能, ...

  8. Linux虚拟网卡bond配置

    目录 一.bond概述 1.1.bond的优点 二.bond模式 2.1.mode=0 2.2.mode=1 2.3.mode=2 2.4.mode=3 2.5.mode=4 2.6.mode=5 2 ...

  9. linux bond 网卡带宽,实战网卡bond

    本文由LinuxProbe.Com团队成员左国才整理发布, 一.什么是网卡bond 所谓bond,就是把多个物理网卡绑定成一个逻辑上的网卡,使用同一个IP工作,在增加带宽的同时也可以提高冗余性,一般使 ...

  10. 【干货】Linux 网卡绑定的相关知识和技巧

    原理知识 Linux 多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用 ...

最新文章

  1. 波士顿房价预测学习项目笔记
  2. corn java 可配置_SpringBoot——目前Java开发最流行的框架(四)
  3. MySQL 如何优化 CPU 消耗?
  4. C语言经典例97-输入字符写入文件
  5. 解决ubuntu的chkconfig[/sbin/insserv 无法找到路径问题]
  6. Steve Lin:如何撰写一篇优秀的SIGGRAPH论文
  7. 阿里主管通知我试用期延期……
  8. java中gc触发的条件,各种gc触发条件统计
  9. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)
  10. JVM&NIO&HashMap简单问
  11. 分享一下最近看的东西
  12. Spring IOC 概述
  13. PoEdu - C++阶段班【Po学校】- 第1课
  14. vscode 全局背景图片设置 background
  15. 晒往期云栖大会的照片或感想_赢2017杭州云栖大会门票
  16. 服务器中修改数据库配置,服务器修改数据库配置未生效
  17. 我和谷歌共成长-资深安卓开发的转型之路
  18. ncbi查找目的基因序列_干货 | 如何查找目标基因序列?掌握这几招就够了!(NCBI篇)...
  19. 老年人也能解决智能技术困难问题
  20. Android 复杂的手势处理利用GestureOverView

热门文章

  1. 12306智能刷票,订票
  2. uniapp中使用阿里云视频点播功能
  3. At least one JAR was scanned for TLDs yet contained no TLDs.问题解决方式
  4. MySQL优化之hints
  5. mysql入门1:建表、插入、单表查询练习题1
  6. Airflow实战--获取REST参数并通过Xcom传递给Bash算子
  7. 数据库之MySQL日志管理、备份与恢复
  8. (四)git储藏与清理
  9. 技能竞赛中职计算机课程建设,从计算机辅助设计(工业产品CAD)竞赛谈中职学校计算机应用专业建设.pdf...
  10. 【7gyy】解决Win8没声音,无法联网,分辨率问题的方法