Backround
定期备份VPS的特定目录是一个常见的需求。一般来说,备份分为如下步骤:
- 会用
tar
来打包 - 用压缩工具(如
gzip
/bzip2
/xz
)压缩 - 用
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
gzip
从1.7开始正式提供 --rsyncable
选项,使产生的压缩包对rsync
更友好,方便rsync
作delta传输。
虽然VPS上只有1.6版本,但是开源的好处就是大家可以自己编译:
- 到 https://ftp.gnu.org/gnu/gzip/ 下载1.7版本的gzip(最新的已经是1.8了)
- configure, make and install
- 添加
--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左右。
节省了时间和流量 🙂