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

By | 2014/05/06

备份是保证系统安全设置的重要环节, 不同的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比较方便),创建相应的目录


mkdir  -p /var/VPSbackup/aliyun

3) 生成SSH密钥

 ssh-keygen 

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

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


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

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


//如果在主机A上authorized_keys文件不存在,需要执行下面的命令

#mkdir -p /root/.ssh

#chmod 700 /root/.ssh

#touch /root/.ssh/authorized_keys

#chmod 600 /root/.ssh/authorized_keys

//追加公钥

cat /root/id_rsa.pub >> /root/.ssh/authorized_keys.

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

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

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=youremail@domain.com

HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

0 14 * * * root bash backup.sh            #每天下午2点中自动执行备份的脚本

其中backup.sh的内容如下:

#!/bin/sh

/usr/bin/rsync -avz -e "ssh -i /root/.ssh/id_rsa.pub"  root@A.com:/etc   /var/VPSbackup/aliyun 
/usr/bin/rsync -avz --delete  -e "ssh -i /root/.ssh/id_rsa.pub"  root@A.com:/home/someone/gitdata   /var/VPSbackup/aliyun
/usr/bin/rsync -avz --delete  -e "ssh -i /root/.ssh/id_rsa.pub"  root@A.com:/home/someone/projects   /var/VPSbackup/aliyun 
/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>
/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来配置自动增量备份已经完成,你可以根据自己的情况在上面的脚本的基础上进行修改。

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.