概述
最近突然想起来,一个线上应用以前因为有代码级别的定时备份机制,每天会定时备份重要数据然后发邮件到我的邮箱。但是,后面因为代码重构觉得恢复数据也比较麻烦就丢弃了,一直没有补回来备份的措施,你看最近某个云的事情搞了一波之后,吓得我赶紧趁着还有点时间,就补救一下。这次我决定不在代码层级搞了,直接简单粗暴一些,使用 Crontab 定时执行脚本的方式,然后远程拷贝的目标主机(这种方式以前搞计算广告的时候也是这么操作的,不过会加上一些保证机制)。
环境准备
安装工具
[root@liqiang.io]# yum install -y s3cmd
[root@liqiang.io]# s3cmd --configure # 配置 s3cmd
校对时间
有时系统的时区是不正确的,所以需要调整到正确的时区,不然,备份下来的文件时间可能会误导我们:
[root@liqiang.io]# timedatectl list-timezones | grep -i Singapore
Asia/Singapore
[root@liqiang.io]# sudo timedatectl set-timezone Asia/Singapore
备份操作
备份脚本
因为这个应用使用的是 MongoDB,所以我就直接使用 mongodump
就好了,统计了一番,数据量也不大,压缩完 100M 左右,也可接受吧,脚本是从网上抄的一份:
[root@liqiang.io]# cat backup-s3.sh
#!/bin/bash
#Force file syncronization and lock writes
MONGODUMP_PATH="/home/ubuntu/backup/mongodb"
MONGO_HOST="<ip>"
MONGO_PORT="27017"
MONGO_DATABASE="eb"
TIMESTAMP=`date +%F-%H%M`
S3_BUCKET_NAME="MongodbBackup"
S3_BUCKET_PATH="mongodb-backups"
mongo admin --eval "printjson(db.fsyncLock())"
# Create backup
$MONGODUMP_PATH -h $MONGO_HOST:$MONGO_PORT -d $MONGO_DATABASE
# Unlock databases writes
mongo admin --eval "printjson(db.fsyncUnlock())"
# Add timestamp to backup
mv dump mongodb-$HOSTNAME-$TIMESTAMP
tar cf mongodb-$HOSTNAME-$TIMESTAMP.tar mongodb-$HOSTNAME-$TIMESTAMP
# Upload to S3
s3cmd put mongodb-$HOSTNAME-$TIMESTAMP.tar s3://$S3_BUCKET_NAME/$S3_BUCKET_PATH/mongodb-$HOSTNAME-$TIMESTAMP.tar
Crontab
看上去似乎可以了,但是这也只是个备份的脚本,没法定时执行啊,所以还是得设置一下 Crontab,老朋友了。编辑也很简单,直接使用 crontab -e
即可进入编辑页面,这里我已经编辑过了,直接看结果吧:
[root@liqiang.io]# crontab -l
59 5 * * * /home/mongodb/db-backup/backup-s3.sh > /home/mongodb/db-backup/backup.log 2>&1
也就是每天早上 6 点前准时备份一个,哈哈,美好的一天从清晨开始!
恢复操作
[root@liqiang.io]# mongorestore --uri='mongodb+srv://127.0.0.1:27017' -d test_db .
mongodump 还是 mongoexport
可能使用 MongoDB 的同学这两个命令都见过,这两个命令都可以用于导出 DB 的数据,那么他们之间的差异是什么呢?我们从这两个命令的文档出发去探寻一下:
- mongodump:https://www.mongodb.com/docs/database-tools/mongodump/
- mongoexport:https://www.mongodb.com/docs/database-tools/mongoexport/
从介绍中我们可以看出个大概:
- mongodump:is a utility that creates a binary export of a database’s contents.
- mongoexport:is a command-line tool that produces a JSON or CSV export of data stored in a MongoDB instance.
这里我总结两个主要区别:
- mongodump 导出的数据是二进制的,mongoexport 导出的是 csv 和 json 的形式,相对来说 mongoexport 导出后可读性高一些;
- mongodump 支持所有的数据类型(因为是二进制的),mongoexport 可能不支持某些 BSON 的数据类型;
所以,总结来说,如果想要安全地保存数据,那么使用 mongodump
,如果想要有人类的可读性,那么可以考虑用 mongoexport
。
Final
这里其实可以有更好的处理方式,那就是如果你没有自己的备份服务器的话,可以选择一些网盘定时保存到网盘中也是不错的选择。