4

我正在使用 scp 使用 GNU 并行复制文件和我的下面的 shell 脚本,它工作正常。

我不确定如何rsyncscp下面的 shell 脚本中使用。我想看看在传输速度方面是否rsync会有更好的性能。scp

以下是我的问题描述 -

当我在. machineB_machineCmachineAmachineA

如果文件不在那里,machineB那么它肯定应该在那里,machineC所以我会尝试先复制文件machineB,如果文件不在那里,machineB那么我会尝试从machineC.

我正在使用 GNU Parallel 库并行复制文件,它工作正常。目前,我正在为 PRIMARY 和 SECONDARY 并行复制五个文件。

下面是我的shell脚本 -

#!/bin/bash

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary
readonly FILERS_LOCATION=(machineB machineC)
export FILERS_LOCATION_1=${FILERS_LOCATION[0]}
export FILERS_LOCATION_2=${FILERS_LOCATION[1]}
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers
SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers

export dir3=/testing/snapshot/20140103

do_Copy() {
  el=$1
  PRIMSEC=$2
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/.
}
export -f do_Copy

parallel --retries 10 -j 5 do_Copy {} $PRIMARY ::: "${PRIMARY_PARTITION[@]}" &
parallel --retries 10 -j 5 do_Copy {} $SECONDARY ::: "${SECONDARY_PARTITION[@]}" &
wait

echo "All files copied."

有什么方法可以替换我上面的scp命令,rsync但我仍然想同时复制 5 个PRIMARY文件SECONDARY

4

4 回答 4

6

rsync旨在有效地同步文件夹和文件的两个层次结构。

虽然它可以用来传输单个文件,但它不会帮助你非常频繁地使用,除非你已经在每一端都有一个文件版本,它们之间的差异很小。rsync在层次结构中的单个文件上并行运行多个实例违背了该工具的目的。

虽然 Triplee 是正确的,您的任务是 I/O 密集型而不是 CPU 密集型,因此在典型情况下,无论您使用rsyncor scp,并行化任务都无济于事,但在一种情况下并行化网络传输可以提供帮助:如果发件人正在限制请求。在这种情况下,为多个不同文件夹中的每一个运行一个实例可能会有一些价值rsync,但这会使您的代码复杂化,并且您必须分析这两种解决方案以发现您是否真正获得了任何好处。

简而言之:只需运行rsync;的单个实例 从另一种方法中获得的任何性能提升都不值得。

于 2014-05-24T20:05:00.683 回答
2

您还没有真正向我们提供足够的信息来了解您是否走在一条明智的道路上,但我怀疑您应该查看lsyncd甚至可能是GlusterFS。这些与您正在做的不同之处在于它们是连续同步工具而不是定期运行,但我怀疑如果您真的想要的话,您可以定期运行 lsyncd。我还没有尝试过 lsyncd 2.x,但我看到他们已经添加了并行同步过程。如果您的实际场景不仅仅涉及您描述的三台机器,那么查看一些对等文件共享协议甚至可能是有意义的。

在您当前的方法中,除非您的文件非常大,否则大部分延迟可能与设置连接和验证它们的开销有关。为每个文件单独执行此操作很昂贵,尤其是在基于 ssh 的协议上。您最好将文件列表分成多个批次,然后将这些批次传递给您的复制机制。是否为此使用 rsync 可能不太重要,但是如果您首先构建一个文件列表供 rsync 进程处理,那么您可以使用--files-from选项将其传递给 rsync。

您想了解同步速度的限制因素。大概它是网络带宽、网络延迟、文件 IO 或 CPU(校验和或压缩,但可能只有在您拥有低端硬件时)之一。

了解从一次同步运行到另一次同步运行的文件更改模式可能也很重要。上一次运行中是否有许多未更改的文件?现有文件是否更改?这些更改是否使大量块保持不变(例如数据库文件),还是仅被附加(例如日志文件)?您是否可以安全地依靠文件修改时间和大小等元数据来识别更改的内容,或者您​​是否需要对整个内容进行校验和?

您的文件内容可压缩吗?例如,如果您正在复制纯文本,您可能希望在 scp 或 rsync 中使用压缩选项,但如果您已经压缩了图像或视频文件,那么再次压缩只会减慢您的速度。如果您的文件只有部分文件更改,则 rsync 非常有用。

于 2014-05-28T08:37:54.397 回答
0

您可以rsync像使用scp. 只要确保不使用调用守护程序的rsync://or格式即可。hostname::path

它至少可以使两个远程主机同时工作。此外,如果文件位于不同的物理磁盘上或碰巧在缓存中,即使在单个主机上并行化它们也会有所帮助。这就是为什么我不同意另一个说法,单一实例必然是要走的路。

于 2014-05-31T13:03:00.543 回答
0

我认为你可以更换

scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/.

经过

rsync david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/new_weekly_2014_"$el"_200003_5.data || rsync david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/new_weekly_2014_"$el"_200003_5.data

(注意改变的不仅仅是命令)

也许您可以获得额外的速度,因为 rsync 将使用 delta=transfer 算法,而 scp 会盲目复制。

于 2014-05-31T13:16:10.633 回答