文件上传(下)

1,849 阅读4分钟

rsync 本身是单线程的,不过可以通过一些方式手动并行处理多个 rsync 任务,从而加速大规模文件的同步过程,尤其在处理大量文件时。常见的并行方法包括将文件拆分成小块、使用 GNU Parallel 工具等。

下面我介绍几种并行 rsync 的方法。

1. 手动拆分文件并行同步

如果你的文件夹结构层次比较简单,可以手动将文件按不同的子文件夹拆分同步,分别运行多个 rsync 进程。例如,你有一个目录 /path/to/source,其中包含 100 个子文件夹,可以将它们分成 4 组,分别用 4 个 rsync 进程同步这些文件夹。

示例:

假设 source 目录下有 subfolder1subfolder100,你可以这样同步:

rsync -avz /path/to/source/subfolder1/ /path/to/destination/subfolder1/ &
rsync -avz /path/to/source/subfolder2/ /path/to/destination/subfolder2/ &
rsync -avz /path/to/source/subfolder3/ /path/to/destination/subfolder3/ &
rsync -avz /path/to/source/subfolder4/ /path/to/destination/subfolder4/ &

& 表示在后台运行任务,这样多个同步进程可以同时运行。

2. 使用 GNU Parallel

GNU Parallel 是一个强大的工具,可以并行执行命令,非常适合处理大规模同步任务。你可以结合 rsyncGNU Parallel 来自动并行执行多个同步进程。

安装 GNU Parallel

在大多数 Linux 系统上,你可以通过包管理器安装:

sudo apt-get install parallel   # Ubuntu/Debian
sudo yum install parallel       # CentOS/RHEL

示例:并行同步多个子文件夹

假设你有一个源文件夹 /path/to/source,你想并行同步到 /path/to/destination,可以使用以下命令:

  1. 首先,获取源目录中的子目录列表:
find /path/to/source -mindepth 1 -maxdepth 1 -type d > dir_list.txt

这个命令会生成一个 dir_list.txt 文件,其中包含所有子目录的路径。

  1. 使用 GNU Parallel 并行同步:
cat dir_list.txt | parallel -j 4 rsync -avz {} /path/to/destination/{/}

解释:

  • cat dir_list.txt:读取包含目录列表的文件。
  • parallel -j 4:指定并行执行 4 个 rsync 进程(你可以根据系统性能调整这个数字)。
  • rsync -avz {} /path/to/destination/{/}{} 会被替换为 dir_list.txt 中的每一行(即每个子目录),{/} 表示目录的最后一部分,用于目标路径。

3. 分块文件同步

如果你的源目录下是大量的文件而非子目录,rsync 同步大量小文件时可能会比较慢。你可以通过将文件分块来并行执行 rsync,这可以利用多核 CPU 并加速同步过程。

示例:将文件列表分块并并行同步

  1. 获取文件列表:
find /path/to/source -type f > file_list.txt
  1. 将文件列表分成若干部分,比如 4 份:
split -l $(($(wc -l < file_list.txt) / 4 + 1)) file_list.txt file_list_part_

这会将 file_list.txt 文件按行分割成 4 部分,生成 file_list_part_aafile_list_part_ab 等文件。

  1. 使用 GNU Parallel 并行同步:
ls file_list_part_* | parallel -j 4 'rsync -avz --files-from={} /path/to/source /path/to/destination'

解释:

  • ls file_list_part_*:列出所有分块后的文件列表。
  • parallel -j 4:指定并行运行 4 个 rsync 任务。
  • rsync -avz --files-from={}:通过 --files-from 选项,让 rsync 仅同步指定的文件列表。

4. 使用 xargs 并行同步

xargs 是另一个可以并行运行命令的工具,可以用于启动多个 rsync 进程。你可以通过将文件列表传递给 xargs,并指定最大并行任务数。

示例:

find /path/to/source -type d -print0 | xargs -0 -n 1 -P 4 -I {} rsync -avz {} /path/to/destination/{/}

解释:

  • -print0:以 null 字符分隔文件名,适合处理包含特殊字符(如空格)的文件名。
  • xargs -0:配合 -print0 使用,确保文件名正确处理。
  • -n 1:每次传递一个参数给 rsync
  • -P 4:最多允许 4 个 rsync 进程同时运行。

5. 监控同步过程

无论你选择哪种并行方法,都可以使用 htopiotopifstat 等工具来监控 CPU、I/O 和网络带宽使用情况,以确保系统不会过载,并根据资源利用情况调整并行进程的数量。


总结:

  • 手动并行:可以简单地通过后台运行多个 rsync 任务。
  • GNU Parallel 和 xargs:自动并行执行多个同步任务,非常适合大规模文件同步。
  • 拆分文件列表:通过将文件或目录列表分成多个块,确保每个 rsync 任务只同步一部分内容。

这种并行处理方式,特别适合大规模文件的同步,能够大大提升同步速度。