Liunx网卡绑定(Bond0-6)原理

在我所处的项目中,为节约硬件开支,使用了聚合模式bond4,动态的聚合了4X10G网口,使总带宽可达到40G,为了达到40G网络带宽效果,我进行了以下测试,发现来自于同一个IP的流量永远分配到同一个物理的网卡上,也就是说出口流量最多10G, 但是同时使用四个不同的IP的流量就可以平均的分配到4个网卡上,那么这是为什么呢?我们一探究竟。

测试环境:  

server端:  iperf3  -s

client端:   iperf3  -c  server端地址  -t  6000     -i 10

服务器网卡: 4 X 10GB 

bonding模式: 

mode:bond4  

xmit_hash_policy: lay2  默认模式

1. 网卡绑定原理

在正常情况下,网卡的工作模式为直接模式(Direct Model),该模式下的网卡只接收目地址是自己 Mac地址的帧。将别的数据帧都滤掉,以减轻驱动程序的负担。但是网卡也支持另外一种混杂模式,可以接收网络上所有的帧。

Bonding运行在这个模式下,使用两块网卡虚拟成为一块网卡,这个聚合起来的设备看起来是一个单独的以太网接口设备,通俗点讲就是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作。物理网卡把相应的数据帧传送给bond驱动程序处理。通过网卡绑定可以实现网络设备的冗余和负载均衡。
 

2. 绑定的类别

2.0. Bond0 :Round-robin(平衡轮循策略)

特点:传输数据包顺序是依次传输(即:第1个包走ens33,下一个包就走ens34….一直循环下去,直到最后一个传输完毕),此模式提供负载平衡。

缺点:我们知道如果一个连接或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降。

2.1. Bond1 :Active-backup(主-备份策略)

特点:只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。Mac地址是外部可见得,从外面看来,bond的Mac地址是唯一的,以避免交换机发生混乱。此模式只提供了容错能力,提供高网络连接的可用性。

缺点:资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N。


2.2. Bond2 :Balance-xor(平衡策略)

特点:基于指定的传输策略传输数据包。通过xmit_hash_policy配置项来确定具体的传输策略。默认为异或哈希负载分担(XOR Hash)。此模式提供负载平衡和容错能力。
异或哈希负载分担规则:选择网卡的序号 = (源MAC地址 XOR 目标MAC地址) % Slave网卡数量。
该策略算法概述:在接收和发送数据时,Bond通过异或哈希算法对需要调度的Slave进行选择,其中使用哈希的目的是为了数据的分布尽量分散到各个Slave上,从而实现负载均衡;使用XOR异或的目的是为了避免哈希冲突(例如我们使用平方取中法等方法目的是为了避免冲突,优化哈希查找效率),从而实现负载均衡的优化。
 

# 异或哈希负载均衡工作原理
举个例子:
此时BOND2的MAC为AA,BOND2中有四个Slave,编号为Slave_0,1,2,3
此时BOND2从网络上收到MAC地址为BB的数据帧,根据异或哈希计算出哈希:( AA XOR BB ) % 4 = 1
AA	| 1010 1010	   
BB	| 1011 1011	
XOR	| 0001 0001 -> 16+1 -> 17   #这里使用XOR 取出AA和BB二进制中位数的不同的位置为1,相同为0。
17 % 4 = 1
那么该数据就会交由Slave_1处理,而且之后的同样来自于该MAC地址的数据依然交由Slave_1处理。其他MAC地址的数据将大概率分配到Slave_0,2,3,小概率分配到Slave_1。
对于不同来源的MAC的数据,异或哈希能很平均地分担到各个网卡。


这里AA我们只是简单的示例,真正的MAC地址会是类似这样:
54-89-98-9E-26-6B  -----16进制
转化为二进制是:01010100-10001001-10011000-10011110-00100110-01101011 ----2进制

MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址,其中前3个字节,16进制数00-16-EA代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后3个字节,16进制数AE-3C-40代表该制造商所制造的某个网络产品(如网卡)的系列号。只要不更改自己的MAC地址,MAC地址在世界是唯一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性

Q1:为什么是XOR异或,如果用与或呢?
A1:因为在数学方面来说,与或的真值分布不均匀,与(同1出1 1的分布为25%),或(同0出 0的分布为25%),而异或能保证50%:50%的分布,可以保证哈希过程中更好的随机性,进而避免了哈希冲突发生的概率。

