备份是保证系统安全设置的重要环节, 不同的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密钥
执行完这个命令后,在/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文件不存在,需要执行下面的命令 |
7 |
#touch /root/.ssh/authorized_keys |
9 |
#chmod 600 /root/.ssh/authorized_keys |
13 |
cat /root/id_rsa.pub >> /root/.ssh/authorized_keys. |
这样的话,我们以后用scp 或者rsync来进行数据复制或同步的时候,就不需要输入密码了!
4)在主机B上 修改 /etc/crontab文件
3 |
PATH=/sbin:/bin:/usr/sbin:/usr/bin |
5 |
MAILTO=youremail@domain.com |
9 |
# For details see man 4 crontabs |
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 |
18 |
# * * * * * user-name command to be executed |
20 |
0 14 * * * root bash backup.sh #每天下午2点中自动执行备份的脚本 |
其中backup.sh的内容如下:
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) |