数据无价,有备无患

最近的博客评论系统还在升级中,同时又在折腾服务器安全之事,手头上的几本书也还没看完,找工作的事情已刻不容缓,却又毫无进展,不过这些都放下先,来谈一谈服务器备份的事。

这几天 V2MM 上的小伙伴们分享了用 NAS 或 TimeMachine 备份个人数据的文章,收益颇多。@aaron67 说得好:

备份不做,十恶不赦

对于个人电脑数据的备份,请参考 V2MM 上其他人的做法,比我更酷,本文只介绍 V2MM 在服务器上所做的备份策略:

对于一个完美的服务器备份,我觉得需要达到如下特点:

  1. 每日进行全量数据备份;
  2. 多地备份,至少有三处吧;
  3. 数据可以按小时回滚;
  4. 紧急情况可以很容易重新搭建环境;

于是我在 NodeBB Scripts 这个项目里添加了两个备份的脚本:

backup-mongodb.js: 备份mongodb数据库,并保存zip文件至父目录;
backup-dir.js: 备份nodebb整个文件夹,并保存zip文件至父目录。

这两个脚本都需要带一个命令行参数,参数用于指定你的 nodebb 的路径。比如可以这样运行:

node backup-mongodb.js ~/workspace/nodebb/
node backup-dir.js ~/workspace/nodebb/

运行完后zip压缩保存至你指定的目录的父目录。似乎有点绕,目前这两个脚本暂时能达到我的需求,同时可以备份数据库和整个项目。

当然,除了备份脚本以外,还需要配合 Crontab 定时运行。

每日定时备份:

0 * * * * /home/river/.nvm/versions/node/v6.2.2/bin/node /home/river/nodebb-scripts/backup-mongodb.js /home/river/mynodebb >>/home/river/cronjob.log 2>&1  
10 0 * * * /home/river/.nvm/versions/node/v6.2.2/bin/node /home/river/nodebb-scripts/backup-dir.js /home/river/mynodebb >>/home/river/cronjob.log 2>&1  

这两天 crontab 命令每日定时运行 mongodb 和项目的备份。注意 crontab 的语法,以及 NVM 管理的 Node 的路径,需要显式的调用。

本地定时下载备份(多地备份):

51 10,15,22 * * *  scp -i /home/river/.ssh/rsa_nopassward river@server_ip:~/nodebb-db-nodebb-$(date +\%Y-\%m-\%d).zip /home/river/.vip_data >>/home/river/cronjob.log 2>&1

5 16 * * 6 scp -i /home/river/.ssh/rsa_nopassward  river@server_ip:~/nodebb-dir-$(date +\%Y-\%m-\%d).zip /home/river/.vip_data >>/home/river/cronjob.log 2>&1  

这两条运行在本地的 crontab 每日定时去服务器上下载备份数据,这里有一个坑, crontab 的语法需要用 \ 转义 %

删除一周以前的备份:

29 11 * * * rm -f /home/river/nodebb-db-nodebb-$(date +\%Y-\%m-\%d  --date="7 days ago").zip

30 11 * * * rm -f /home/river/nodebb-dir-$(date +\%Y-\%m-\%d  --date="7 days ago").zip  

每日再定时跑一下上面的脚本,删除一周以前老的备份。 这里 $(date +\%Y-\%m-\%d --date="7 days ago") 是一种很有趣的写法 ;)

其他备份

当然,备份远远不只这么简单,目前我做的还只是最简单的处理,对于小网站小项目这样处理暂时来说可能足够了(当然也不一定),进一步请参考一下下面的文章:

我想下一步就要利用 Mongodb 的分布式特性,实现数据库热切换和自动备份。

还有更好的方案吗? 请求评论和建议!!!