我有一个大的目录,需要从本地服务器同步到我的Web服务器,并正在寻找这样做的最有效的方法。 这个目录包含14k个目录中的113k个文件,大小约为5GB。 每个文件/目录的本地到远程比较都需要几个小时才能完成,即使几乎没有变化。
本地机器是Win7,远程是CentOS 5.5
我目前的工作是使用脚本与WinSCP同步,但是如上所述,通过一个SCP连接爬行目录需要几个小时。 需要更新的文件数量应该比整体集合小得多,我想find一种在本地编写同步脚本的方法,logging哪些文件发生了变化,然后只打到Web服务器上传新文件。
有什么build议么?
看一下基于rsync协议的Deltacopy或Syncrify 。 他们只会传输已更改或新的文件等。更重要的是,他们只会从大文件传输更改的块。 Rsync可能已经安装在你的Centos机器上
统一是另一种可能性。 最重要的部分是通过SSH获得可以在服务器上运行的东西,并让服务器端进程在那端处理磁盘I / O,而不是远程执行整个文件系统。 Unison可以通过ssh运行,并使用rsyncalgorithm只传输文件的变化部分。
如果更改仅在本地发生(即单向同步),则可以考虑使用存档器(zip,tar等)将修改后的文件存档以便传输到远程服务器。 据推测,您可以使用修改date,归档位,或者最糟糕的情况下,维护第二个本地副本作为确定哪些文件已更改的基础。
Rsync和其他增量复制程序是不错的,但我怀疑你的问题可能很简单,解决不了这个极端。 有了大量的小文件,你也会因为延迟而经历使用rsync的很多延迟。
由于您的源代码是Windows机器,因此您可以使用“归档”位作为已修改文件的指示符(假设更新过程正在切换归档位)。 你可以做一些简单的事情:
@echo off set SRC=C:\source set STAGING=C:\staging rem Copy all files from source to staging, including subdirectories, rem where "Archive" bit is set. xcopy "%SRC%\*" "%STAGING%\" /e /s /a rem Untick archive bit on all files in source attrib /S /D -A "%SRC%\*"
这会使“登台”目录只填满已更改的文件(尽pipe每个目录的文件没有更改也都有空的子目录)。 它也将重置所有子文件夹中所有文件的存档位。 您可以将该登台目录(使用您最喜欢的命令行ZIP程序)压缩并将其发送到远程服务器进行解压缩。
这不会给你任何增量压缩,但平均大小为51KB /文件听起来像增量压缩不会帮助你太多,这种简单的方法的延迟“赢”可能会更好。