mongodb几种备份恢复方式比较
总览
MongoDB server 提供了两种备份恢复的方法:一种是通过拷贝底层数据文件进行备份(这种方法又细化为两个不同的操作模式:1.文件快照 2.cp or rsync 等类似的文件传输复制工具)。第二种是通过mongodb 的备份恢复工具mongodump,mongorestore进行对应的备份恢复操作。两种方法有各种的优缺点和适应的应用场景,下面详细进行对比分析。
1.通过文件快照(Filesystem Snapshots)进行备份和恢复
概述
文件快照备份依赖mongodb宿主机器的操作系统(linux 的LVM特性),它使用操作系统级别的工具对mongodb数据文件所在的设备进行拷贝备份,由于这种方法使用的是操作系统级别的工具,因此拷贝备份效率高并且可靠性也高,同时也决定了它的一个缺点:需要宿主环境的支持。
操作步骤(linux LVM)
· 创建快照:lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb
· 归档快照:umount/dev/vg0/mdb-snap01; dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz
· 恢复快照:lvcreate--size 1G --name mdb-new vg0;gzip -d -c mdb-snap01.gz | ddof=/dev/vg0/mdb-new;mount /dev/vg0/mdb-new /srv/mongodb
操作步骤(未开启日志功能或日志文件和数据文件不在同一个卷)
· 刷新写操作到硬盘并锁住数据库:db.fsyncLock()
· 创建快照
· 快照完成后,解锁数据库:db.fsyncUnlock()
优点
· 支持时间点的快照备份(point-in-time snapshots)
· 更高的效率和可靠性
· 在满足一定条件下能够获取分片集群的一致性快照备份
· 提供增量备份
缺点
· 需要文件系统支持时间点快照(linux:the Logical Volume Manager LVM)
· 需要开启日志功能(journalingenabled)并且日志文件和数据文件位于同一个文件卷上(3.2 WiredTiger 数据文件和日志文件可以位于不同的文件卷),否则无法保证快照有效性和一致性
· 为获取分片集群的一致快照,需要关闭集群均衡器并在大致相同的时刻从集群的每个分片和配置服务器上抓取快照
· 没有开启日志功能时,备份前需要将写落地硬盘,备份中停止任何写操作(MMAPv1)
· MMAPv1通过日志功能在快照时无需停止写达到一致状态, WiredTiger通过thelast checkpoint 达到一致状态(Checkpoints 每2G数据或每分钟)
· 快照创建整个磁盘的镜像,因此将数据文件,配置,日志放在一个逻辑磁盘上节约空间
版本特性
· MongoDB 3.2以上的WiredTiger引擎支持卷级备份,也就是说日志文件(journal files)和数据文件位于不同的磁盘卷上,而3.2以前版本的WiredTiger引擎如果要支持卷级备份,日志文件和数据文件必须在同一个卷上(只要开启日志就无需刷新硬盘并停写进行备份)
2.通过cp 或rsync 备份和恢复
概述
利用cp 或者rsync 等类似的文件复制同步工具对mongodb 的数据库文件进行拷贝备份
优点
· 无需文件系统支持快照功能
缺点
· 备份拷贝前必须停止所有的对mongod的写操作,否则将是一个无效的备份
· 不支持副本集时间点级(point in time recovery)恢复,并且很难管理大型分片集群
· 备份文件占有更多的空间(包括索引以及重复的底层文件填充和碎片)
操作步骤
· 执行对应的文件传输工具命令直接拷贝数据文件
3.通过mongodump/mongorestore工具进行备份和恢复
概述
在运行的mongod程序上,mongodump从MongoDB数据库中读取数据生产一个高质量的BSON格式文件,mongorestore则可以将其还原为MongoDB数据库。
优点
· 备份恢复小型mongoDB集群更简单和效率,备份文件占有的空间更少(只备份文档,不备份索引)
· 备份过程中应用可以继续修改数据(记录oplog,通过--oplog选项达到数据状态一致)
缺点
· 备份的数据库中不包含local数据库,只备份数据库的文档不备份数据库索引,因此恢复后必须重建索引
· 备份恢复大型mogoDB集群不理想(效率不高)
· 备份时会影响运行中的mongod的性能(产生网络流量)
· 备份的数据比系统内存大时,查询操作会引起页错误
· 必须拥有对应的访问控制权限(执行find操作的权限,内建的backup角色拥有备份的权限)
· mongodump不同版本的格式不能兼容,不要使用新版本的mongodump备份老版本的数据
操作步骤
· 备份:mongodump--host mongodb.example.net --port 27017 --collection myCollection --db test--out /data/backup/(会覆盖备份目录中的文件)
· 恢复:mongorestore--port --oplogReplay
4.总结
Snapshot备份时由于是对整个磁盘卷进行快照,为了减少不必要的数据的备份,需要预先将mongodb的数据,日志等放在一个单独的磁盘卷上。而mongodump备份时只备份数据文档,不备份索引,恢复后需要重建。但mongodump可以备份指定的数据库和集合,备份数据更灵活些,但备份的时候会对运行的mongodb产生性能影响。两者对分片集群备份,要产生同一时间点的一致备份,都需要在备份期间停止应用程序对mongodb的写操作,否则两者对分片集群的备份只能达到近似的同一时间点备份(approximately the same moment in time)。 两者在做恢复的时候都需要对集群进行一段时间的停机操作维护。
- 点赞
- 收藏
- 关注作者
评论(0)