Linux:使用绑定连接两台服务器以实现更快的文件传输

Linux:使用绑定连接两台服务器以实现更快的文件传输

我的设置是两台戴尔 R720 服务器,每台服务器通过 4 个千兆端口连接到思科 WS-C2960S-24TS-L 交换机,然后通过 100MBit 连接到互联网。

服务器运行的是带有 openvz (redhad) 内核的 Wheezy: 2.6.32-openvz-042stab081.3-amd64

我想要的是两台服务器之间更快的文件传输和一定程度的容错能力。

我设法设置了绑定,并尝试了绑定模式balance-rr802.3adbalance-alb。就我能够连接到服务器而言,所有操作都成功了。但它们之间的数据传输速度没有任何加快。

(已删除:我明白这只balance-rr适用于 xover 电缆。)

查看 ifconfig 和各个接口的流量计数,我看到:

  • 802.3ad:仅使用第一个接口传出流量。即使传输到具有不同 mac 地址的另一台主机,情况也是如此。
  • balance-alb:传出的流量“不知何故”在接口之间分布不均匀,但传入的流量仅在一个接口上

内核文档告诉我,该balance-rr模式需要:The balance-rr, balance-xor and broadcast modes generally require that the switch have the appropriate ports grouped together. The nomenclature for such a group differs between switches, it may be called an "etherchannel"

所以问题是:

  • 哪种模式适合我使用以及如何设置它才能使其正常工作?

  • 如果这通常不可能,那么设置一个使用不同接口的服务器/服务器和服务器/互联网连接会有所帮助。但这必须使用绑定,而不是不同的内部/外部 IP 地址。(因为这反过来会使 openvz 设置变得不必要地困难)

提前致谢!

更新:玩过交换机后,我为两台服务器设置了两个“主动”模式的以太通道(这样对吗?)。但在 Linux 端使用 802.3ad 作为绑定方法时,我没有看到行为/速度有任何变化。

更新2:抱歉。现在传出的流量似乎使用不同的接口。可能取决于目的地的 MAC 地址。这是我能做的最好的事情吗?

更新3:只是为了说明我正在说什么:

root@warp2:/ssd/test# iperf -c 10.0.0.1
------------------------------------------------------------
Client connecting to 10.0.0.1, TCP port 5001
TCP window size: 23.8 KByte (default)
------------------------------------------------------------
[  3] local 10.0.0.2 port 55759 connected with 10.0.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  2.16 GBytes  1.85 Gbits/sec

root@warp2:/ssd/test# iperf -c x.x.x.x
------------------------------------------------------------
Client connecting to warp1, TCP port 5001
TCP window size: 23.8 KByte (default)
------------------------------------------------------------
[  3] local 80.190.169.17 port 54861 connected with x.x.x.x port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.10 GBytes   944 Mbits/sec

第一个测试是使用 balance-rr 的 2 个 nic,当前在两个 VLAN 中(每个 nic 对一个,模拟 x-link 电缆。)

第二个测试是使用 802.3ad 和 EtherChannel 的 2 个网卡。

答案1

恐怕您无法在如此简单的设置下在两台服务器之间进行流量交换时使用绑定的多个链接。原因:此 Cisco 交换机基于 IP 和 MAC 执行负载平衡。也就是说,即使多个文件传输也会映射到相同的物理路径。

可以使用直接交叉电缆。设置应该不会像您担心的那样复杂。我相信这里不需要交换 (Veth) openvz 设置。我想 VENET 和简单的静态路由就足够了。

网络设置可能如下所示:

10.10.0.0/24 - subnet for direct interconnect.
10.20.1.0/24 - range for VEs on Server1
10.20.2.0/24 - range for VEs on Server2

Server1: 
   bond1: IP=10.10.0.1/24
   VE1:   IP=10.20.1.1/24
   VE2:   IP=10.20.1.2/24
   ...
   route  10.20.2.0/24 -> 10.10.0.2

Server2: 
   bond1: IP=10.10.0.2/24
   VE1:   IP=10.20.2.1/24
   VE2:   IP=10.20.2.2/24
   ...
   route  10.20.1.0/24 -> 10.10.0.1

当然iptables,允许所有这些员工并且不要尝试 nat/伪装恶作剧。

更新型多巴胺
对于容器迁移,最好使用 Veth 设置... 确实好得多 ;)

答案2

使用链路聚合(以太通道)不会加快单个文件传输的速度。不同的连接可以使用同一以太通道中的不同接口来增加同时传输的最大吞吐量,但单个传输永远只能使用单个接口,这就是您所描述的行为。

答案3

我一直在尝试类似的设置,我想我明白了解决方案。就我而言,我有两台服务器,每台服务器都有双千兆网卡,通过 3com 3824 第 2 层交换机连接。

在尝试了各种选项后,我发现我需要为服务器之间的每个 1:1 NIC 创建一个 VLAN(例如,一个包含 server1:eth0 和 server2:eth0 的交换机端口的 VLAN,另一个包含 server1:eth1 和 server2:eth1 的 VLAN)。这需要一些额外的配置和路由,但它带来了我预期的近 2 倍吞吐量增益。

到目前为止,我还没有完全理解这些细节;但是,由于 802.11ad 对聚合链路中的所有 NIC 使用相同的 MAC,我推测交换机会倾向于通过单个端口发送目标 mac 的流量,而不是将负载分散到聚合链路中的所有端口。通过将每条链路隔离到自己的 VLAN,交换机将以与发送相同的方式转发数据 - 如果发送方在两个端口之间平衡传输,交换机将通过两个 VLAN 将其转发到两个接收端口。

我首先想到的唯一权衡是额外的配置,以允许网络上的非聚合主机访问这些服务器。我仍然需要进行冗余测试——如果一台服务器上的 eth0 和另一台服务器上的 eth1 都发生故障,它们可能会失去通信。但是我认为这种情况不太可能发生——它应该通过与其他主机相同的路径路由并跨越 VLAN(此外,由于每个服务器只有两个 NIC,因此丢失任何一个 NIC 都会违背设置的目的,并且它成为一个没有实际意义的问题)。

对所有这一切持保留态度。我修改了很多选项和设置,我相信你的交换机也是第 3 层感知的,但我相当有信心将接口配对到隔离的 VLAN 中是利用所有可用吞吐量的关键。

相关内容