vps备份设置好以后一直没有重新规划更好的备份方案,趁最近给家里搭家庭服务器,顺便重新设定vps的备份。
回顾
之前的备份方案主要是把配置文件软链接到一个目录下,然后每天打包上传到dropbox,同时用git上传到bitbucket。每天备份数据库文件。每天增量备份邮件目录,每周重新打包。每周把配置文件和部分数据打包上传到dropbox。
问题是会占用很多dropbox的空间,bitbucket可能被别人拿到一些设置文件包括密码,而且数据和配置区分不是很清楚,对不同版本的配置文件的回滚也不是很明确。这次规划主要是清楚区分配置和数据,设定各自备份的频率,和备份的储存空间。
冗余和备份
冗余和备份,两个概念有重合的地方,也有区别。
冗余
冗余主要是同一个文件,同时储存几份。当一个文件损坏的时候,会有另一个文件可以即时替代。也就是冗余是两份文件同时工作的。冗余主要防范的是磁盘故障,最简单的就是RAID了,当然成本也就提高了。
但是冗余不能防止误删文件的情况,或者是系统问题导致无法开机了,冗余也会同时无法访问,这时候就只能依靠备份。
备份
备份是当一个文件损坏了,需要从备份中提取这个文件,然后覆盖掉损坏的文件。这个过程会有时间差。
但是备份可以做到在系统损坏以后,还原数据和配置。
联系和区别
冗余可以作为备份存在,比如一份文件保存在了两个磁盘,当一个磁盘损坏以后,也可以从另一个磁盘提取数据进行恢复。但是冗余不应该代替备份,因为如果修改配置文件导致服务启动失败,那么所有冗余都会被修改,这时候就应该从备份中还原之前的版本。或者误操作导致数据库被删除,也只能从备份中还原。
配置和数据
配置就是设置好不需要改动的。比如说wordpress的wp-config.php文件。而数据是每天会更新的,比如wordpress的评论。而自己写的webapp程序,也属于配置,因为也是不会经常变动。
配置需要版本,因为如果修改的时候不小心可能会需要恢复到之前能工作的版本。而数据需要更频繁备份,因为数据的更新频率不受自己控制,只能频繁备份以减少更新与备份之间的差异。
两者都需要冗余,也都需要备份。
配置文件方案
因为成本的限制,我无法建立冗余。但好在Linode本身已经采用了RAID,所以冗余这部分可以放心。
而我自己的vps本身不采用RAID,只是使用rsnapshot,把配置文件多保存一份在磁盘上而已。需要自己手动覆盖被损坏文件。但是比起保存到另一个服务器或者储存空间来说,时间差比较小,还原操作也简单。同时有了版本纪录。可以在尽量少占用磁盘空间的前提下保存各个配置文件的各个版本。
使用cron设定24小时中每小时保存一个版本,30天内每天凌晨保存一个版本,3个月内每个月保存一个版本。同时每天会打包并压缩后,采用gpg加密上传到AWS S3,并且上传的文件会加上当天日期,所以并不覆盖之前的文件。
数据方案
比起配置文件,数据的备份更清楚一些。因为不太需要版本。但是要考虑的是流量,数据备份文件通常都很大,所以可以考虑增量备份,也顺带做到了版本控制。当然mysql数据库是无法增量的。
数据库可以每天导出,然后压缩并加密上传到S3。而其他的文件比如说邮件,可以整个目录打包,每天增量备份,每周一把上周的备份转去S3的Infrequent Access,再重新建立新的备份文件。
为了减少S3的成本,可以设置S3的life cycle,一段时间(30天)后自动删除文件,包括配置和数据。
快照
数据备份之后,也要考虑,如果不是恢复部分数据,而是全系统恢复的话,如果采用安装系统,安装软件,恢复配置文件,导入数据,就有点麻烦了。所以可以采用系统快照的方式整系统备份。当然这就会占更多的空间。
Linode有提供磁盘快照功能,但是需要关闭vps后才能备份。
自己建立快照的话,可以用rsync同步到另一台服务器或者本地电脑,但是考虑到恢复系统的时候需要配置ssh,而且最重要的是rsync复制的文件没有加密,所以还是决定用tar打包,加密上传到S3。
因为有了之前的备份,快照可以放在S3的Glacier里,每三个月才更新一次,这样成本能控制到比较低。
为了恢复的时候方便,快照可以分为两个文件。第一个文件包含诸如/etc/fstab
/etc/hosts
/etc/hostname
/etc/systemd/network/50-static.network
/etc/passwd
/etc/group
,这样就能进行一些最基本的设置。
而之后执行tar -pcP --same-owner --numeric-owner --hard-dereference --ignore-failed-read --exclude={/dev,/proc,/sys,/tmp,/run,/boot,/mnt,/media,/var/log,/var/cache,/var/tmp,/lost+found,/root/.thumbnails,/root/.cache,/root/.local/share/Trash,/root/.gvfs,/home/*/.thumbnails,/home/*/.cache,/home/*/.local/share/Trash,/home/*/.gvfs} --exclude-backups --exclude-caches /
打包所有文件。
因为第一个文件会设置用户和用户组,所以第二个文件解压还原后就可以建立起完整的系统了。
这个主要是为了应对极端情况比如说整个vps被删除,或者需要更换vps服务商,就可以很快的搭建一个新系统了。
总结
这个备份方案可以对90天内配置文件保留各个版本,其中24小时内可以每小时保存一个版本。配置文件每天会保留一个版本到S3,持续30天。而数据库是每天更新并且可以恢复到30天内任意一个周末的旧版本。其他的数据则可以恢复到30天内任意一天。
如果备份存储成本对于数据的重要性来说不需要考虑的话,也可以考虑保存每天的数据库,甚至使用S3自动保存多个备份,包括不同大陆。