Q2:既然通过异或哈希实现了负载均衡,那么Bond2怎样实现了冗余?
A2:在Bond2中,异或哈希算法是对Slave数量取余,其实是对当前活动的Slave取余,如果对于正常运行状态的4个Slave的Bond2,其中Slave_1宕掉了,此时Slave数量会变为3,同时Slave的顺位也发生变化:
[ 0 1 2 3 ] 正常状态-> [ 0 2 3 ] Slave1宕 -> [ 0 1 2 ] 新正常状态
此时原本分配给Slave_1的数据由新的Slave_1接收。
 

Bond2中通过xmit_hash_policy指定Slave调度策略,默认为上边讲到的layer2,即仅用MAC地址作为区分数据分配的依据。可以增加对IP层,应用层的过滤,保证来自不同IP的数据,甚至来自不同端口的数据都能分配到不同的Slave当中去,进而实现更好的负载均衡,当然也要更具服务器的具体情况来设置最合适的负载均衡策略。至于该配置项在哪里进行配置,在后边的绑定实现中会讲。
 

xmit_hash_policy配置项:

xmit_hash_policy=layer2
(source MAC XOR destination MAC) % slave数量
解释:使用硬件MAC地址的XOR来生成哈希

xmit_hash_policy=layer2+3
(((source IP XOR destination IP) AND 0xffff) XOR ( source MAC XOR destination MAC )) % slave数量
解释:使用硬件 MAC 地址及 IP 地址生成哈希

