奇怪的rsync问题 – 复制和解压缩文件

我有两台服务器:我们的生产Web服务器(freebsd)和备份服务器(centos)。 生产服务器每3小时执行一次mysql数据库转储,并使用bzip2压缩转储文件。 所以我们在/ backups / dumps /下有一个文件夹,这些文件就像database_dump-20120119_152100.bz2。

在我们的备份服务器上,我们有一个/ BackupRaid / webserver /文件夹。 在此服务器上,每3小时运行一次rsync脚本,将生产服务器上的/ backups / dumps文件夹同步到备份服务器上的/ BackupRaid / webserver文件夹。 其中一个备份文件大约500MB。 如果你解压缩,它是3.2GB。

这个stream程现在已经运行良好。 但是最近我查了一下备份服务器,发现上个星期每3个小时就有一个500MB的bz2文件,但是每个文件都有一个3.2GB的压缩版本。 所以现在有两倍的文件,一个是未压缩的,一个是压缩的。

我发现什么时候下一次同步,我坐下来监视它。 在备份服务器上,我看到一个“.database_dump-201201119_182100.tlv1d4”文件,这意味着rsync正在进行中。 我看着文件,它增长,并通过它应该是500MB的增长。 它继续下载一个3.2GB的解压缩转储文件。 我login到networking服务器,并检查它正在同步的文件夹,文件夹中只有500MB bz2文件。 一旦3.2GB文件结束,它就继续下载500MB的bz2文件。

那么从哪里得到这个3.2GB的未压缩的转储文件? 就好像远程服务器在传输之前解压缩文件一样,将3.2GB转储文件传输到备份服务器,然后备份服务器再次将其压缩到500MB大小。

我用lsof,grep的文件名,find了rsync进程的PID。 从ps aux检查PID,确定它来自我的脚本。 我的脚本是一个非常简单的命令:

 #Rsync files, timeout set to 5 seconds until rsync -avv --progress --partial --timeout=5 "${SOURCE_USER}"@"${SOURCE_SERVER}":"${SOURCE_PATH}" "${TARGET_PATH}"; do echo "Didn't quite get the whole file before an error/timeout occurred. Restarting where it left off..." >&2; sleep 1; done 

到底是怎么回事??

看起来你正在使用rsync的-a开关,这相当于-rlptgoD ,其中包括recursion,链接,文件时间等。

最重要的是,从你发布的命令,看起来你正在源端调用一个path。

所以当使用-a-r开关的path时,rsync会同步path中的所有文件。 我假设大文件也存在于源path中,因此它也被复制。

听起来像在rsync启动之前, bzip2还没有完成。 顺便说一句 – 你有没有删除任何一方的倾倒?