MongoDB的数据库如何备份和恢复?

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

MongoDB数据库如何备份?恢复MongoDB数据库应如何操作?最近数据库多灾多难,这些问题也成为开发者关注的重点。2016年12月爆出MongoDB数据库安全问题(见MongoDB黑客赎金事件解读及防范)。2017年1月又被炉石传说数据库故障给刷屏了。作为一个数据库行业从业人员,看到这个新闻是不是还应该干点什么?恩,很有必要再重新审视一下我们的数据库有没有做好容灾,借此机会给大家普及一下MongoDB数据库的备份和恢复手段。

 

MongoDB备份手段

全量逻辑备份/恢复

Mongodump/Mongorestore

对于数据量比较小的场景,使用官方的mongodump/mongorestore工具进行全量的备份和恢复就足够了。mongodump可以连上一个正在服务的mongod节点进行逻辑热备份。其主要原理是遍历所有集合,然后将文档一条条读出来,支持并发dump多个集合,并且支持归档和压缩,可以输出到一个文件(或标准输出)(对原理感兴趣可以参见两篇文章Mongodumparchive(归档)模式原理解析以及Mongorestorearchive(归档)模式恢复原理解析)。同样,mongorestore则是连上一个正在服务的mongod节点进行逻辑恢复。其主要原理是将备份出来的数据再一条条写回到数据库中。

性能的影响

mongodump执行过程由于会遍历所有数据,因此会对MongoDB性能有影响,最好在备节点执行(最好是hidden,需检查备节点数据同步是否正常)。

取一致的据快照

在mongodump执行过程中由于数据库还有新的修改,直接运行dump出来的结果不是一个一致的快照,需要使用一个『--oplog』的选项来将这个过程中的oplog也一块dump下来(使用mongorestore进行恢复时对应要使用--oplogReplay选项对oplog进行重放)。而由于MongoDB的oplog是一个固定大小的特殊集合,当oplog集合达到配置的大小时旧的oplog会被滚掉以为新的oplog腾出空间。在使用『--oplog』选项进行dump时,mongodump会在dump集合数据前获取当时最新的oplog时间点,并在集合数据dump完毕之后再次检查这个时间点的oplog是否还在,如果dump过程很长,oplog空间又不够,oplog被滚掉就会dump失败。因此在dump前最好检查一下oplog的配置大小以及目前oplog的增长情况(可结合业务写入量及oplog平均大小进行粗略估计),确保dump不会失败。目前我们阿里云MongoDB服务针对oplog做了弹性扩缩容的优化,能够确保在逻辑备份过程中oplog不被滚掉,一定能够备份成功。

索引的备份和恢复

对于集合数据,mongodump出来的结果是一个个bson文件。而对于集合的索引,则是描述在一个metadata的json文件里,里面还包含创建集合时所使用的选项。在使用mongorestore进行恢复时,会在集合数据恢复完毕之后进行对应的索引创建。

全量物理备份/恢复

对于数据量很大的场景,如果使用mongodump/mongorestore进行备份和恢复,需要的时间可能会很长。对于备份来说,最主要的问题就是备份所需时间越长,oplog被滚掉的几率就越大,备份失败的几率也就越大。而对于恢复来说,由于恢复过程还涉及到索引的创建,如果除了数据量大,还有很多索引,所需花费的时间就更长了。遇到像炉石这种数据灾难,恢复时间当然是越短越好,毕竟在游戏行业分分钟的流水都很可观。这时候就需要物理备份出场了,物理备份,顾名思义就是通过物理拷贝数据文件实现备份。在恢复时可以直接使用物理备份拷贝出来的数据文件,直接启动mongod。物理备份最大的好处是速度快,恢复时也不需要再建索引。

实施方法

物理备份通过拷贝数据文件来实现,这要求所有被拷贝的数据文件必须是一个一致的数据快照。因此物理备份的实施方法和MongoDB采用的存储引擎有关,并且,根据是否配置MongoDB打开了Journal,在实施的细节上会有一些不同,具体可参考官方文档。不管使用何种存储引擎,在3.2版本之后,都可以用以下方法实现物理备份:

1.    通过mongoshell执行以下命令以确保所有的写操作都flush到磁盘并禁止新的写入:

db.fsyncLock();

2.    利用底层文件系统层或逻辑卷的快照功能对MongoDB的数据目录做快照,或直接通过cp、scp、tar等命令拷贝数据目录。

3.    还是在刚才的mongoshell上(这里需要保证和刚刚是同一个连接),执行以下命令以重新允许新的写入:

db.fsyncUnLock();

由于执行db.fsyncLock()会加数据库的全局写锁,这时数据库会处于一个不可访问的状态,因此物理备份最好也在备节点上执行(最好是hidden,注意同样需要确保物理备份完成之后节点的oplog能追上主节点)。目前我们阿里云MongoDB团队已经研发出了无需停写服务的物理热备份手段,相信很快就可以让大家用上,尽请期待!

增量备份

MongoDB的增量备份可以通过持续抓取oplog来实现,这个目前没有现成的工具可以利用,需要自己代码实现。抓取oplog主要的难题也和使用mongodump进行全量备份一样,需确保要抓取的oplog不被滚掉。目前我们阿里云MongoDB服务实现了自动增量备份的功能,结合全量备份可以实现任意时间点恢复功能。

Sharding的备份/恢复