xmit_hash_policy=layer3+4
((source port XOR dest port) XOR((source IP XOR dest IP) AND 0xffff)% slave数量
解释:使用硬件 端口号 及 IP 地址生成哈希

2.3. Bond3 :Broadcast(广播策略)

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

2.4. Bond4 :IEEE 802.3ad(动态链接聚合)

特点:启动时会根据IEEE 802.3ad规范创建一个聚合组。使用动态链接聚合策略,所有Slave网卡共享同样的速率和双工设定。
​ 必要条件:
​ 1.支持使用ethtool工具获取每个slave网卡的速率和双工设定;
​ 2.需要交换机支持IEEE 802.3ad 动态链路聚合(Dynamic link aggregation)模式
​ IEEE 802.3ad规范:
​ IEEE 802.3ad主要是对链路聚合控制协议进行了一定的标准和规范。

​ 链路聚合,又称端口聚合、端口捆绑技术。功能是将交换机的多个低带宽端口捆绑成一条高带宽链路,同时通过几个端口进行链路负载均衡,避免链路出现拥塞现象。

2.5. Bond5 :Balance-tlb(适配器传输负载均衡)


特点:是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。该模式要求slave接口的设备驱动有ethtool支持。​不需要交换机支持。在每个slave上根据当前的负载(根据速度计算)分配外出流量。
​必要条件:ethtool支持获取每个slave的速率。
缺点:不支持发送负载均衡

2.6. Bond6 :Balance-alb(适配器适应性负载均衡)
 

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

缺点:ARP协商中存在一些问题(未深入了解,仅列出)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux网卡绑定bond配置是指将两个网卡绑定在一起,形成一个虚拟的网络接口,以提高网络带宽和可靠性。具体配置步骤如下: 1. 安装bonding驱动:在Linux系统中,需要安装bonding驱动,以支持网卡绑定功能。 2. 配置网络接口文件:在/etc/network/interfaces文件中,添加bond0虚拟接口的配置信息,包括IP地址、子网掩码、网关等。 3. 配置bonding模式:根据实际需求,选择不同的bonding模式,如负载均衡、容错等。 4. 配置网卡参数:在每个物理网卡的配置文件中,添加bond0虚拟接口的配置信息,包括bonding模式、MAC地址等。 5. 重启网络服务:完成以上配置后,需要重启网络服务,使配置生效。 总之,Linux网卡绑定bond配置可以提高网络带宽和可靠性,适用于需要高速、稳定网络连接的场景。 ### 回答2: 在Linux系统中,一个网卡对应一个IP地址,如果需要提升网络带宽和可靠性,可以将多个网卡绑定成一个逻辑网卡。这种方案被称为双网卡绑定(bond)。 双网卡绑定可以使用不同的模式,包括负载均衡(balance-rr)、主从备份(active-backup)、链路聚合(802.3ad)、广播(broadcast)和ABI(adaptive transmit load balancing)。其中,最常见的是链路聚合(LACP)。 在Linux系统中,双网卡绑定的配置需要依赖bonding驱动程序。该驱动程序是一个内核模块,需安装到Linux内核中。 双网卡绑定的配置步骤如下: 1. 安装bonding驱动程序:进入Linux系统后,首先需要安装bonding驱动程序。可以使用yum或apt-get等软件包管理器进行安装。 2. 配置bonding接口:可以使用编辑器打开/etc/network/interfaces文件,添加bonding接口的配置。例如: auto bond0 iface bond0 inet static address 192.168.10.10 netmask 255.255.255.0 gateway 192.168.10.1 dns-nameservers 8.8.8.8 slaves eth0 eth1 bond-mode 802.3ad bond-miimon 100 bond-downdelay 200 bond-updelay 200 bond-lacp-rate 1 上面的配置中,bond0是逻辑网卡的接口名,inet static表示使用静态IP地址,address是逻辑网卡的IP地址,slaves指定了两个物理网卡的接口名,bond-mode指定了使用的绑定模式(这里是链路聚合),bond-miimon指定了心跳检查间隔,bond-downdelay和bond-updelay指定了网卡掉线和恢复上线的时间,bond-lacp-rate指定了LACP帧发送的频率。 3. 配置物理网卡:编辑/etc/network/interfaces文件,为每个物理网卡分别配置IP地址。例如: auto eth0 iface eth0 inet manual auto eth1 iface eth1 inet manual 上面的配置中,inet manual表示不使用IP地址,而是由bonding驱动程序控制。 4. 重新启动网络服务:保存配置文件后,需要重新启动网络服务。 5. 验证双网卡绑定:可以使用ifconfig命令查看bond0的状态和IP地址,使用ping命令测试网络连接性。 通过以上步骤,就可以在Linux系统中实现双网卡绑定,并提升网络带宽和可靠性。需要注意的是,配置过程中需要正确选择绑定模式、心跳检查间隔和帧发送频率等参数,以保证系统的稳定性和性能。 ### 回答3: Linux网卡绑定(Bond)是一种使多个物理NIC卡(网卡)成为虚拟的单一逻辑网络接口的技术。这种技术被广泛用于大型企业环境中的服务器和存储系统中,以提高服务器的带宽和可靠性。下面我们来介绍一下Linux网卡绑定(Bond)的配置方法。 一、确认硬件和系统版本 首先需要确认计算机硬件中是否有双网卡并且工作正常,以及操作系统和Linux内核版本是否支持bond。 二、加载bond驱动 在Linux中加载bond驱动,输入modprobe bonding则会加载bonding驱动。 三、创建bond接口 使用ifconfig命令创建bond接口,例如: ifconfig bond0 192.168.0.1 netmask 255.255.255.0 其中bond0为创建的bond接口名称,192.168.0.1为bond接口IP地址,netmask为子网掩码。 四、配置bond参数 可以使用echo命令将bond参数写入/proc/sys/net/ipv4/conf/bond0目录中,例如: echo 1 > /proc/sys/net/ipv4/conf/bond0/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/bond0/arp_announce 以上命令设置bond0接口: arp_ignore=1时,代表接收来自其他接口的ARP请求并且响应请求。此为基础设置。 arp_announce=2时,代表bond0接口对外使用其MAC地址,这样在网络中就可以通过bond0接口来识别到所有的网卡,而不是单独识别每个物理网卡。 五、添加网卡绑定 使用ifenslave命令将物理网卡(如eth0和eth1)添加到bond接口中,例如: ifenslave bond0 eth0 eth1 以上命令将eth0和eth1网卡加入到bond0接口中。可以通过cat /proc/net/bonding/bond0查询bond0的状态。 以上是Linux网卡绑定(Bond)的配置方法,这种技术可以提高服务器的带宽和可靠性,可以在企业级应用和存储系统中使用。值得注意的是,绑定多个网卡后,如果有一张网卡故障,那么其他网卡可以继续工作,从而避免单点故障导致服务中断。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值