在对MongoDB使用的过程中,总结了几种常用的备份、恢复、同步的方式。
1、冷拷贝
这种方式对数据同步的完整性保持的最好,同时也非常方便,但是会影响服务器的使用。
首先关闭源数据库服务,之后使用远程复制命令将数据文件全量拷贝到目标服务器的数据目录下,再启动目标服务器。
如果不关闭源数据库,将会导致部分数据没有写到数据文件中,有很大概率目标服务器无法启动。
2、使用mongodump
mongodump是mongodb官方提供的导出工具,使用起来非常简单,一个例子如下
mongodump --host example.net --port 37017 -o /opt/backup/mongodump -d dbname -c collectionname
通过host port参数指定主机,通过o参数指定输出目录,通过d参数指定数据库,通过c参数指定集合
mongodump会自动建立备份目录,并按照数据库,集合划分目录与文件。
对应的,官方还提供了mongorestore程序来恢复备份,命令类似于mongodump。使用相同的参数指定主机,数据库,集合等信息,最后一个参数默认为用来恢复的数据文件目录即可。
还有几个需要注意的问题:
mognodb不会导出索引数据,所以在恢复后需要重新建立索引。
备份过程中所做的修改可能无法写入到备份文件中,如果需要同步这一些数据,可以使用--oplog参数记录过程中的修改日志,同时需要服务器为副本集或主从模式,否则数据库不会产生oplog。
3、增量备份
当数据库为副本集的主节点或主从模式的主节点时,将会生成操作日志,mongodb会使用操作日志对各节点中的数据进行增量同步。
利用这一点,我们也可以对集群之外的节点做同样的增量同步。
oplog数据存储在数据库的local数据库下。
主要字段如下
名称 | 说明 |
ts | 操作的时间戳,8字节,mongodb自身的时间戳格式 |
op | 操作类型,包括:i插入,u更新,d删除,c数据库命令,n无操作 |
ns | 数据库与集合名称 |
h |
操作的唯一id |
o |
操作的内容 |
o2 |
更新时的条件 |
有了这些信息,我们就可以用代码模拟mongodb的同步模式,对操作日志实现重播,从而实现数据的增量同步。
基本代码逻辑如下:
ns = oplog['ns']
index = ns.find('.')
dbname = ns[0:index]
collname = ns[index + 1:]
op = oplog['op']
if op == 'i': # insert
dest_mc[dbname][collname].save(oplog['o']) # if exist,recover it
elif op == 'u': # update
dest_mc[dbname][collname].update(oplog['o2'], oplog['o'])
elif op == 'd': # delete
dest_mc[dbname][collname].remove(oplog['o'])
elif op == 'n': # no-op
logging.info('no-op')
else:
logging.error('unknown command: %s' % (oplog))