RHEL/CentOS-网卡bond

绑定模式和交换机

1
2
3
4
5
1、需要手工模式链路聚合:mode0,mode2;

2、需要LACP链路聚合:mode4;

3、无需任何配置的有:mode1(相同vlan),mode3(待确定),mode5,mode6。
  • Mode0

    blance-round-robin 配置手工模式链路聚合,服务器所绑定的网卡被修改成相同的MAC地址,轮询的方式比如第一个包走eth0,第二个包走eth1,需要交换机通过静态链路聚合与之对接。

  • Mode1

    active-backup 配置对接接口在同一个VLAN,服务器采用双网卡时,一个处于主状态,一个处于从状态,所有数据都通过主状态的端口传输。当主状态端口对应链路出现故障时,数据通过从状态端口传输。因此交换机对应的两个端口建议配置在同一个VLAN,无需其他配置。

  • Mode2

    blance-xor 平衡策略, 配置手工模式链路聚合,服务器的多网卡基于指定的HASH策略传输数据包,需要交换机配置静态链路聚合与之对接。

    基于HASH算法的负载均衡模式,网卡的分流按照xmit_hash_policy的TCP协议层设置来进行HASH计算分流,使各种不同处理来源的访问都尽量在同一个网卡上进行处理。

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

    xmit_hash_policy参数(此参数对mode2、4模式有影响):

    • layer1 - 通过MAC地址进行HASH计算。

      计算公式:(MACsrc⊕MACdest)% Nslave

    • layer3+4 - 通过TCP及UDP端口及其IP地址进行HASH计算。

      计算公式:((portsrc⊕portdest) ⊕ (IPsrc⊕IPdest)) % Nslave

  • Mode3

    broadcast 采用两台交换机对接且配置在不同VLAN,服务器的多网卡对于同一份报文会复制两份分别从两个端口传输,建议使用两台交换机,且配置不同VLAN与之对接,无需其他配置。

    所有被绑定的网卡都将得到相同的数据,一般用于十分特殊的网络需求,如需要对两个互相没有连接的交换机发送相同的数据。

    所有包从所有网络接口发出,这个不均衡,只有冗余机制,但过于浪费资源。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。需要和交换机的聚合强制不协商方式配合。

    特点:在每个slave接口上传输每个数据包,此模式提供了容错能力

    此模式未验证,有两种说法,一种说法是需要交换机静态聚合,一种说法是不需要。

  • Mode4

    802.3ad 即IEEE 802.3ad动态链路聚合,即LACP模式,服务器的多网卡采用LACP模式绑定,对应交换机应采用LACP模式的链路聚合与之对接。

    表示支持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. 交换机支持IEEE802.3ad Dynamic link aggregation
    3. 大多数交换机需要经过特定配置才能支持802.3ad模式
  • Mode5

    blance-tlb(transmit load balancing) 采用两台交换机对接,服务器的多网卡采用适配器传输负载均衡,交换机上不需进行配置。

    适配器输出负载均衡模式,输出的数据会通过所有被绑定的网卡输出,接收数据时则只选定其中一块网卡。如果正在用于接收数据的网卡发生故障,则由其他网卡接管,要求所用的网卡及网卡驱动可通过ethtool命令得到speed信息。

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

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

  • Mode6

    blance-alb(adaptive load balancing) 采用两台交换机对接,服务器的多网卡采用适配器适应性负载均衡,交换机上不需要进行配置。

    适配器输入/输出负载均衡模式,在mode5 tlb的基础上,在接收数据的同时实现负载均衡((接收负载均衡rlb-receiveload balance),除要求ethtool命令可得到speed信息外,还要求支持对网卡MAC地址的动态修改功能。

    不需要任何交换机的支持。接收负载均衡是通过ARP协商实现的。

    特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receiveload balance, rlb),而且不需要任何交换机的支持。接收负载均衡是通过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参数必须被设置为某个大于等于交换机转发延时的值,从而保证发往对端的ARP应答不会被交换机阻截。

模式选择建议

如果系统流量不超过单个网卡的带宽,请不要选择使用mode 1之外的模式,因为负载均衡需要对流量进行计算,这对系统性能会有所损耗。

