点击上方“中兴开发者社区”,关注我们
每天读一篇一线开发者原创好文
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):
echo +bond0 > /sys/class/net/bonding_masters
移除一个已存在的bond(bond0):
echo -bond0 > /sys/class/net/bonding_masters
显示所有存在的bonds:
cat /sys/class/net/bonding_masters
增加和移除Slaves
通过使用文件/sys/class/net//bonding/slaves,可以把网络接口从属于某个bond,这个文件的语义和bonding_masters文件完全相同。
把eth0加入bond(bond0):ifconfig bond0 up
echo +eth0 > /sys/class/net/bond0/bonding/slaves
从bond(bond0)里移除eth0:
echo -eth0 > /sys/class/net/bond0/bonding/slaves
注意:bond必须在slave加入之前启动,所有slave必须在bond接口断开前移除。
改变Bond的配置
每个bond可以独立地配置,通过操纵位于/sys/class/net//bonding下的文件。这些文件的名字直接对应于本文里描述的命令行参数。可以直接把对应文件cat出来看当前的设置。
把bond0配置为active-backup模式:ifconfig bond0 down
echo 1 > /sys/class/net/bond0/bonding/mode
或者
echo active-backup > /sys/class/net/bond0/bonding/mode
注意:在修改模式前,请先断开bond接口。
在bond0上启用MII监控,使用1秒的时间间隔:
echo 1000 > /sys/class/net/bond0/bonding/miimon
设置主备模式bond0的primary设备为eth0:
echo eth0 > /sys/class/net/bond0/bonding/primary
2.2 通过ip link命令配置
iproute2的3.10版本之后增加了对bond功能的支持,之前的版本不支持,如果要使用ip link命令配置bond,需要升级版本。
创建和销毁Bond
增加一个新的bond(bond0):
ip link add bond0 type bond
移除一个已存在的bond(bond0):
ip link delete bond0
增加和移除Slaves
把eth0加入bond(bond0):
ip link set eth0 master bond0
从bond(bond0)里移除eth0: