关于linux:Linux-网卡-bond-的七种模式详解

12次阅读

共计 5824 个字符,预计需要花费 15 分钟才能阅读完成。

像 Samba、Nfs 这种共享文件系统,网络的吞吐量十分大,就造成网卡的压力很大,网卡 bond 是通过把多个物理网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载平衡,具体的性能取决于采纳的哪种模式。

一、bond 的七种模式介绍:

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 个口只占了小局部流量。

mode5 和 mode6 不须要交换机端的设置,网卡能主动聚合。mode4 须要反对 802.3ad。mode0,mode2 和 mode3 实践上须要动态聚合形式。

但实测中 mode0 能够通过 mac 地址坑骗的形式在交换机不设置的状况下不太平衡地进行接管。

二、bond 的配置实例

1、首先要看 linux 是否反对 bonding, 大部分发行版都反对
# modinfo bonding |more
filename:       /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/bonding/bonding.ko
author:         Thomas Davis, tadavis@lbl.gov and many others
description:    Ethernet Channel Bonding Driver, v3.6.0
version:        3.6.0
license:        GPL
srcversion:     353B1DC123506708446C57B
depends:        8021q,ipv6
vermagic:       2.6.32-431.el6.x86_64 SMP mod_unload modversions

如输入以上信息,则阐明反对 bonding,如果没有, 阐明内核不反对 bonding, 须要从新编译内核

2、网卡配置文件

两个物理网口别离是:eth0,eth1 绑定后的虚构口是:bond0

[root@jacken ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
HWADDR=EC:F4:BB:DC:4C:0C
TYPE=Ethernet
UUID=669f0694-9c52-4792-bd67-22c9d2c17acb
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
[root@jacken ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
HWADDR=EC:F4:BB:DC:4C:0D
TYPE=Ethernet
UUID=1d2f30f4-b3f0-41a6-8c37-54f03115f7bd
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
[root@jacken ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
NAME='System bond0'
TYPE=Ethernet
NM_CONTROLLED=no
USERCTL=no
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.1.100
NETMASK=255.255.255.0
BONDING_OPTS='mode=1 miimon=100'
IPV6INIT=no

开机主动加载模块到内核

#echo 'alias bond0 bonding' >> /etc/modprobe.d/dist.conf
#echo 'options bonding mode=0 miimon=200' >> /etc/modprobe.d/dist.conf
#echo 'ifenslave bond0 eth0 eth1' >>/etc/rc.local
miimon=100

每 100 毫秒 (即 0.1 秒) 监测一次路连贯状态,如果有一条线路不通就转入另一条线路;Linux 的多网卡绑定性能应用的是内核中的 ”bonding” 模块

如果批改为其它模式,只须要在 BONDING_OPTS 中指定 mode=Number 即可。USERCTL=no – 是否容许非 root 用户管制该设施

查看 bond0 状态:能够看到调用的是哪几个物理网卡

#cat /proc/net/bonding/bond0
[root@compute05 ~]#  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
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: ec:f4:bb:dc:4c:0c
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: ec:f4:bb:dc:4c:0d
Slave queue ID: 0

三、扩大

上边是两个网卡 (eth0、eth1) 绑定成一个 bond0,如果咱们要设置多个 bond 口,比方物理网口 eth0 和 eth1 组成 bond0,eth2 和 eth3 组成 bond1,那么网口设置文件的设置办法和下面

是一样的,只是 /etc/modprobe.d/dist.conf 文件就不能叠加了。正确的设置办法有两种:

  • 1、第一种
alias bond0 bonding
alias bond1 bonding
options bonding max_bonds=2 miimon=200 mode=1

这样所有的绑定只能应用一个 mode 了。

  • 2、第二种
alias bond0 bonding
options bond0 miimon=100 mode=1
install bond1 /sbin/modprobe bonding -o bond1 miimon=100 mode=0
install bond2 /sbin/modprobe bonding -o bond2 miimon=100 mode=1
install bond3 /sbin/modprobe bonding -o bond3 miimon=100 mode=0

这种形式不同的 bond 口能够设定为不同的 mode, 留神开机主动启动 /etc/rc.d/rc.local 文件的设置

ifenslave bond0 eth0 eth1
ifenslave bond1 eth2 eth3
ifenslave bond2 eth4 eth5
ifenslave bond3 eth6 eth7

作者:Jacken_yang
出处:https://blog.51cto.com/linuxn…

正文完
 0