windows下mongodb增量备份方案

背景

项目开发完成后需要对工程中的mongodb作本地备份,之前在做mysql备份的时候,只使用的全备的方式来备份,即使用mysql自带的mysqldump命令来实现,下面顺便贴出备份的脚本。

rem ******MySQL backup start********
@echo off

set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%"
mysqldump --user=%usr% --password=%pwd% --host=%host% --port=%port% --protocol=tcp --single-transaction --default-character-set=utf8 --extended-insert --quick --routines --events --databases "db_name" > C:\backup_%Ymd%.sql

@echo on
rem ******MySQL backup end********

其中涉及的相关的参数可以查阅文档找到,这里不再详述。

而在做mongodb地时候,当使用mongodump时,发现当数据量稍大时,备份消耗的时间会非常大,我们测试服务器上的数据量大约为10个G,10分钟只能备份2%不到,所以考虑使用增量备份的方式来备份数据,下面贴出的是使用mongodump方式全备mongodb的脚本。

rem ******Mongodb full backup start******
@echo off

set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%"

md C:\backup_%Ymd%\full\

"C:\Program Files\MongoDB\Server\3.2\bin\mongodump.exe" --host=localhost --port=27017 --authenticationDatabase=admin -o C:\backup_%Ymd%\full\

@echo on
rem ******Mongodb full backup end******

增量备份

要想实现mongodb的增量备份,需要首先了解几个mongodb相关的概念

  1. 集群

mongodb的集群搭建方式主要有三种,主从模式,Replica set模式,sharding模式。

  1. Replica Set(副本集)

副本集是一种在多台机器同步数据的进程,副本集体提供了数据冗余,扩展了数据可用性。在多台服务器保存数据可以避免因为一台服务器导致的数据丢失。
也可以从硬件故障或服务中断解脱出来,利用额外的数据副本,可以从一台机器致力于灾难恢复或者备份。

  1. oplog

The oplog (operations log) is a special capped collection that keeps a rolling record of all operations that modify the data stored in your databases.

这里分享几篇文章作为参考:

  1. Mongodb主从复制 及 副本集+分片集群梳理
  2. MongoDB oplog详解
  3. Replica Set Oplog
  4. 挖一挖MongoDB的备份与还原(实现指定时间点还原和增量备份还原)
  5. MongoDB增量备份方案介绍
  6. mongodb增量备份脚本与原理

mongodb的增量备份是通过集群的oplog功能来实现的,所以需要满足mongodb集群至少需要是一个副本集集群如果是分片集,那么每个分片也都要是副本集),在一个搭建好的集群中的master节点中,可以在local数据库下找到oplog.rs,通过备份这个collection中指定时间段内的数据来实现增量备份。

下面贴出增量备份脚本代码

rem ******MongoDB backup start********
@echo off

echo wscript.echo DateDiff("s", "01/01/1970 00:00:00", Date())>sjc.vbs
for /f %%i in ('cscript sjc.vbs /nologo') do set endDate=%%i
set /a "endDate=%endDate%-28800"
set /a "startDate=%endDate%-86400"

set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%"

md C:\mongodbBackup\backup_%Ymd%\

"C:\Program Files\MongoDB\Server\3.2\bin\mongodump.exe" --host=localhost --port=27017 --authenticationDatabase=admin -d local -c oplog.rs --query "{"ts":{$gte:Timestamp(%startDate%, 1),$lt:Timestamp(%endDate%, 1)},ns:/^test/}" -o C:\mongodbBackup\backup_%Ymd%\

@echo on
rem ******MongoDB backup end********

这是增量备份的脚本,其中可以看到在命令行中加入了查询条件,ts表示时间范围,这里是设置的从当前日期前一天的0点到今天的0点,需要注意的是这样设置需要与脚本实际的运行方式相对应,笔者的脚本程序是通过计划任务的方式运行的,设置在每天凌晨运行备份前一天从0点开始24小时的数据(这里需要根据环境的不同来更改),ns表示查询的数据的范围,笔者这里是查询了用于测试的test数据库的数据,实际也要作相应的更改(这两个查询条件可以在oplog.rs这个collection中的document中找到相对应的字段,可以根据不同的需求作添加或更改)。

恢复

我这里是设置了每周末执行一次全备(可以使用开始给出的全备方案,也可以手动物理备份),然后每天执行一次增量备份,恢复时首先恢复全备的数据,再依次恢复增量备份的数据。

恢复数据使用了mongorestore功能,先恢复全备的数据:

"C:\Program Files\MongoDB\Server\3.2\bin\mongorestore.exe" --host=localhost --port=27017 --authenticationDatabase=admin 
C:\backup_20181101083905\full\

再恢复增量备份的数据:

