Linux Bonding介绍及在虚拟网络设备中的应用

每天读一篇一线开发者原创好文

Linux Bonding介绍及在虚拟网络设备中的应用

简介

Linux bonding驱动提供了一种方法,用以把多个网络接口(network interface)组合成一个逻辑的”bonded”接口。Bonded接口的工作方式取决于驱动的模式:不同的模式提供了热备份或负载均衡等不同的服务。此外,驱动还会监控链路的可用性。

1. Bonding驱动选项

大多数目前发布的Linux内核都以模块(module)方式带了bonding驱动。Bonding驱动的选项是通过在加载时指定参数来设定的。有些参数必须要正确的设定,比如miimon,否则在链接故障时会导致严重的网络性能退化。

具体的主要参数列表:

downdelay

指定一个时间,用于在发现链路故障后,等待一段时间然后禁止一个slave,单位是毫秒(ms)。该选项只对miimon监控有效。downdelay值应该是miimon值的整数倍,否则它将会被取整到最接近的整数倍,缺省值为0。

updelay

当发现一个链路恢复时,在激活该链路之前的等待时间,以毫秒计算。该选项只对miimon链路侦听有效。updelay应该是miimon值的整数倍,如果不是,它将会被向下取整到最近的整数。缺省值为0。指定

miimon

指定MII链路监控频率,单位是毫秒(ms)。这将决定驱动检查每个slave链路状态频率。0表示禁止MII链路监控。100可以作为一个很好的初始参考值。

primary

指定哪个slave成为主设备(primary device),取值为字符串,如eth0,eth1等。只要指定的设备可用,它将一直是激活的slave。只有在主设备(primary device)断线时才会切换设备。这在希望某个slave设备优先使用的情形下很有用,比如,某个slave设备有更高的吞吐率。primary选项只对active-backup模式有效。

mode

指定bonding的策略。缺省是balance-rr (round robin,循环赛)。可选的mode包括:

balance-rr 或者 0

Round-robin(循环赛)策略:按顺序传输数据包,从第一个可用的slave到最后一个可用的slave。该模式提供了负载均衡和容错机制。

active-backup 或者 1

Active-backup(激活-备份)策略:只有一个slave是激活的(active)。其他的slave只有在当前激活的slave故障后才会变为激活的(active)。从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。

balance-xor 或者 2

XOR策略:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定。该模式提供了负载均衡和容错机制。

broadcast 或者 3

Broadcase(广播)策略:在每个slave接口上传输每个数据包。该模式提供了容错机制。

802.3ad 或者 4

IEEE 802.3ad Dynamic link aggregation(动态链接聚合)。创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应性。

必要条件:

ethtool支持获取每个slave的速率和双工设定;

switch(交换机)支持IEEE 802.3ad Dynamic link aggregation。

balance-tlb 或者 5

自适应的传输负载均衡:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。

必要条件:ethtool支持获取每个slave的速率。

balance-alb 或者 6

自适应均衡负载:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。

必要条件:

ethtool支持获取每个slave的速率;

底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个bond中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的curr_active_slave接管。

2. 配置Bonding设备

我们可以使用以下方式配置Bonding设备:1、使用Sysconfig配置;2、使用Initscripts配置;3、通过Ifenslave手动配置;4、通过Sysfs手工配置;5、通过ip link命令配置。本文只介绍通过第4、5种方法配置Bonding。

2.1 通过Sysfs手工配置

Sysfs接口允许在不卸载模块的情况下动态配置所有bonds,它也可以在运行时增加和移除bonds。如需配置bonding,必须mount了sysfs文件系统。本文里的示例假定在标准的sysfs的mount点,即/sys。

创建和销毁Bond

增加一个新的bond(bond0):

移除一个已存在的bond(bond0):

显示所有存在的bonds:

增加和移除Slaves

通过使用文件/sys/class/net//bonding/slaves,可以把网络接口从属于某个bond,这个文件的语义和bonding_masters文件完全相同。

把eth0加入bond(bond0):

从bond(bond0)里移除eth0:

注意:bond必须在slave加入之前启动,所有slave必须在bond接口断开前移除。

改变Bond的配置

