概述

最近突然想起来,一个线上应用以前因为有代码级别的定时备份机制,每天会定时备份重要数据然后发邮件到我的邮箱。但是,后面因为代码重构觉得恢复数据也比较麻烦就丢弃了,一直没有补回来备份的措施,你看最近某个云的事情搞了一波之后,吓得我赶紧趁着还有点时间,就补救一下。这次我决定不在代码层级搞了,直接简单粗暴一些,使用 Crontab 定时执行脚本的方式,然后远程拷贝的目标主机(这种方式以前搞计算广告的时候也是这么操作的,不过会加上一些保证机制)。

环境准备

安装工具

  1. [root@liqiang.io]# yum install -y s3cmd
  2. [root@liqiang.io]# s3cmd --configure # 配置 s3cmd

校对时间

有时系统的时区是不正确的,所以需要调整到正确的时区,不然,备份下来的文件时间可能会误导我们:

  1. [root@liqiang.io]# timedatectl list-timezones | grep -i Singapore
  2. Asia/Singapore
  3. [root@liqiang.io]# sudo timedatectl set-timezone Asia/Singapore

备份操作

备份脚本

因为这个应用使用的是 MongoDB,所以我就直接使用 mongodump 就好了,统计了一番,数据量也不大,压缩完 100M 左右,也可接受吧,脚本是从网上抄的一份:

  1. [root@liqiang.io]# cat backup-s3.sh
  2. #!/bin/bash
  3. #Force file syncronization and lock writes
  4. MONGODUMP_PATH="/home/ubuntu/backup/mongodb"
  5. MONGO_HOST="<ip>"
  6. MONGO_PORT="27017"
  7. MONGO_DATABASE="eb"
  8. TIMESTAMP=`date +%F-%H%M`
  9. S3_BUCKET_NAME="MongodbBackup"
  10. S3_BUCKET_PATH="mongodb-backups"
  11. mongo admin --eval "printjson(db.fsyncLock())"
  12. # Create backup
  13. $MONGODUMP_PATH -h $MONGO_HOST:$MONGO_PORT -d $MONGO_DATABASE
  14. # Unlock databases writes
  15. mongo admin --eval "printjson(db.fsyncUnlock())"
  16. # Add timestamp to backup
  17. mv dump mongodb-$HOSTNAME-$TIMESTAMP
  18. tar cf mongodb-$HOSTNAME-$TIMESTAMP.tar mongodb-$HOSTNAME-$TIMESTAMP
  19. # Upload to S3
  20. s3cmd put mongodb-$HOSTNAME-$TIMESTAMP.tar s3://$S3_BUCKET_NAME/$S3_BUCKET_PATH/mongodb-$HOSTNAME-$TIMESTAMP.tar

Crontab

看上去似乎可以了,但是这也只是个备份的脚本,没法定时执行啊,所以还是得设置一下 Crontab,老朋友了。编辑也很简单,直接使用 crontab -e 即可进入编辑页面,这里我已经编辑过了,直接看结果吧:

  1. [root@liqiang.io]# crontab -l
  2. 59 5 * * * /home/mongodb/db-backup/backup-s3.sh > /home/mongodb/db-backup/backup.log 2>&1

也就是每天早上 6 点前准时备份一个,哈哈,美好的一天从清晨开始!

恢复操作

  1. [root@liqiang.io]# mongorestore --uri='mongodb+srv://127.0.0.1:27017' -d test_db .

mongodump 还是 mongoexport

可能使用 MongoDB 的同学这两个命令都见过,这两个命令都可以用于导出 DB 的数据,那么他们之间的差异是什么呢?我们从这两个命令的文档出发去探寻一下:

从介绍中我们可以看出个大概:

这里我总结两个主要区别:

所以,总结来说,如果想要安全地保存数据,那么使用 mongodump,如果想要有人类的可读性,那么可以考虑用 mongoexport

Final

这里其实可以有更好的处理方式,那就是如果你没有自己的备份服务器的话,可以选择一些网盘定时保存到网盘中也是不错的选择。