"C:\Program Files\MongoDB\Server\3.2\bin\mongorestore.exe" --host=localhost --port=27017 --oplogReplay --authenticationDatabase=admin C:\mongodbBackup\backup_oplog

--oplogReplay

After restoring the database dump, replays the oplog entries from the oplog.bson file located in the top level of the dump directory. When used in conjunction with mongodump --oplog, ~bin.mongorestore --oplogReplay restores the database to the point-in-time backup captured with the mongodump --oplog command. For an example of --oplogReplay, see Restore Point in Time Oplog Backup.

~bin.mongorestore --oplogReplay replays any valid oplog.bson file found in the top level of the dump directory. That is, if you have a bson file that contains valid oplog entries, you can name the file oplog.bson and move it to the top level of the dump directory for ~bin.mongorestore --oplogReplay to replay.

恢复增量的数据时需要注意,我们前台增量备份的数据是oplog.rs这个collection的数据,那么我们还需要把备份后的~/local/oplog.rs.bson这个文件拷贝到还原目录下(恢复时使用的还原目录,即上面脚本中的C:\mongodbBackup\backup_oplog这个目录)。

验证

如上面所说,笔者介绍的增量备份方案使用的前提是需要有一个集群的环境,但尽量不要在生产环境测试验证,数据无价,建议先在自己的开发环境中搭建一个简单的集群环境用于测试验证。

测试环境搭建

副本集的概念可以在笔者在上面给出的几篇文章中进行理解,这里我只介绍我在开发时搭建的步骤,毕竟相关的概念我也不清楚2333。

  1. 安装mongodb
  2. 创建3个文件夹,分别命名r1,r2,r3
  3. 在这3个文件夹中分别新建mongodb.conf,mongodb.log,start.bat

我是在C:/mongos/文件夹下创建的这3个文件夹,其中:

  • C:/mongos/r1/mongodb.conf
dbpath=C:\mongos\r1
logpath=C:\mongos\r1\mongodb.log
logappend=true
journal=true
quiet=true
port=27017
replSet = testrs
  • C:/mongos/r1/start.bat
cd C:\Program Files\MongoDB\Server\3.2\bin
mongod --config C:\mongos\r1\mongodb.conf
  • C:/mongos/r2/mongodb.conf
dbpath=C:\mongos\r2
logpath=C:\mongos\r2\mongodb.log
logappend=true
journal=true
quiet=true
port=27018
replSet = testrs
  • C:/mongos/r2/start.bat
cd C:\Program Files\MongoDB\Server\3.2\bin
mongod --config C:\mongos\r2\mongodb.conf
  • C:/mongos/r3/mongodb.conf
dbpath=C:\mongos\r3
logpath=C:\mongos\r3\mongodb.log
logappend=true
journal=true
quiet=true
port=27019
replSet = testrs
  • C:/mongos/r3/start.bat
cd C:\Program Files\MongoDB\Server\3.2\bin
mongod --config C:\mongos\r3\mongodb.conf

可能还需要把mongodb的安装路径修改为你本地安装的路径,也可以将bin目录添加到环境变量path中。

  1. 分别运行3个文件夹中的start.bat文件,即开启了3个mongo实例
  2. 配置主,备,仲裁节点
    进行mongo命令行(可以直接在cmd中输入> mongo localhost:27017连接mongo进入),分别执行以下命令:
> use admin

> cfg={ _id:"testrs", members:[ {_id:0,host:'localhost:27017',priority:2}, {_id:1,host:'localhost:27018',priority:1}, {_id:2,host:'localhost:27019',arbiterOnly:true}] };

> rs.initiate(cfg)

到此一个简单的mongodb集群环境就搭建完成,可以在刚才的命令行中输入> rs.status()来确认是否正常搭建。这个集群是由本地开启的三个端口27017,27018,27019组成的,其中端口为27017的节点为主节点,通过客户端(笔者使用的是robomongo)连接这三个节点,在27017中的local数据库中可以找到oplog.rs这个collection。

备份测试

测试环境搭好了,测试还不是随意搞搞嘛2333

总结

由于备份mongo数据库时,使用mongodump全备的方式来备份会花费大量的时间,因为mongodb在备份的时候并不会锁表,也不会生成一个快照,耗时过长的备份可能会引起数据一致性问题,所以需要使用增量备份来降低一些副作用,这里笔者使用的是依赖于mongo集群的增量备份方式,通过与周期性的全备配合使用可以实现相对可靠的数据备份。

最后需要指出的是,数据无价,笔者并不是一个DBA,数据库相关的原理知识并不完备,这里只是分享了在处理mongodb增量备份的过程中自己的总结,希望谨慎操作。

原文地址: windows下mongodb增量备份方案

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值