Linux 定时备份 MongoDB 数据到 Azure Blob

73

每日定时执行备份脚本,将 Mongo 的整个数据库进行打包压缩,然后将打包后的文件上传到 Azure Blob 中。

备份工具介绍

MongoDB 备份文件

通过 mongodump 命令将 Mongo 整个数据库导出 bson 格式的文件:

mongodump -h localhost --authenticationDatabase admin -u 账号 -p 密码 -d 数据库名 -o 输出目录

导出文件结构:
.
 |_输出目录
   |_数据库名
     |_集合名.metadata.json
     |_集合名.bson

MongoDB 备份(mongodump) 与 恢复(mongorestore) 工具使用文档:https://www.runoob.com/mongodb/mongodb-mongodump-mongorestore.html

Azure Blob 上传文件

Linux 通过命令操作 Azure Blob,可以使用官方提供的 AzCpoy工具,工具文档及下载地址见:https://docs.microsoft.com/zh-cn/azure/storage/common/storage-use-azcopy-v10

使用 AzCopy 将文件上传到 Azure Blob 存储:https://docs.microsoft.com/zh-cn/azure/storage/common/storage-use-azcopy-blobs-upload

上传文件命令:

azcopy cp "/path/to/file.txt" "https://[account].blob.core.windows.net/[container]/[path/to/blob]?[SAS]"

实践

下载 AzCpoy 工具

mkdir ~/scripts && wget -O ~/scripts/azcopy_v10.tar.gz https://aka.ms/downloadazcopy-v10-linux && tar -xf ~/scripts/azcopy_v10.tar.gz -C ~/scripts/ --strip-components=1

编写备份脚本

vim ~/scripts/mongodb_backup.sh

#!/bin/sh
echo "启动MongoDB备份脚本..."

# 环境
ENV=dev
# 工作目录
WORK_DIR=~/backup/mongodb
# 当前时间字符串,格式:2021011521
DATE=$(TZ=UTC-8 date +"%Y%m%d%H")
# mongodump 命令备份文件的输出目录
DEST_DIR=$WORK_DIR/$DATE
# 最终打包文件名,格式:前缀+时间,如:mongodb-data-backup-2021011521.tar.gz
PACK_FILE_NAME=mongodb-data-backup-$DATE.tar.gz
PACK_FILE_PATH=$WORK_DIR/$PACK_FILE_NAME

# Azure Blob 配置
AZURE_BLOB_ACCOUNT_NAME=contentdevsa
AZURE_BLOB_HOST=https://$AZURE_BLOB_ACCOUNT_NAME.blob.core.chinacloudapi.cn
AZURE_BLOB_CONTAINER=backup
AZURE_BLOB_SAS=共享签名
AZURE_BLOB_FILE_DIR=mongo/$ENV
AZURE_BLOB_FILE_PATH=$AZURE_BLOB_HOST/$AZURE_BLOB_CONTAINER/$AZURE_BLOB_FILE_DIR/$PACK_FILE_NAME

# 创建输出目录
rm -rf $WORK_DIR
mkdir -p $DEST_DIR

echo "正在执行 mongodump 命令..."
mongodump -h localhost --authenticationDatabase admin -u 账号 -p 密码 -d ai121_content -o $DEST_DIR

echo "正在打包 $PACK_FILE_PATH ..."
tar -zcvf $PACK_FILE_PATH -C $DEST_DIR .

echo "开始上传 $PACK_FILE_NAME 到 Azure Blob"
sudo ~/scripts/azcopy cp $PACK_FILE_PATH $AZURE_BLOB_FILE_PATH$AZURE_BLOB_SAS

# 删除 mongodump 命令备份文件的输出目录
rm -rf $DEST_DIR

echo "MongoDB备份完毕"

使脚本可执行:

chmod +x ~/scripts/mongodb_backup.sh

定时执行

crontab -e

0 2 * * * ~/scripts/mongodb_backup.sh

恢复备份数据

使用mongo提供的mongorestore工具将数据重新导入到数据库:

mongorestore -h localhost --authenticationDatabase admin -u 账号 -p 密码 -d 数据库名称 备份数据目录

其他

crontab定时任务没有执行

原因1:虚拟机时区问题

解决方式1(修改系统时区):
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
service cron restart

解决方式2(修改 Contab 时区 - 未试过):
sudo vim /etc/crontab
添加变量 CRON_TZ=Asia/Shanghai
service cron restart

mongodump 命令找不到

需安装mongo工具包:
https://docs.mongodb.com/database-tools/installation/installation-linux
https://www.mongodb.com/try/download/database-tools