记录一个 arp 选择性不响应问题

图中有 四个 node,都具备同一张bond(双)网卡,但是实际测试的时候,发现node之间有些通,有些不通。

实线表示通的部分,虚线表示不通的部分。 实际抓包发现:

  • node1 --> node4: 抓到 node4 收到了 arp 请求包,但是没有抓到 reply 包
  • node2 --> node4: 抓到 node4 收到了 arp 请求包,有抓到 reply 包
  • node3 --> node4: 抓到 node4 收到了 arp 请求包,但是没有抓到 reply 包

确认 路由一致,vlan id 正确,arp 相关 sysctl 系统设置正确。 而且以上现象是稳定的,那么为什么会出现这种情况呢? 原因是因为组 bond 的两张网卡,不属于同一个 聚合 ID ( Aggregator ID), 而且使用的是 bond mode4

bash 复制代码
cat /proc/net/bonding/bond1

cat /proc/net/bonding/bond2

1. 关于 bond 的 7 种模式

网卡绑定 mode 共有七种(0~6) bond0、bond1、bond2、bond3、bond4、bond5、bond6。

常用的三种:

ini 复制代码
mode=0:平衡负载模式,有自动 backup,但需要"Switch"支援及设定。
mode=1:自动 backup 模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动 backup,不必"Switch"支援及设定。

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 负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。

特点

1、创建一个聚合组,它们共享同样的速率和双工设定。根据 802.3ad 规范将多个 slave 工作在同一个激活的聚合体下。

2、外出流量的 slave 选举是基于传输 hash 策略,该策略可以通过 xmit_hash_policy 选项从缺省的 XOR 策略改变到其他策略。需要注意的 是,并不是所有的传输策略都是 802.3ad 适应的,

3、尤其考虑到在 802.3ad 标准 43.2.4 章节提及的包乱序问题。不同的实现可能会有不同的适应性。

(由于 bond 用错了一张网卡,而基于 ip 的 hash 的策略稳定 hash 到了错误的网卡,所以导致稳定性选择性不通的情况)

6)mode=5(balance-tlb)(适配器传输负载均衡)

是根据每个 slave 的负载情况选择 slave 进行发送,接收时使用当前轮到的 slave。该模式要求 slave 接口的网络设备驱动有某种 ethtool 支持;而且 ARP 监控不可用。

特点

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

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

其实 mod=6 与 mod=0 的区别

mod=6,先把eth0流量占满,再占eth1,....ethX;而mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只占了小部分流量。

参考: www.cnblogs.com/liugp/p/164...

相关推荐
AskHarries2 分钟前
Java字节码增强库ByteBuddy
java·后端
许野平2 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
齐 飞3 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
LunarCod3 小时前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
码农派大星。4 小时前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man5 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*5 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu5 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s5 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子5 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算