![Bonding linux - 如何使用模式 2 (balance-xor) 选择 mac 地址](https://linux22.com/image/800911/Bonding%20linux%20-%20%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%A8%A1%E5%BC%8F%202%20(balance-xor)%20%E9%80%89%E6%8B%A9%20mac%20%E5%9C%B0%E5%9D%80.png)
几天前,我在这里写了一个问题,但那个问题含糊不清。所以,我将尝试重写这个问题,解释所有细节。
我之前的留言(已关闭的留言):http://goo.gl/aJqQ2
你想做什么?
我试图理解当我使用绑定时,在模式 2(平衡 XOR -默认选项 layer2)。
我正在使用驱动程序绑定。我试图了解所有模式(模式 0、1、2、3、4、5 和 6)的操作。我了解所有模式的工作原理,除了模式 2(balance-xor)和 4(802.3ad)。因为选项 xmit_hash_policy 不清楚!
我的主要问题是:如何选择一个活动的从属设备或其他设备来将流量从一个对等体发送到另一个对等体?
现在,我将详细阐述我的疑惑:
在我的私人实验室里,我有两台计算机(PC1 和 PC2,运行 linux/ubuntu),配有 4 个 NIC。在每台计算机上,我都安装了两个 NIC(网卡)。
上的 Mac 地址PC1(债券0):
MAC1(eth1): 62:25:BC:06:4F:A6
MAC2(eth2): 62:25:BC:06:59:E6
上的 Mac 地址PC2(债券0):
MAC4(eth1):62:25:BC:06:5A:1B
MAC3(eth2):62:25:BC:06:59:E9
因此,当加载驱动程序绑定时,我可以在每台 PC 上看到 3 个接口(bond0、eth1 和 eth2)(eth1 和 eth2 是从属接口)。但是,我的问题从这里开始,因为我无法理解内核如何选择接口或其他接口。
有时,我注意到所有流量都放在同一个从属设备上(例如,从 PC1 到 PC2,所有流量都{MAC = 62:25:BC:06:59:E9}
将从 PC1 的 eth1 放在 PC2 的 eth2上{MAC = 62:25:BC:06:4F:A6}
)。因此,按照上面的例子,如果我禁用 PC2 上的 eth1,即使有一个接口被禁用,流量也会被发送。
PC2 上的接口 eth1 是开启还是关闭都没有关系。
这是意料之中的行为。但是,我必须遵循什么策略才能选择正确的 MAC 地址(eth1 或 eth2)? 为什么选择 pc2 上的 eth2?为什么不选择 pc2 上的 eth1? 我想说的是:我如何知道使用哪个接口将流量从 PC1 发送到 PC2?
我有一个公式:
(source MAC XOR destination MAC) modulo slave count
(此公式摘自bonding.txt - 请参阅下面最后的引文)
我知道哈希函数(我要感谢用户@Mark Wagner)
/* * 根据第 2 层数据对输出设备进行哈希处理 */ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, int count) { struct ethhdr *data = (struct ethhdr *)skb->data;
if (skb_headlen(skb) >= offsetof(struct ethhdr, h_proto)) return (data->h_dest[5] ^ data->h_source[5]) % count; return 0; }
根据上述示例(我使用 PC1 上的 eth1 和 PC2 上的 eth2 将流量从 PC1 发送到 PC2)。因此,我的 MAC 地址是:
eth1 : 62:25:BC:06:4F:A6 (PC1)
eth2 : 62:25:BC:06:59:E9 (PC2)
那么,我如何确定必须在 PC2 上使用哪个 mac 地址?为什么使用 eth2 而不是 eth1?
用户@Mark Wagner 尝试帮助我,他写了以下解释:
实际的哈希函数是:
/* * 根据第 2 层数据对输出设备进行哈希处理 */ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, int count) { struct ethhdr *data = (struct ethhdr *)skb->data;
if (skb_headlen(skb) >= offsetof(struct ethhdr, h_proto))
return (data->h_dest[5] ^ data->h_source[5]) % count;
return 0;
}
其中 h_dest 和 h_source 是 MAC 地址。假设使用默认值,绑定的 MAC 地址为 PC1:62:25:BC:06:4F:A6 和 PC2:62:25:BC:06:5A:1B。count = 2。因此哈希函数返回:
0xA6^0x5A%2=0
但是我不明白如何计算 xor 函数。有人能解释一下如何计算吗?
谢谢你!
****附录:
公式来自bonding.txt
第 2 层
Uses XOR of hardware MAC addresses to generate the hash. The formula is (source MAC XOR destination MAC) modulo slave count This algorithm will place all traffic to a particular network peer on the same slave. This algorithm is 802.3ad compliant.
异或真值表: http://www.tomshardware.com/reviews/safer-6-raid-controllers,1199-2.html
答案1
让我试着为你简化一下。查看 xmit_hash_policy 时,请思考:
- 第 2 层 = MAC
- 第 3 层 = IP
- 第 4 层 = 端口
接下来考虑“每层一个会话”。示例:
- 源 MAC 到目标 MAC = 单个会话 = 单个接口
- 源 IP 到目标 IP = 单个会话 = 单个接口
- 源端口到目标端口 = 单个会话 = 单个接口
换一种方式:
- 单个 MAC = 使用单个接口
- 单一 IP = 使用单一接口
- 单个端口 = 使用单个接口
通常,当两个节点之间进行通信时,您只有一个 MAC 和一个 IP。因此,您只会看到使用单个接口。
假设您想使用 1GbE 增加两台服务器之间的吞吐量。每台服务器使用 4 个 NIC 和一个绑定接口进行绑定。该绑定接口(例如 bond0)具有单个 IP 和单个 MAC。在这种情况下,两台服务器之间的最大吞吐量为 120MB/s。
接下来,添加子接口。这基本上是一个虚拟接口,可为您提供另一个 IP 地址。这会导致同一绑定接口上有两个 IP 地址。在 Linux 中,您可以拥有例如 bond0 和 bond0:1,具体取决于您的配置方式。
如果您在第 2 层进行“散列”,那么多个 IP 不会给您带来任何好处。您仍然只能使用单个源 MAC 和单个目标 MAC。但是,如果您在第 3 层进行散列,驱动程序现在很可能会平衡您的传输。
如果您有一个使用多个端口(比如 TCP 端口)的多线程应用程序,那么您需要在第 4 层进行散列,这将进一步平衡负载。
您可以使用 netperf 等工具来说明这一点。在每种情况下,您都可以使用多个 IP 地址或多个端口运行 netperf,您将看到流量在多个端口上达到平衡。
但请记住,这仅是传输。接收由交换机控制。思科允许您自定义哈希策略。低端交换机允许您执行第 2 层和第 3 层,高端交换机允许您执行第 2、3 和 4 层。
设想:
您有一台备份服务器,并将数据发送到 NAS 备份设备。您在备份服务器上使用模式 4,xmit_hash_policy=layer3+4,并在绑定中有 4 个 1GbE NIC。您的备份软件配置为将数据发送到备份设备的 IP,但它通过多个 TCP 端口和多个流进行发送。
假设您有足够的数据流来实现平衡,则使用此配置数据将从所有接口发送出去。它如何确定什么数据流向何处?我想您已经知道答案了,但我不会假装自己理解。我只是从经验中知道它确实如此。
假设您现在能够以 120MB/s * 4(每个 1GbE 接口 120MB/s)的速度传输数据。但现在数据到达交换机,交换机有一个以太网通道(聚合组),该通道在第 3 层配置了哈希策略。(在 Cisco 上,可以是 src-ip、dst-ip 或 src-dst-ip)。我们将在此示例中使用 src-dst-ip。因此,现在交换机根据源和目标 IP 地址进行哈希处理,这些地址始终相同,因此它将始终只选择交换机上的单个目标端口。
因此,虽然您可以以 450+ MB/s 的速度传输,但目标只能以 120MB/s 的速度接收。
如果交换机可以在第 4 层进行哈希处理(Cisco 的哈希处理方式为 src-port、dst-port 或 src-dst-port),那么您现在就可以使用所有 4 个端口将数据从备份服务器传输到设备。前提是备份设备也已绑定。
但是,如果您没有昂贵的 Cisco 交换机,并且无法在第 4 层进行哈希处理,该怎么办?您可以创建其他 IP 地址!然后,您将备份服务器配置为使用 4 个不同的 IP 地址运行作业,它将保持平衡,因为交换机将根据源和目标 IP 地址进行哈希处理。
其他交换机供应商有自己的哈希算法,通常基于 IP 和 MAC(第 2 层和第 3 层)的混合。我过去必须为此类交换机创建静态 arp 条目,以便同时拥有多个 IP 地址和多个 MAC 地址。
希望这能帮助您更好地理解 xmit_hash_policy 的工作原理,至少在实践中。