我有两个来自不同供应商的大型存储阵列,每个阵列都有大约 10Gb/s 的带宽可用于读写。我需要将多个 TB 的文件从一个阵列移动到另一个阵列。每个阵列都使用 NFS 和 CIFS。目前使用 cp 或 scp 或 rsync,中间主机的 GbE 接口成为瓶颈,因为我必须从一个阵列读取数据并写入另一个阵列。两个阵列上都没有主机可以让我登录以省去中间人。我有很多可以提供额外带宽的主机,如果我能做类似的事情就好了:
rsync [src] [dest] --parallel-hosts=host1,host2,host3,host4
有没有一个简单的解决办法?
答案1
我用来并行化这类事情的一个技巧是分两次完成——首先生成要传输的文件列表,然后拆分该列表,然后将工作分发到多台机器上。
您可以使用 rsync 执行此操作,如下所示:
- 首先使用 --itemize-changes 运行 rsync (这只是搜索文件系统并输出将被复制的文件列表等)
- 处理 --itemize-changes 输出以提取文件名并将列表拆分成块
- 使用 rsync 和 --files-from=chunkXX 在单独的 rsync 进程中(或在单独的机器上)运行每个块
这对于网络文件系统(NFS、Lustre 等)有很大帮助,因为通常无法从单个 rsync 进程/机器获得足够的性能。
仍然需要花一些时间来搜索文件系统并进行比较,但实际的数据移动速度会非常快。此外,cpio 和 cp 等工具在原始数据移动方面往往比 rsync 表现更好。
我经常使用的另一个选项是执行一个简单的操作find -type f /src
,然后拆分文件列表并将其提供给多个主机上的 cpio。
我很想知道一种更简单/更快捷的方法来做到这一点......
答案2
如果两个存储阵列无法直接相互通信,那么最好的选择就是构建具有高带宽连接的专用机器。即使是相对便宜的新工作站,只要配备一对 10GbE NIC,如果支持网络和存储阵列能够承受,也可以提供大量带宽。
答案3
您应该与存储供应商沟通,以确定控制器是否可以直接相互通信。如果不能,请构建或租用高带宽中间节点。我猜有一种方法可以让两个阵列运行良好,并在控制器上全力运行克隆。
答案4
如果您找不到控制器相互通信的方法(正如其他人提到的),您可以尝试这样做:
在你的目的地服务器,运行以下命令:
$ nc -l -p 9999 | tar xvzf -
然后,在你的来源服务器,运行以下命令:
$ tar cvzf - <SOURCEFILES> | nc -q 1 <DST_SERVER> 9999
这样做的好处是可以避免 SSH/rsync 带来的任何加密开销,因此速度会略有提升。它还会在源服务器和目标服务器上进行流式压缩和解压缩,因此它以牺牲一些 CPU 周期为代价来加快传输过程。
祝你好运!