同步非常大的文件夹结构

Mig*_*tyE 15 backup synchronization rsync unison

我们的 Intranet 上有一个文件夹结构,其中包含大约 800,000 个文件,分为大约 4,000 个文件夹。我们需要将其同步到我们 DMZ 中的一小部分机器。结构的深度非常浅(它永远不会超过两层深)。

大多数文件永远不会改变,每天有几千个更新文件和 1-2000 个新文件。数据是在源数据已被清除的地方维护的历史报告数据(即,这些是源数据足够旧以至于我们存档和删除它的最终报告)。每天同步一次就足够了,因为它可以在合理的时间范围内发生。报告是在一夜之间生成的,我们早上第一件事就是同步作为计划任务。

显然,由于很少有文件定期更改,我们可以从增量复制中受益匪浅。我们已经尝试过 Rsync,但是仅仅完成“构建文件列表”操作就可能需要长达八到十二个小时的时间。很明显,我们正在迅速超越 rsync 的能力(12 小时的时间框架太长了)。

我们一直在使用另一个名为 RepliWeb 的工具来同步结构,它可以在大约 45 分钟内完成增量传输。然而,我们似乎已经超出了它的限制,它已经开始看到文件显示为删除,而实际上它们不是(也许某些内部内存结构已经耗尽,我们不确定)。

有没有其他人遇到过这种大规模的同步项目?是否有设计用于处理像这样的大量文件结构以进行同步?

Rya*_*nch 9

如果您可以信任文件系统上次修改的时间戳,则可以通过将 Rsync 与 UNIX/Linux 的“查找”实用程序结合来加快速度。“查找”可以组合显示过去一天内最后修改时间的所有文件的列表,然后仅将缩短的文件/目录列表通过管道传输到 Rsync。这比让 Rsync 将发件人上每个文件的元数据与远程服务器进行比较要快得多。

简而言之,以下命令将仅在过去 24 小时内更改的文件和目录列表上执行 Rsync:(Rsync 不会费心检查任何其他文件/目录。)

find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
Run Code Online (Sandbox Code Playgroud)

如果您不熟悉 'find' 命令,它会通过特定的目录子树递归,查找满足您指定的任何条件的文件和/或目录。例如,这个命令:

find . -name '\.svn' -type d -ctime -0 -print
Run Code Online (Sandbox Code Playgroud)

将从当前目录(“.”)开始并递归遍历所有子目录,寻找:

  • 任何目录(“-type d”),
  • 命名为“.svn”(“-name '.svn'”),
  • 在过去 24 小时内修改了元数据(“-ctime -0”)。

它在标准输出上打印与这些条件匹配的任何内容的完整路径名(“-print”)。选项“-name”、“-type”和“-ctime”被称为“测试”,选项“-print”被称为“动作”。“查找”的手册页有完整的测试和操作列表。

如果你想变得非常聪明,你可以使用'find'命令的'-cnewer'测试,而不是'-ctime'来使这个过程更加容错和灵活。'-cnewer' 测试树中的每个文件/目录是否比某个参考文件更近地修改了其元数据。使用“touch”在每次运行开始时创建 NEXT 运行的参考文件,就在“find...”之前。rsync...' 命令执行。下面是基本实现:

#!/bin/sh
curr_ref_file=`ls /var/run/last_rsync_run.*`
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file
Run Code Online (Sandbox Code Playgroud)

该脚本自动知道上次运行的时间,并且只传输自上次运行以来修改过的文件。虽然这更复杂,但它可以保护您免受由于停机或其他一些错误而错过运行作业超过 24 小时的情况。

  • 至于缓慢的“查找”命令:您使用的是哪种文件系统?如果您使用 Ext3,您可能需要考虑两个 FS 调整:1) 运行 'tune2fs -O dir_index <DEVICE_NODE>' 以启用 Ext3 的 'dir_index' 功能,以加快对大文件数目录的访问。2) 运行'mount -o remount,noatime,nodiratime' 关闭访问时间更新,这通常会加快读取速度。'dumpe2fs -h <DEVICE_NODE> | grep dir_index' 告诉您是否已启用 'dir_index'(在某些发行版上,这是默认设置),以及 'mount | grep <DEVICE_NODE>' 告诉您有关访问时间更新的信息。 (3认同)

Dav*_*ney 8

试试unison,它是专门为解决这个问题而设计的,它通过将更改列表(构建文件列表)保存在每个服务器的本地,加快计算增量的时间,以及之后通过线路发送的减少量。

  • 第一次在两侧创建索引时,重建时间类似于 rsync,因为它必须散列每个文件。完成此操作后,unison 使用目录的最后修改时间来识别文件何时发生更改,并且只需扫描该文件以查找更改。 (2认同)