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章节提及的包乱序问题。不同的实现可能会有不同的适应性。

    必要条件:

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

  2. 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的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。

    必要条件:

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

    2. 底层驱动支持设置某个设备的硬件地址,从而使得总是有个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):

      
      
    1. echo +bond0 > /sys/class/net/bonding_masters

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

      
      
    1. echo -bond0 > /sys/class/net/bonding_masters

    显示所有存在的bonds:

      
      
    1. cat /sys/class/net/bonding_masters

    增加和移除Slaves

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

      
      
    1. ifconfig bond0 up

    2. echo +eth0 > /sys/class/net/bond0/bonding/slaves

    从bond(bond0)里移除eth0:

      
      
    1. echo -eth0 > /sys/class/net/bond0/bonding/slaves

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


    改变Bond的配置

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

      
      
    1. ifconfig bond0 down

    2. echo 1 > /sys/class/net/bond0/bonding/mode

    或者

      
      
    1. echo active-backup > /sys/class/net/bond0/bonding/mode

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

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

      
      
    1. echo 1000 > /sys/class/net/bond0/bonding/miimon

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

      
      
    1. echo eth0 > /sys/class/net/bond0/bonding/primary

    2.2 通过ip link命令配置

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


    创建和销毁Bond

    增加一个新的bond(bond0):

      
      
    1. ip link add bond0 type bond

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

      
      
    1. ip link delete bond0

    增加和移除Slaves

    把eth0加入bond(bond0):

      
      
    1. ip link set eth0 master bond0

    从bond(bond0)里移除eth0:

      
      
    1. ip link set eth0 nomaster

    改变Bond的配置

    把bond0配置为active-backup模式:

      
      
    1. ip link set bond0 type bond mode active-backup

    或者

      
      
    1. ip link set bond0 type bond mode 1

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

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

      
      
    1. ip link set bond0 type bond miimon 1000

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

      
      
    1. ip link set bond0 type bond primary eth0

    3. 配置示例

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

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

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

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

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



    创建网络命名空间blue和green

      
      
    1. ip netns add blue

    2. ip netns add green

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

      
      
    1. ip link add br0 type bridge

    2. ip link add br1 type bridge

    3. ip link set br0 up

    4. ip link set br1 up

    创建veth对,将blue与br0连接

      
      
    1. ip link add veth1.1 type veth peer name veth1.2

    2. ip link add veth2.1 type veth peer name veth2.2

    3. ip link set veth1.1 netns blue

    4. ip link set veth2.1 netns blue

    5. ip link set veth1.2 master br0

    6. ip link set veth2.2 master br0

    创建veth对,将green与br1连接

      
      
    1. ip link add veth3.1 type veth peer name veth3.2

    2. ip link add veth4.1 type veth peer name veth4.2

    3. ip link set veth3.1 netns green

    4. ip link set veth4.1 netns green

    5. ip link set veth3.2 master br1

    6. ip link set veth4.2 master br1

    创建veth对,将br0与br1连接

      
      
    1. ip link add veth5.1 type veth peer name veth5.2

    2. ip link set veth5.1 master br0

    3. ip link set veth5.2 master br1

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

      
      
    1. ip netns exec blue ip link add bond0 type bond

    2. ip netns exec green ip link add bond0 type bond

    将bond设备设置为主备模式

      
      
    1. ip netns exec blue ip link set bond0 type bond mode 1

    2. ip netns exec blue ip link set bond1 type bond mode 1

    设置bond设备的miimon、updelay和downdelay

      
      
    1. ip netns exec blue ip link set bond0 type bond miimon 1000

    2. ip netns exec blue ip link set bond0 type bond updelay 1000

    3. ip netns exec blue ip link set bond0 type bond downdelay 1000

    4. ip netns exec green ip link set bond1 type bond miimon 1000

    5. ip netns exec green ip link set bond1 type bond updelay 1000

    6. ip netns exec green ip link set bond1 type bond downdelay 1000

    为bond设备增加slaves

      
      
    1. ip netns exec blue ip link set veth1.1 master bond0

    2. ip netns exec blue ip link set veth2.1 master bond0

    3. ip netns exec green ip link set veth3.1 master bond0

    4. ip netns exec green ip link set veth4.1 master bond0

    为bond设备设置primary

      
      
    1. ip netns exec blue ip link set bond0 type bond primary veth1.1

    2. ip netns exec green ip link set bond1 type bond primary veth3.1

    为bond设备设置ip地址

      
      
    1. ip netns exec blue ip addr add 192.168.1.2/24 dev bond0

    2. ip netns exec green ip addr add 192.168.1.3/24 dev bond1

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

      
      
    1. ip netns exec blue ping 192.168.1.3

    2. ip netns exec green tcpdump -i bond1

    3. ip netns exec green tcpdump -i veth3.1

    4. ip netns exec green tcpdump -i veth4.1

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


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

      
      
    1. ip netns exec green ip link set veth3.1 down

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


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

      
      
    1. ip netns exec green ip link set veth3.1 up

    注意:由于我们设置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的内容为:

      
      
    1. Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

    2. Bonding Mode: fault-tolerance (active-backup)

    3. Primary Slave: veth1.1 (primary_reselect always)

    4. Currently Active Slave: veth1.1

    5. MII Status: up

    6. MII Polling Interval (ms): 1000

    7. Up Delay (ms): 1000

    8. Down Delay (ms): 1000

    9. Slave Interface: veth1.1

    10. MII Status: up

    11. Speed: 10000 Mbps

    12. Duplex: full

    13. Link Failure Count: 0

    14. Permanent HW addr: 52:49:3a:b5:37:d7

    15. Slave queue ID: 0

    16. Slave Interface: veth2.1

    17. MII Status: up

    18. Speed: 10000 Mbps

    19. Duplex: full

    20. Link Failure Count: 0

    21. Permanent HW addr: 52:0c:9a:f4:25:5b

    22. Slave queue ID: 0

    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地址。

      
      
    1. bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500

    2.        inet 192.168.1.2  netmask 255.255.255.0  broadcast 192.168.1.255

    3.        inet6 fe80::b8a7:7cff:fe5a:793d  prefixlen 64  scopeid 0x20<link>

    4.        ether 52:49:3a:b5:37:d7  txqueuelen 1000  (Ethernet)

    5.        RX packets 232  bytes 21768 (21.2 KiB)

    6.        RX errors 0  dropped 0  overruns 0  frame 0

    7.        TX packets 211  bytes 20218 (19.7 KiB)

    8.        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    9. veth1.1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500

    10.        ether 52:49:3a:b5:37:d7  txqueuelen 1000  (Ethernet)

    11.        RX packets 250  bytes 23272 (22.7 KiB)

    12.        RX errors 0  dropped 0  overruns 0  frame 0

    13.        TX packets 223  bytes 21146 (20.6 KiB)

    14.        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    15. veth2.1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500

    16.        ether 52:49:3a:b5:37:d7  txqueuelen 1000  (Ethernet)

    17.        RX packets 21  bytes 1594 (1.5 KiB)

    18.        RX errors 0  dropped 0  overruns 0  frame 0

    19.        TX packets 8  bytes 648 (648.0 B)

    20.        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    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组进行互操作。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值