Mig*_*tyE 15 backup synchronization rsync unison
我们的 Intranet 上有一个文件夹结构,其中包含大约 800,000 个文件,分为大约 4,000 个文件夹。我们需要将其同步到我们 DMZ 中的一小部分机器。结构的深度非常浅(它永远不会超过两层深)。
大多数文件永远不会改变,每天有几千个更新文件和 1-2000 个新文件。数据是在源数据已被清除的地方维护的历史报告数据(即,这些是源数据足够旧以至于我们存档和删除它的最终报告)。每天同步一次就足够了,因为它可以在合理的时间范围内发生。报告是在一夜之间生成的,我们早上第一件事就是同步作为计划任务。
显然,由于很少有文件定期更改,我们可以从增量复制中受益匪浅。我们已经尝试过 Rsync,但是仅仅完成“构建文件列表”操作就可能需要长达八到十二个小时的时间。很明显,我们正在迅速超越 rsync 的能力(12 小时的时间框架太长了)。
我们一直在使用另一个名为 RepliWeb 的工具来同步结构,它可以在大约 45 分钟内完成增量传输。然而,我们似乎已经超出了它的限制,它已经开始看到文件显示为删除,而实际上它们不是(也许某些内部内存结构已经耗尽,我们不确定)。
有没有其他人遇到过这种大规模的同步项目?是否有设计用于处理像这样的大量文件结构以进行同步?
如果您可以信任文件系统上次修改的时间戳,则可以通过将 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)
将从当前目录(“.”)开始并递归遍历所有子目录,寻找:
它在标准输出上打印与这些条件匹配的任何内容的完整路径名(“-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 小时的情况。
| 归档时间: |
|
| 查看次数: |
9337 次 |
| 最近记录: |