建议mode 5mode 6只在交换机不支持port channel的情况下选用。

如果交换机及网卡都确认支持802.3ab,则实现负载均衡时尽量使用mode 4以提高系统性能。

bonding模块

1
2
3
4
5
6
7
lsmod | grep bonding
modinfo bonding

# RHEL5版本中还可能需要手动导入bonding模块
modprobe -i bonding max_bonds=1
# 如果需要多组bond,则max_bonds指定需要的bond组的数量
# 此时系统会发出一个警告,意思是bonding驱动要求提供miimon参数或arp_inerval参数与arp_ip_target参数的组合,否则系统将无法检测出网卡设备连接是否失效。由于miimon已经在/etc/sysconfig/network-scripts/ifcfg-bond0中设定,所以可以不用理会此警告。

加载模块,让系统支持bonding

CentOS7中测试无需以下配置来加载bonding模块,也可能跟在绑定配置文件中指定了相关参数有关,未实际测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 不存在的话,手动创建(也可以放在modprobe.d下面)
$ cat/etc/modprobe.conf
alias bond0 bonding
options bond0 miimon=100 mode=0
# 者使用/etc/modprobe.d/dist.conf文件也可以
$ cat /etc/modprobe.d/dist.conf
alias bond0 bonding
options bond0 miimon=200 mode=0

# 如果存在多个bond,比如bond0,bond1,bond2,则
# 方式1:所有的绑定使用相同的mode
$ cat /etc/modprobe.d/dist.conf
alias bond0 bonding
alias bond1 bonding
alias bond2 bonding
options bonding max_bonds=3 miimon=100 mode=0
# 方式2:不同的bond口可以设定为不同的mode,注意开机自动启动/etc/rc.d/rc.local文件的设置
$ cat /etc/modprobe.d/dist.conf
alias bond0 bonding
options bond0 miimon=100 mode=0 max_bonds=3

alias bond1 bonding
options bond1 miimon=100 mode=1 max_bonds=3

alias bond2 bonding
options bond2 miimon=100 mode=2 max_bonds=3

特别注意:如果在配置文件的options中没有max_bonds参数,就会出现下面的报错信息:Master 'bond1': Error: handshake with driver failed.因为在用modprobe加载bonding模块时,加上参数指定创建多少个bonding device,否则默认只会创建一个,就是bond0

已测试版本

  • RHEL/CentOS 5
  • RHEL/CentOS 6
  • RHEL/CentOS 7

ifcfg-bond0

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@rac1 network-scripts]# cat ifcfg-bond0 
DEVICE=bond0
TYPE=Ethernet # 可选
ONBOOT=yes
IPADDR=172.16.100.100
NETMASK=255.255.255.0
GATEWAY=172.16.100.254
BOOTPROTO=static
USERCTL=no
BONDING_OPTS="mode=0 miimon=100"

# mode 0 为负载模式,提供高带宽,miimon 链路检测时间间隔ms
# mode 1 为故障转移模式,active backup,"mode=0 miimon=200 primary=eth1"

ifcfg-ethx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@rac1 network-scripts]# cat ifcfg-eth0 
TYPE=Ethernet # 可选
BOOTPROTO=none # 可选
DEVICE=eth0 # 依据实际情况更改
ONBOOT=yes
USERCTL=no
HWADDR=E4:35:C8:7E:5D:B8 # 可选,当系统中有多个网卡需要进行设置时,建议将网卡的MAC地址与ethX文件中的HWADDR一一对应,否则系统重启后网卡的eth号很可能会发生改变,在设置了网卡绑定的生产系统中,这是非常危险的。
UUID=de3fb3d3-307f-4df6-8b5c-30037812c46a # 可选
NM_CONTROLLED=no # 可选
MASTER=bond0
SLAVE=yes # 可以没有此字段,就需要开机执行ifenslave bond0 eth0 eth1命令了,未测试

[root@rac1 network-scripts]# cat ifcfg-eth1 # 参照上面
DEVICE=eth1
HWADDR=E4:35:C8:7E:5D:B9
TYPE=Ethernet
UUID=702e7f66-450e-43b2-966e-78088a212121
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

查看

1
cat /proc/net/bonding/bond0