每个bond可以独立地配置,通过操纵位于/sys/class/net//bonding下的文件。这些文件的名字直接对应于本文里描述的命令行参数。可以直接把对应文件cat出来看当前的设置。

把bond0配置为active-backup模式:

或者

注意:在修改模式前,请先断开bond接口。

在bond0上启用MII监控,使用1秒的时间间隔:

设置主备模式bond0的primary设备为eth0:

2.2 通过ip link命令配置

iproute2的3.10版本之后增加了对bond功能的支持,之前的版本不支持,如果要使用ip link命令配置bond,需要升级版本。

创建和销毁Bond

增加一个新的bond(bond0):

移除一个已存在的bond(bond0):

增加和移除Slaves

把eth0加入bond(bond0):

从bond(bond0)里移除eth0:

改变Bond的配置

把bond0配置为active-backup模式:

或者

注意:在修改模式前,请先移除bond上的所有slaves。

在bond0上启用MII监控,使用1秒的时间间隔:

设置主备模式bond0的primary设备为eth0:

3. 配置示例

新建两个网络命名空间:blue和green;

新建两个虚拟网桥设备:br0和br1,并将它们用veth对连接;

新建veth对连接网络命名空间和虚拟网桥设备;

在两个网络命名空间中,分别新建bond设备:bond0和bond1,并配置属性;

为两个命名空间中的bond设备配置ip,进行ping包抓包测试。

创建网络命名空间blue和green

创建虚拟网桥br0和br1并激活

创建veth对,将blue与br0连接

创建veth对,将green与br1连接

创建veth对,将br0与br1连接

分别在命名空间blue和green中,创建bond0和bond1

将bond设备设置为主备模式

设置bond设备的miimon、updelay和downdelay

为bond设备增加slaves

为bond设备设置primary

为bond设备设置ip地址

从blue向green进行ping包及抓包测试

注意:只有在bond1和veth3.1上才能抓到包,因为我们设置了veth3.1为主口。

将green中的主口设置为down状态,进行ping包抓包测试

注意:veth3.1状态为down,veth4.1切换为主口,此时,在bond1及veth4.1上能抓到包。

将green中的veth3.1设置为up状态,进行ping包抓包测试

注意:由于我们设置bond1的primary为veth3.1,驱动每隔1000ms的miimon时间检测链路状态,若检测到veth3.1正常时,等待1000ms的updelay时间,便切换主口为veth3.1,此时,在bond1及veth3.1上能抓到包。

4. 查询Bonding配置

4.1 Bonding配置

每个bonding设备对应于一个只读文件,存在/proc/net/bonding目录,文件内容包括bonding配置的信息,选项以及每个slave的状态。

上述实例blue网络命名空间中,加载驱动后,/proc/net/bonding/bond0的内容为:

4.2 网路配置

网络配置可以通过ifconfig命令查看,Bonding设备会设上MASTER标记,slave设备会设上SLAVE标记。ifconfig的输出不包含哪个slave关联于哪个master的关系。

在上例中,bond0接口是master(MASTER),而veth1.1和veth2.1是slave(SLAVE)。注意除了TLB和ALB模式外,所有bond0的slave和bond0有着同样的MAC地址(HWaddr),TLB和ALB需要每个slave有独立的MAC地址。

5. go语言下netlink包实现Bonding

go语言下开源工具包netlink,提供了简单的netlink库。该库提供了linux下用户空间程序与内核通信的接口,可以用于增加删除网络设备等操作。我们可以调用该库函数增加删除bond设备。

6. 交换机配置

active-backup、balance-tlb和balance-alb模式不需要对交换机做任何的配置。802.3ad模式需要交换机有对应的配置为802.3ad聚合的端口,具体的配置方法因交换机类型而异。

balance-rr、balance-xor和broadcast模式通常需要交换机对应的端口被分组在一起,不同的交换机对分组有着不同的命名。对于这些模式,每个交换机也会有它自己的针对到bond的传输策略的配置选项。典型的选择包括对每个MAC地址或者IP地址进行XOR操作,两端的传输策略不一定完全一致。对这三种模式,bonding模式会针对一个EtherChannel组选择一种传输策略;所有这三种模式都会和另一个EtherChannel组进行互操作。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180117B0MWW000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券