MongoDump和MongoRestore源码解析
mongodump和mongorestore都是mongodb官方提供的数据备份和恢复的工具,github地址。其本身实现都比较简单,本文会大概介绍一下原理,其实一开始我是想介绍一下细节的,但是看代码都比较简单,还是算了吧。
MongoDump
MongoDump用于把数据备份从MongoDB备份数据。MongoDump做的比较简单,按db.collection为粒度进行dump,dump的时候先dump meta信息,主要是索引、版本、用户等信息,然后是dump的表数据。其中meta信息以json形式进行dump,表的数据以gzip或者bson格式进行dump。另外,全量期间的oplog也会被dump(开始dump的时候记录一下最新的oplog时间戳),如果用户指定了--oplog参数,便于后面按时间点进行恢复。
dump的粒度是按表并发,表内并没有做并发处理。单表只有2个线程,1个线程负责拉取,1个线程负责写入。拉取线程也是直接扫表的操作,没有做snapshot。
本身dump也没有做断点续传机制。抓取侧也没有做按表切分的优化。
mongodump本身可以备份admin库,但是只备份库下面system.roles, system.users, system.version几个表,用户的数据如果写入到admin库下面是不会被备份的。
MongoRestore
MongoRestore实现跟目前MongoShake的做法差不多,有按表并发的粒度,以及表内并发的控制,数据采用golang管道进行流转。如果表内并发度>1,那么回放是多个线程并行的,并且数据写入是有聚合的(采用bulkWriter),所以mongorestore提供了--maintainInsertionOrder参数,多个线程插入是不能保证顺序的。
数据回放完毕写入index。并且用户可以勾选oplog的恢复,参考mongodump的oplog按时间点备份。
每个表有个uuid,用户可以勾选保留源端表的uuid。
恢复前目的库如果存在表,用户可以勾选是否先删除再进行恢复。
说明
转载请注明出处:http://vinllen.com/mongodumphe-mongorestoreyuan-ma-jie-xi-2/