> CentOS > CentOS运维 >

阿里云CentOS 的自动备份方案 — rsync + crontab

备份是保证系统安全设置的重要环节, 不同的VPS提供商都提供一定程度的备份服务,比如DigitalOcean本身就提供 Snapshot和 Backup的两种备份服务,但并不是免费的,要另外付费的,其中Backup服务是一种异地自动备份的服务,非常实用! 阿里云目前只提供 快照(Snapshot)的备份服务,没有提供自动备份的功能。

不管怎么样,除了服务商提供的服务外,我们最好还是自己也有个备份的措施更放心些。

对于我来说,如果整个VPS仅仅用作Wordpress的博客,最简单的方法就是用Wordpress的一些备份插件,把WordPress的网站和数据库每天定时备份到自己云空间中(比如Google Drive或者Dropbox上)。

如果是其他类型的网站,则需要好好规划一下备份的方案。下面就以备份阿里云VPS中的数据为例来说明一下。

1. 需要备份哪些数据

一般来讲,如果要备份整个磁盘镜像,仍然需要使用服务商提供snapshot之类的功能比较好。

我们自己的备份,为了减少备份的负担和带宽的消耗,无需备份系统和软件,只需要备份 网站,数据库,配置文件,个人数据等。

主要有下面几个:

  • /etc  目录,虽然这里面有些内容实际上是无需备份的,但我个人也懒得把哪些需要备份的仔细挑出来, 而且这个目录的大小最多也就几十M。干脆就直接备份下来吧。
  • /home目录, 这个目录是用户个人的数据存放位置,当然要备份! 但需要注意的是,这个目录 下 有很多cache,  history, log, download 之类的东西,这些其实都是无需备份的。  我的解决方法是找到具体需要备份的目录,比如 /home/aaa/mygitdata,  /home/bbb/mydocs 等,仅仅备份这几个具体的目录,这样比用排除法更容易些。
  • /var/www目录, 这是web服务器的主目录,肯定是要备份的。 要备份整个目录,但是要注意:这里面有些程序或者插件会产出大量的日志/备份/缓存类的数据,这些要排除,否则备份的数据量会太大!
  • /var/spool/mail 目录,如果你开启了mail服务,备份整个目录
  • /var/lib/mysql 目录,数据库文件所在地, 整个备份!

备份了上面的数据,基本上就差不多了。

2. 完全备份还是增量备份

完全备份的方式,就是把上面的数据通过tar来打包,然后传送到具体的备份的地方。可以写个script,  只保留最近两次的备份。 这个方法在异地备份的情况下有个很大的问题,每次都要把上百兆的数据传送出去,严重消耗系统资源和带宽。不推荐。

增量备份,就是采用Linux自带的那个rsync命令, 每次只备份改动过的数据,这种方案对于远程备份来说是更好的选择

3.  本地还是异地备份

由于阿里云的主机的磁盘分为系统盘和数据盘,如果规划合理的话,可以把所有的需要备份的数据(/etc,/var , /home )都放在数据盘,备份时可以把这些数据备份到系统盘!

一般情况下,最好还是异地备份,比如把DigitalOcean的数据备份到阿里云上,把阿里云的数据备份到自己的工作机上。

3. 如何自动执行备份计划

利用系统的cron可以让备份每天晚上2:00左右自动执行。

 

解决了上面的问题以后,  自动异地增量备份的具体步骤如下:

假定我们要把主机A的数据定时备份到主机B上。

1) 检查在主机A和B上是否都安装了rsync,如果没有,用yum install rsync 来安装。

2)在主机B,用root用户登录(因为用到crontab系统的服务,最好还是用root比较方便),创建相应的目录

1 mkdir  -p /var/VPSbackup/aliyun

3) 生成SSH密钥

1 ssh-keygen

执行完这个命令后,在/root/.ssh中会生成id-rsa(私钥文件), id_rsa.pub (公钥文件)

把id_rsa.pub这个文件上传到主机A上

1 scp /root/.ssh/id_rsa.pub  root@A.com:/root/id_rsa.pub

在主机A上,把公钥文件附加到authorized_keys上 , 因为备份这个也涉及到权限问题,我们在主机A上也采用root用户

1 //如果在主机A上authorized_keys文件不存在,需要执行下面的命令
2  
3 #mkdir -p /root/.ssh
4  
5 #chmod 700 /root/.ssh
6  
7 #touch /root/.ssh/authorized_keys
8  
9 #chmod 600 /root/.ssh/authorized_keys
10  
11 //追加公钥
12  
13 cat /root/id_rsa.pub >> /root/.ssh/authorized_keys.

这样的话,我们以后用scp 或者rsync来进行数据复制或同步的时候,就不需要输入密码了!

4)在主机B上 修改 /etc/crontab文件

1 SHELL=/bin/bash
2  
3 PATH=/sbin:/bin:/usr/sbin:/usr/bin
4  
5 MAILTO=youremail@domain.com
6  
7 HOME=/
8  
9 # For details see man 4 crontabs
10  
11 # Example of job definition:
12 # .---------------- minute (0 - 59)
13 # | .------------- hour (0 - 23)
14 # | | .---------- day of month (1 - 31)
15 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
16 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
17 # | | | | |
18 # * * * * * user-name command to be executed
19  
20 0 14 * * * root bash backup.sh            #每天下午2点中自动执行备份的脚本

其中backup.sh的内容如下:

 
1 #!/bin/sh
2  
3 /usr/bin/rsync -avz -e "ssh -i /root/.ssh/id_rsa.pub"  root@A.com:/etc   /var/VPSbackup/aliyun 
4 /usr/bin/rsync -avz --delete  -e "ssh -i /root/.ssh/id_rsa.pub"  root@A.com:/home/someone/gitdata   /var/VPSbackup/aliyun
5 /usr/bin/rsync -avz --delete  -e "ssh -i /root/.ssh/id_rsa.pub"  root@A.com:/home/someone/projects   /var/VPSbackup/aliyun 
6 /usr/bin/rsync -avz -e "ssh -i /root/.ssh/id_rsa.pub"  --exclude mysite/updraft  --exclude mysite/.cache    root@A.com:/var/www   /var/VPSbackup/aliyun</pre>
7 /usr/bin/rsync -avz -e "ssh -i /root/.ssh/id_rsa.pub"  root@A.com:/var/lib/mysql   /var/VPSbackup/aliyun</pre>

说明一下:
–exclude: 指明不需要备份的东西。 这里的路径是针对于source的, 也就是说 –exclude mysite/updraft 是不备份 主机A上的 /var/www/mysite/updraft这个目录

–delete: 如果A主机某个文件删除了,备份时从B主机那里也删除这个文件

-e “ssh -i /root ….”: 选择采用ssh这个shell来在A和B之间通信和登录。 ssh -i identity-file: 指明用证书的方式来登录,而不是密码。

至此,通过rsync和cron来配置自动增量备份已经完成,你可以根据自己的情况在上面的脚本的基础上进行修改。



(责任编辑:IT)