考虑到任何网站都不是100%稳定的,做好备份工作总归不会吃亏。因此这里开始考虑实现本站的定期备份工作,为了节省磁盘空间,进一步提出增量备份的要求。在Windows下,可以直接找Handy Backup、Any Backup等等软件来做。Linux下有很好的基于rcp、ssh等协议的备份软件,也有很好的ftp同步软件,但对于我希望得到的远程ftp增量定期备份,则可以结合几个经典软件来完成。

第一步:定期增量同步本地和远端ftp文件

可以考虑直接使用mirror等ftp镜像软件,在Debian的包管理器中搜索ftp mirror,就能找到不少。以前使用自带增量下载镜像功能、又能自动断点续传的lftp,可惜后来发现实际功能不太稳定经常死锁而切换到lurkftp。感觉lurkftp是又快又好又健壮^_^

lurkftp只需用以下语句更新ftp镜像:

 lurkftp -m -d /home/elias/Web/elias.cn_bak/ USERNAME:PASSWORD@www.elias.cn:.

(如果lurkftp不能正常工作,那么可以给他加“-v 1”参数来输出详细信息;如果FTP的登录用户名里面带@符号,那么不能直接在用户名里面写@字符,而要在@前面加\\,也就是两个反斜杠。比如用户名应该是user@host.com,密码是pass,FTP站点地址是ftp.host.com,那么就得这么写:user\\@host.com:pass@ftp.host.com就可以了。这个用法man里面写得不清楚,我看了源代码才搞清楚……)

可以用以下语句调用lftp镜像或更新ftp镜像:

 lftp -c 'open -e "mirror . /home/elias/Web/elias.cn_bak/" -u USERNAME,PASSWORD www.elias.cn'

其中“mirror”后面的英文句号意思是镜像整个ftp站点,也可以写成ftp站点上的远端路径,比如写/incomings/src;“/home/elias/Web/elias.cn_bak/”则是指定的本地存储路径;USERNAME是远端ftp用户名、PASSWORD是远端ftp密码;“www.elias.cn”则是远端ftp站点的访问地址。

第二步:增量备份已下载的本地ftp镜像

这一步只要定期备份镜像远端ftp站点得到的文件夹即可。可以使用rsync解决方案,可以在网上找到不少文档。我这里选择使用一个简单的shell脚本来完成这项工作,其原理是记录上一次备份打包的时间,所以比该时间新的文件就是本次增量备份的对象。增量备份用的shell脚本(未来准备迁移到flexbackup增量备份脚本,Debian官方即提供了这个包)

可以用类似下面的语句完成本地增量备份:

 /opt/MyDaemon/backup.sh -i -s /home/elias/Web/elias.cn_bak/ -d /home/elias/Web/tar/incremental/

其中/opt/MyDaemon/backup.sh是备份用的shell脚本的路径;“-i”表示增量备份,“-s”后面的是被备份的路径;“-d”后面的是保存增量备份包的路径。

记得要给backup.sh可执行权限。

第三步:定期自动执行增量备份任务

将上面提到的两条指令写入一个shell脚本backup_elias.cn中,也即该脚本内容为(lurkftp的输出信息被重定向到日志文件记录下来以备将来查询之用):

#!/bin/sh
lurkftp -m -d /home/elias/Web/elias.cn_bak/ USERNAME:PASSWORD@www.elias.cn:. >> /home/elias/Web/tar/incremental/lurk_log
/opt/MyDaemon/backup.sh -i -s /home/elias/Web/elias.cn_bak/ -d /home/elias/Web/tar/incremental/

以前用lftp实现备份时的脚本内容:

#!/bin/sh
lftp -c 'open -e "mirror . /home/elias/Web/elias.cn_bak/" -u USERNAME,PASSWORD www.elias.cn'
/opt/MyDaemon/backup.sh -i -s /home/elias/Web/elias.cn_bak/ -d /home/elias/Web/tar/incremental/

之后利用cron来实现脚本的定时调用。也即在打算执行脚本的用户下:

 crontab -e

15 3 * * * /opt/MyDaemon/backup_elias.cn

从而让备份脚本在每天凌晨3点15启动。关于cron的具体使用方法可以在网上很容易搜索到。

最后要注意脚本和目录的权限。由于backup_elias.cn中保存有ftp的用户名和密码,应当用比较严格的权限来保护这个文件,我是将该文件的拥有者设定为crontab -e的执行者,之后将文件权限设置为700。另外本地保存ftp镜像和本地增量备份包的目录也要设置为允许脚本执行的用户写入。


TO-DO

  • 将增量备份脚本切换到flexbackup上;
  • 评估增量备份软件rdiff-backup,如果能达到更好的增量备份效果,则切换到使用此软件完成增量备份;

未解决的问题

由于增量备份脚本的原理比较简单,因此在远端站点上被修改或新增的文件可以确保被备份下来。但是如果在远端站点上删除了文件,则只能在本地最新的镜像版本中显示这个事实,而增量备份包中不会有记录。也即如果在第一次备份远端存在文件A,第二次备份时已删除了文件A,第三次备份又恢复了文件A,且文件A的内容和时间一直没有变化的话,那么经过三次增量备份后,不会记录下来A文件曾经被删除过的事实。也许此时应当利用lftp在进行镜像工作时写下的日志来寻找关于文件被删除的信息。

另外也要求服务器端和本地主机的时间不能相差太多,否则本地增量备份这一步骤时可能出现遗漏或者备份了多余的内容。

GlossyBlue theme adapted by David Gilbert
Powered by PmWiki