公司的网站服务器上几个网站近百兆的小文件需要每天备份到公司的内部服务器上,之前就是简单写了个脚本把文件每天备份到以日期命名的文件夹中,然后在公司的内部服务器用ssh拉取下来,时间一长,小文件数越来越多,每天备份耗时很长,于是就想到了增量备份方案,这样就可以有效缩短备份时间,另外也节省了硬盘空间。

rsync这个单向同步命令正好满足了需求,rsync是unix-like系统下的数据镜像备份工具,工作原理就是在同步前对服务器文件进行对比然后进行差量同步。

特性如下

  • 可以镜像保存整个目录树和文件系统。
  • 可以很容易做到保持原来文件的权限、时间等等。
  • 无须特殊权限即可安装。
  • 优化的流程,文件传输效率高。
  • 可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
  • 支持匿名传输。配合SSH使用下面一段简单脚本就实现了远程差量备份或同步。

下面这段简单代码就是配合ssh实现了远程差量备份或同步:

#! /bin/sh
#远程用户名
RUSER=root
#远程服务器地址
RHOST=xxx.xxx.xxx.xxx
#远程目录
RPATH=/var/www/website/backup/files/
#本地目录
LPATH=/var/www/website/backup/files/
rsync -e "ssh" -az --delete $RUSER@$RHOST:$RPATH $LPATH

最后把脚本保存在 /var/cron/filessync.sh,设置好权限,执行 sh /var/cron/filessync.sh 看看效果。

正常使用此脚本的前提是两台机器做了密钥配对,可以参考Linux下用SCP无需输入密码获取文件进行设置。然后把脚本加到crontab,设定好执行时间,就大功告成了,比如我设置了每天凌晨1点30分执行,用 crontab -e 进入定时任务编辑,增加如下代码:

30 01 * * * sh /var/cron/filessync.sh

rsync常用参数说明

  • -v, –verbose 详细模式输出
  • -q, –quiet 精简输出模式
  • -c, –checksum 打开校验开关,强制对文件传输进行校验
  • -a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
  • -r, –recursive 对子目录以递归模式处理
  • -R, –relative 使用相对路径信息
  • -e, –rsh=COMMAND 指定替代rsh的shell程序
  • –delete 是指如果Server端删除了一文件,那客户端也相应把这一文件删除,保持真正的一致。

BTW

  • 如果需要双向同步,可以试试unison,使用方法可以google一下。
  • 在使用rsync和unison同步时,如果服务器小文件数目达到上千上万,那么比对起来肯定又会消耗很长时间,解决方法可以参数一下这篇文章《大量小文件的实时同步方案》。