我正在制定一个部署脚本,用于打开我的代码目录,在当前date和时间之后将tar文件命名,将其推送到服务器,将其解压到相同名称的目录中,然后交换“当前“符号链接指向新的目录。 这意味着我较旧的部署留在时间戳目录(至less直到我删除它们)。
tar文件大约5MB,传输需要将近一分钟。 我想加快速度。
我假设每个新的tarball在结构上都与之前的tarball非常相似(因为我经常只是在部署之间更改几行源代码)。 有没有办法利用这个事实来加快我的上传使用rsync?
理想情况下,我想说“嗨rsync,上传这个本地文件称为2009-10-28-222403.tar.gz到我的服务器,但它只是一个不同的文件2009-10-27-101155.tar .gz已经在那里,所以试着只是发送差异“。 这是可能的,还是有另一种工具,我应该看?
我正在制定一个部署脚本,用于打开我的代码目录,在当前date和时间之后将tar文件命名,将其推送到服务器,将其解压到相同名称的目录中,然后交换“当前“符号链接指向新的目录。
就个人而言,我认为你应该跳过使用tar,而是看看使用rsync的–link-dest或–copy-destfunction。 link-dest函数非常酷,它会知道查看目录的前一个同步,如果这些文件在相同的情况下将它们硬连接在一起,从而不必每次重新传输文件。
mkdir -p /srv/codebackup/2009-10-12 \ /srv/codebackup/2009-10-13 # first backup on 10-12 rsync -a sourcehost:/sourcepath/ \ /srv/codebackup/2009-10-12/ # second backup made on 10-13 rsync -a --link-dest=/srv/codebackup/2009-10-12/ sourcehost:/sourcepath/ \ /srv/codebackup/2009-10-13/
你的第二次运行rsync将只传输更改的文件。 相同的文件将难以链接在一起。 您可以删除较旧的树,新的备份将仍然是100%完成。 您将节省大量的存储空间,因为您不会保留相同文件的多个副本。
rsync AFAIK不能直接这样做,但是你可以构build你的tarball,使它们更快地传输,利用它们相似的事实。
看看gzip的–resyncable标志。 从手册:
压缩时,根据input偶尔同步输出。 这大大增加了大小不到百分之一,但意味着rsync(1)程序可以更有效地同步压缩此标志的文件。 gunzip无法区分使用此选项创build的压缩文件与创build的压缩文件之间的区别。
这会让你的类似tarball更类似rsync能够识别它们。
你可能不得不修改你的部署脚本,以减less传输量,因为我不认为rsync可以被告知“看另一个文件”…我会做的总是rsync东西叫做当前.tar.gz(用gzip和上面的标志压缩),然后重命名它在服务器上的归档目的。 或者,将服务器上的一个旧的tarball重命名为即将上传的tarball的名称,以便rsync可以使用它。
我认为在这里使用tar是错误的答案。 我会做什么,在这种情况下,cp -rp你的“当前”在服务器上的代码到一个过时的目录。 然后rsync你的本地代码签出“当前”。 所以基本上这个:
ssh user @ host cp -rp / path / to / current / path / to / 2009-10-28 /
rsync / local / copy user @ host:/ path / to / current
这给你你想要的备份副本,同步你的改变,并且会比tar + scp + untar更快。
希望有所帮助!
好的,我没有试过这个,但是看看它在你的情况下如何工作会很有趣。
您将希望最小化每次调用tar时的更改。 它有助于确保文件在每个实例中始终处于相同的顺序。 您可以使用--rsyncable选项进行压缩。
你可以通过上次修改date来订购文件吗? 这样,不改变的文件总是以相同的顺序,并且在开始处,并且改变的文件在最后,所以当它们改变长度时,它们不打破阻塞algorithm。
tar cvf - -T `find . -type f | xargs ls --sort=time -r` | gzip -9 --rsyncable
另一件要考虑的事情是, tar支持阻塞,并将每个文件用空值填充到块偏移。 检查块大小 。 你可以设置这个rsync块的大小(啊,这取决于文件的大小,嗯,怎么样8K?)。 这将有助于单个文件重新sorting时的algorithm。 现在,把gzip放在每一端(如果你担心磁盘空间的话,gzip是服务器上的最后一个),我想你可能会得到你想要的速度。
我对--rsyncable选项留下了深刻的印象。 我在日常的postgres转储中使用它,并发现,尽pipe每天只有less量的转储更改, rsync使用的只是复制.gz左右的一半带宽。 我可能会问这个问题。
我认为你最好使用包含在其他答案中的单个文件的高效rsync ,然后从服务器上的结果目录(或客户端,如果你想保留你的存档的地方)生成.tar.gz 。 你的版本控制系统有什么问题,作为你什么时候部署的logging? 你没有部署未提交的代码?
你可以看看rsync的模糊模式(用--fuzzy开关激活)
这允许rsync在目标系统上select与正在传输的文件类似的文件,并使用该文件作为应用其delta上传algorithm的基础。 这有点内存和I / O饿了,特别是如果你有一个大的目录在目的地的一面,但它应该给你上传的改进,你正在寻找,而不必像其他答案已经build议的那样重新调整你的方法。
什么是一个tar文件? 为什么不将rsync代码同步到您的部署目录并使用tar作为备份?
这不是直接相关的,因为它没有解决rsync解决scheme,但是它可能对文件大小有所帮助:您是否尝试过bzip2压缩而不是gzip ?
而不是tar czvf blah.tar.gz files ,你可以做tar cjvf blah.tar.bz2 files并获得一些更好的压缩(当然,假设你已经安装了bzip2)。
西蒙:重复上面提到的同样的问题…为什么需要首先焦油的任何理由?
使用硬链接进行复制并仅传输差异; 例如:cp -lr old_date_dir / new_date_dir /(这是在“服务器”上)rsync -ax –numeric-ids代码服务器:/ path / new_date_dir /
这将工作,因为传输差异之前rsync取消链接。
其他的解决scheme忽略了你想使用rsync的原因,也就是只发送已经改变的文件。 如何在稍微不同的情况下接近它,避免在这个过程中使用tar包,但是保持rsync和rollback的好处。
首先,在远程主机上为rsync创build一个最近的目录:
mkdir /var/www/recent
然后创build一个符号链接指向这个目录:
ln -s /var/www/recent /var/www/active
configurationApache以在/ var / www / active下提供文件
然后,rsync你的本地文件夹到你的远程主机:
rsync -v -r --delete ~/Sites/Foo/ foo.org:/var/www/recent
然后远程备份远程目录:
ssh foo.org cp -R /var/www/current /var/www/`date +%Y%m%d%H%M%S`
现在,过了一会儿,你的远程/ var / www目录应该是这样的:
/var/www/200909041234 /var/www/200910121712 /var/www/200911030446 /var/www/active /var/www/recent
如果您需要回滚,则切换符号链接:
ssh foo.org ln -s /var/www/200911030446 /var/www/active
十分简单!
对于奖励积分:
从OS X中的任何应用程序自动发布!