用gzip 1.7+配合rsync实现备份的快速传输

Backround

定期备份VPS的特定目录是一个常见的需求。一般来说,备份分为如下步骤:

  1. 会用tar来打包
  2. 用压缩工具(如gzip/bzip2/xz)压缩
  3. rsync来传输备份文件

比如说我定期备份博客目录的命令如下:

tar -cf - --exclude=/srv/www/wordpress/logs --exclude=/srv/www/wordpress/wp-content/cache /srv/www/wordpress/ | gzip - > ~/backup/wordpresss.bak.tar.gz

然后有另外的rsync脚本传输wordpresss.bak.tar.gz

Problem

只要wordpress里的任何一个文件/目录有任何改动,比如说时间戳变了,每次备份产生的tar.gz都完全不一样,这样rsync传输文件的时候每次都需要完整传输几乎所有的内容,即浪费时间也浪费流量。
比如说,我的博客备份的一次完整的传输在网络条件一般的情况下可能需要几十分钟!

Solution

gzip1.7开始正式提供 --rsyncable选项,使产生的压缩包对rsync更友好,方便rsync作delta传输。
虽然VPS上只有1.6版本,但是开源的好处就是大家可以自己编译:

  1. 到 https://ftp.gnu.org/gnu/gzip/ 下载1.7版本的gzip(最新的已经是1.8了)
  2. configure, make and install
  3. 添加--rsyncable选项到备份的命令里:
    tar -cf - --exclude=/srv/www/wordpress/logs --exclude=/srv/www/wordpress/wp-content/cache /srv/www/wordpress/ | gzip --rsyncable - > ~/backup/wordpresss.bak.tar.gz
    

Result

效果很明显,rsync的传输时间从几(十)分钟减少到几十秒钟,speedup大约在700左右。
节省了时间和流量 🙂

Share