我们的 Intranet 上有一个文件夹结构,其中包含大约 800,000 个文件,分为大约 4,000 个文件夹。我们需要将其同步到 DMZ 中的一个小型机器集群。结构的深度很浅(它永远不会超过两层深)。
大多数文件永远不会改变,每天有几千个更新文件和 1-2 千个新文件。数据是在源数据已被清除的地方维护的历史报告数据(即这些是源数据足够旧的最终报告,我们将其存档和删除)。每天同步一次就足够了,因为它可以在合理的时间范围内发生。报告在一夜之间生成,我们在早上同步第一件事作为计划任务。
显然,由于很少有文件定期更改,我们可以从增量复制中受益匪浅。我们已经尝试过 Rsync,但这可能需要长达八到十二个小时才能完成“构建文件列表”操作。很明显,我们正在迅速超出 rsync 的能力(12 小时的时间框架太长了)。
我们一直在使用另一个名为 RepliWeb 的工具来同步结构,它可以在大约 45 分钟内完成增量传输。然而,我们似乎已经超过了它的限制,它已经开始看到文件显示为删除而不是删除(也许某些内部内存结构已经用尽,我们不确定)。
有没有其他人遇到过这种大规模的同步项目?是否有设计用于处理像这样的大量文件结构以进行同步的东西?
如果您可以信任文件系统最后修改的时间戳,您可以通过将 Rsync 与 UNIX/Linux 的“查找”实用程序相结合来加快速度。“查找”可以组合显示过去一天内最后修改时间的所有文件的列表,然后仅将缩短的文件/目录列表通过管道传输到 Rsync。这比让 Rsync 将发送方上每个文件的元数据与远程服务器进行比较要快得多。
简而言之,以下命令将仅对过去 24 小时内更改的文件和目录列表执行 Rsync:(Rsync 不会检查任何其他文件/目录。)
如果您不熟悉“查找”命令,它会通过特定的目录子树进行递归,查找满足您指定的任何条件的文件和/或目录。例如,这个命令:
将从当前目录(“.”)开始并递归遍历所有子目录,寻找:
它在标准输出上打印符合这些条件的任何内容的完整路径名(“-print”)。选项“-name”、“-type”和“-ctime”称为“测试”,选项“-print”称为“动作”。“查找”的手册页包含完整的测试和操作列表。
如果你想真正聪明一点,你可以使用 'find' 命令的 '-cnewer' 测试,而不是 '-ctime' 来使这个过程更容错和灵活。'-cnewer' 测试树中的每个文件/目录是否比某些参考文件更近地修改了元数据。在每次运行开始时使用“触摸”创建下一次运行的参考文件,就在“查找... | rsync...' 命令执行。这是基本的实现:
该脚本自动知道它上次运行的时间,并且它只传输自上次运行以来修改过的文件。虽然这更复杂,但它可以保护您免受由于停机或其他错误导致您可能错过运行作业超过 24 小时的情况。
试试unison,它是专门为解决这个问题而设计的,方法是在每个服务器本地保存更改列表(构建文件列表),加快计算增量的时间,以及之后通过线路发送的减少量。
http://oss.linbit.com/csync2/是为这类事情设计的,我会尝试一下。
如果您在 rsync 上使用 -z 开关,请尝试在没有它的情况下运行。出于某种原因,我发现这甚至可以加快文件的初始枚举。
从没有压缩的 rsync 命令中取出 -z 使“接收文件列表”运行得更快,我们不得不传输大约 500 GB。在使用 -z 开关需要一天的时间之前。