Rsync备份网站数据

作者: writer 分类: 技术 发布时间: 2017-09-02 15:00 ė 1157 6 没有评论

Rsync备份网站数据

概述

网站在linode上安家以后,开始考虑备份的事情,毕竟这种VPS不是自己的独服,也不是阿里云那种高可用、可伸缩的云平台,因此万一出现什么意外事故、或者账号被封,想拿回自己的数据就很难了,所以必须从一开始就准备好数据备份工作。

wordpress博客系统是一个数据库驱动的动态网站,除了静态页面本身还包含数据库,因此备份的内容需要包含数据库导出的数据。准备好所需数据后,下一个考虑的问题是选择哪一种备份方案:

  • 文件系统备份: 将所有的文件系统包含路径结构和文件权限信息统统备份,这适合于备份HTML文件,软件配置文件,邮件和多面体资源。如果你后来恢复这些保存的数据到一台新系统上,新系统应该和原来备份的系统一模一样。全盘快照是保留了某个时间点上文件系统所有心思的完整备份,如果备份的文件没有包含权限信息,至少保留了文件的内容,但是可能还要更多的时间恢复权限,让恢复的系统正常工作。
  • 数据库备份: 文件系统备份不一定是最适合于数据库备份的。一个完整的全盘快照自然能恢复数据库,但是许多原始的数据库文件对于部分恢复的情况显得多余。运行mysqldump命令更适合大多数情况的数据库备份:你能得到一个可读的完整的MySQL命令文件,可以导入到任何其他的MySQL服务器。

备份方案

作为一个博客小站,本身内容不多,网站目录加上数据库备份文件一起打包才不到50MB。Linode没有提供免费的快照,自动全盘备份功能是另外收费的(每月2刀)。作为不想多花钱的博主,还是考虑自己去实现网站自动备份的功能。Linux提供了许多适合于备份的工具:

  • Rsync: Rsync是一个免费的文件复制工具,可以通过ssh协议将一个目录从一台主机复制到另一台主机。它的语法和scp命令很相似,还有一些参数特别适合做文件备份。更重要的是它能够跳过已经存在的相同的文件,而只复制更改过的文件。所有在备份包含很多文件的目录时,这种增量备份能节省很多时间。
  • Tar: Tar是Linux系统里最重要的打包工具。它能将整个站点目录打包成一个压缩档案,上传至保存备份文件的磁盘或另一台主机,而且打包还可以通过-p参数保留原始权限信息。这种备份的方法应该是最常考虑到的一种,但是缺点是每次备份都需要上传整个站点的数据,一来占用空间,二来在传输过程中会占用网站流量。特别是对于国内云商家1M小水管的环境下,即使是短时间传输备份tar包,也会明显地占用出口带宽。
  • Unison: Unison是一个文件同步工具,普遍用于为目录创建一个副本,然后在两个同步的目录间合并改动。这种同步的方法可以用于网站备份。但是需要注意的是,如果你的网站一个月前被入侵植入后门,那时系统已经同步,那么备份的系统也遭受到相同的入侵。如果你不把这个工具用于同步,这个工具就可以作为备份系统的快照。
  • Rdiff-backup: Rdiff-back是一个用于增量备份的工具。正如官方网站介绍:它集合了少量和增量备份的共同优点。你能通过它实现文件系统备份,而且能切换回历史版本。

Rsync命令

在本文中将以rsync为例介绍备份wordpress网站和相关配置文件的方法。rsync命令可以在客户机上运行,push到远程备份机器;也可以在远程备份机器上运行rsync,从网站服务器pull到备份机器。在后文的命令中,都以后一种pull的形式为例。

首先确保rsync在机器上已经安装,如果没有,运行下面的命令安装上去
yum install rsync
下面一条命令是使用rysnc备份一个目录的基本用法

对-ahvz几个参数说明如下
-a: 保留访问权限和用户权限,递归复制
-h: 输出信息具备可读性
-v: 输出详细信息
-z: 压缩数据传输
rsync命令会将远程目录下的内容复制到指定的本地目录,如果相同文件已经存在,则跳过改文件。假如当前进行中的备份和前一个备份相比只有两个文件被修改,则rsync备份只会传输这两个修改过的文件,这就是增量备份的好处,节省流量和时间。

通过密钥验证使用rsync

前面基本的命令假定远程主机使用密码验证,用户需要输入密码信息登陆远程主机,然后开始传输过程。假如远程主机修改了sshd的配置强制使用安全性更高的密钥登陆(参考之前的博文使用密钥文件登录ssh),或者修改了默认sshd端口,则需要使用 -e参数显式指定这些额外参数。

引号内的参数 -p指定了ssh服务端口12345, -i指定了密钥文件的路径为 .ssh/id_rsa

rsync其他有用参数

–delete参数

--delete参数告诉rsync从接受文件方删除不存在的文件,这些文件在发送方已经被删除。这个参数只对传输目录有效,对单个文件无效。通常带这个参数运行也许会导致意想不到的后果,因此简易再加上 --dry-run参数模拟运行一次,rsync会列出哪些文件有变动,但是不会真正运行这个命令(不会复制文件),确认无误之后再去掉 --dry-run参数实际运行。

–link-dest参数

--link-dest/path_orig参数非常有用,表明了发送方未发生改动的文件会从path_orig硬链接到接收方的目的目录。由于path_orig和目的目录中相同的文件是硬链接,所以相同文件的备份不会占用空间,只会占用一份文件的空间。
基本用法:先运行一次rsync复制要备份的文件到/path_orig目录下

然后以path_orig目录下的内容为基础,每次备份创建到一个新的目录下,这样 /path/to/local/backup即使看起来和 /path_orig一样都包含了一样的网站内容,但是其实只有变动的文件是真正保存在 /path/to/local/backup下,其他未改动的文件都通过硬链接共享文件占用的空间。

–exclude参数

--exclude参数告诉rsync跳过某些指定的目录或忽略某些类型的文件
比如下面的命令会忽略所有以~和log结尾的文件,以及/home/wwwroot/feiqy.com/backups目录。

设定crontab定时任务运行备份任务

当手动运行上面的命令能正确地备份到远程目录到本地,就可以通过crontab定期自动运行这些备份命令。下面是crontab命令指定运行周期地基本格式

假如我们要每天2:00时运行这条备份命令,可以按照下面设定
0 2 * * * rsync -ahvz --delete --link-dest=/path_orig user@production_server:/home/wwwroot/feiqy.com /path/to/local/backup
假如备份不需要那么频繁的话,每周日早上2:00运行备份
0 2 * * 0 rsync -ahvz --delete --link-dest=/path_orig user@production_server:/home/wwwroot/feiqy.com /path/to/local/backup

最后附上一份完整地备份任务列表,包含服务器端备份MySQL数据库和备份端备份任务。
服务器端

备份端同时备份了MySQL, PHP和nginx地配置文件。

总结

通过这个方法,我们可以在多个地点配置备份命令,定期自动地去备份Web网站服务器上重要数据,而且利用rsync增量备份地特点节省流量和带宽。而且可以根据需要,增加需要备份的内容。

本文出自扉启博客,转载时请注明出处及相应链接。

本文永久链接: https://www.feiqy.com/rsync-backup-website/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Ɣ回顶部