炉石是不分服的,因此它后面也有可能是使用分布式数据库。对于分布式数据库来说,备份和恢复比单机数据库更加复杂。分布式数据库包含多个节点,并且通常包含不同角色的节点。以MongoDB的Sharding集群为例,它包含一个保存元数据的config server以及若干个保存数据的shard。其中最主要的元数据就是数据在shard之间的分布情况。对于多个节点的备份,其中一个难题是保证所有节点备份的数据是同一个时间点的,常规采用的手段是停止外部写入后进行备份,这在互联网服务中显然不可接受。退而求其次,可以在停止接受同步的备节点上进行备份,这样可以得到一个时间大致接近的备份。另外一个难题是各数据节点之间通常存在数据迁移,而数据迁移就涉及到起码2个以上数据节点的数据修改以及元数据节点的数据修改,如果在备份过程中发生数据迁移,很难保证备份出来的数据和元数据是一个一致的状态。因此通常在备份过程中需要关闭数据迁移。MongoDB官方的文档指导步骤就是采用这个思路,先关闭负责数据迁移的balancer,然后依次在config server和各个shard的备节点上进行备份。关闭数据迁移最大的问题是关闭期间集群无法实现数据均衡,除了会影响集群的访问性能外,还造成资源的浪费,这在数据量较大,所需备份时间较长时可能造成比较大的影响。

针对这两大难题,阿里云云数据库MongoDB团队研发了不需要停外部写,并且无需关数据迁移的Sharding备份手段,能够实现『任意』时间点恢复。

阿里云云数据库MongoDB备份服务

阿里云云数据库MongoDB服务提供自动备份/恢复功能,默认每天为数据进行全量备份,并且自动抓取oplog进行增量备份。用户可以在控制台自定义备份策略以及进行恢复。


恢复时可以选择某一个备份集或某一个时间点克隆出一个新的实例,可以在新实例上进行数据校验,等校验没问题后切换到新实例。此外,全量备份的数据还提供下载功能,用户也可以选择下载备份集到本地后恢复到一个临时实例进行数据校验。

以上信息可以帮助大家对MongoDB的备份/恢复手段有一个大概的认识。从省心的角度考虑,还是建议直接使用阿里云云数据库MongoDB服务,我们有自动化的备份/恢复服务,灵活的备份策略,只需点点鼠标就能实现任意时间点恢复、物理热备份、Sharding备份/恢复,从此不再为数据库容灾发愁。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
9天前
|
存储 SQL NoSQL
什么是 MongoDB,为什么它是当今最受欢迎的数据库之一?
什么是 MongoDB,为什么它是当今最受欢迎的数据库之一?
|
11天前
|
JSON NoSQL MongoDB
理解Nosql数据库的mongodb
【5月更文挑战第5天】MongoDB是2009年发布的一款通用型NoSQL数据库,结合了关系模型和NoSQL的优点,适用于各种现代应用。其特点包括图形界面、数据服务、云基础设施集成(AWS, Azure, Google Cloud)。它具备全面的查询能力、ACID事务、可调整的一致性保证,并有多语言驱动及工具,可在任何地方运行。
76 4
|
11天前
|
存储 NoSQL MongoDB
MongoDB数据库转换为表格文件的Python实现
MongoDB数据库转换为表格文件的Python实现
48 0
|
7天前
|
存储 NoSQL MongoDB
使用mongodb数据库实例
【5月更文挑战第9天】MongoDB中的集合类似关系数据库的表,但不强制模式,允许嵌入式文档以实现更灵活的数据布局。安装MongoDB在Ubuntu上涉及添加源列表和更新,CentOS则需创建配置文件。MongoDB支持备份和恢复,以及全文搜索。其灵活模式和动态模式减少了开发中的复杂性,但并非无模式,大部分数据仍具结构化特点。
86 2
|
11天前
|
NoSQL atlas MongoDB
Nosql数据库MongoDB的使用场景
【5月更文挑战第5天】 MongoDB是全球性的多云数据库,可在私有、公共和混合云中运行,提供高可用性、扩展性和合规性。 安全特性包括认证、授权、审计、网络隔离和加密。可提供跨云操作、可视化工具、搜索功能和数据湖支持,适用于现代应用开发,包括边缘数据处理。
43 1
|
11天前
|
存储 NoSQL MongoDB
MongoDB如何创建数据库
MongoDB如何创建数据库
|
11天前
|
存储 NoSQL 关系型数据库
Percona XtraBackup是否支持MongoDB数据库备份?
【5月更文挑战第13天】Percona XtraBackup是否支持MongoDB数据库备份?
38 1
|
11天前
|
存储 NoSQL 关系型数据库
【MongoDB 专栏】MongoDB 与传统关系型数据库的比较
【5月更文挑战第10天】本文对比了MongoDB与传统关系型数据库在数据模型、存储结构、扩展性、性能、事务支持、数据一致性和适用场景等方面的差异。MongoDB以其灵活的文档模型、优秀的扩展性和高性能在处理非结构化数据和高并发场景中脱颖而出,而关系型数据库则在事务处理和强一致性上更具优势。两者各有适用场景,选择应根据实际需求来定。随着技术发展,两者正相互融合,共同构建更丰富的数据库生态。
【MongoDB 专栏】MongoDB 与传统关系型数据库的比较
|
11天前
|
存储 NoSQL 关系型数据库
MongoDB非关系型数据库实战
【5月更文挑战第6天】MongoDB,流行的NoSQL数据库,以其灵活的数据模型和高性能备受青睐。本文介绍了MongoDB的基础,包括文档型数据库特性、安装配置、数据操作。通过电商订单管理的实战案例,展示了MongoDB在处理复杂数据结构和大规模数据时的优势,适用于电商、游戏、视频直播等场景。MongoDB的索引、全文搜索和地理空间功能进一步增强了其实用性。注意性能优化和扩展性以确保系统稳定性和可靠性。
|
11天前
|
弹性计算 NoSQL Shell
一键安装 MongoDB 数据库脚本
【4月更文挑战第29天】
21 4