我有一个大型目录需要从本地服务器同步到我的 Web 服务器,我正在寻找最有效的方法。此目录包含 14k 个目录中的 113k 个文件,大小约为 5GB。即使只有很小的更改,每个文件/目录的本地到远程比较也需要几个小时才能完成。
本地机器是Win7,远程是CentOS 5.5
我当前的设置是使用 WinSCP 进行脚本同步,但如前所述,通过单个 SCP 连接爬取目录需要几个小时。需要更新的文件数量应该比总体数量小得多,我想找到一种方法来在本地编写同步脚本,记录哪些文件已更改,然后只访问 Web 服务器以上传新文件。
有什么建议么?
答案1
答案2
齐奏是另一种可能性。重要的是获得可以通过 SSH 在服务器上运行的东西,并让服务器端进程处理该端的磁盘 I/O,而不是远程遍历整个文件系统。Unison 可以通过 ssh 运行,并使用 rsync 算法仅传输文件的更改部分。
答案3
如果更改仅发生在本地(即单向同步),您可能会考虑仅使用归档程序(zip、tar 等)来归档修改后的文件,以便传输到远程服务器。大概您可以使用修改日期、归档位,或者在最坏的情况下,保留第二个本地副本作为确定哪些文件已更改的基础。
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%\*"
这样“暂存”目录将只包含已更改的文件(尽管每个目录的子目录也为空,因为文件未发生更改)。它还会重置所有子文件夹中所有文件的存档位。您可以将该暂存目录压缩(使用您最喜欢的命令行 ZIP 程序),然后将其发送到远程服务器进行解压。
这不会给您任何增量压缩,但在平均 51KB/文件大小的情况下,听起来增量压缩不会给您太多帮助,而这种简单方法的延迟“胜利”可能对您更有利。