数据库的自我修炼——阿里云MongoDB备份恢复功能说明和原理介绍

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 2018年1月17-25日,NoSQL数据库直播大讲堂峰会顺利结束,阿里云数据库团队为大家带来了一场别开生面的知识盛会,给大家带来深度的数据库技术及产品分享。本文是《阿里云MongoDB备份恢复功能说明和原理介绍》演讲整理,主要讲解了阿里云在MongoDB备份恢复上采用的技术原理和优势。
本次直播视频精彩回顾,戳这里!

直播涉及到的PPT,戳这里!

演讲嘉宾简介:

郑涔(花名:明俨) 阿里云技术专家,2011年加入阿里,曾参与TFS、Tengine研发,目前主要参与阿里云MongoDB云数据库服务研发,主要关注分布式存储、数据库等领域。

本篇文章来自于阿里云技术专家郑涔(明俨)在2018年《Redis、MongoDB、HBase大咖直播大讲堂》技术直播峰会中的分享,该分享整体由四个部分构成:

1、MongoDB备份恢复

2、阿里云MongoDB备份恢复

3、阿里云MongoDB Sharding备份恢复

4、阿里云MongoDB物理热备份恢复

初来乍到——MongoDB备份恢复

MongoDB备份恢复在备份方法上总体来说分为两部分:逻辑备份和物理备份。

3b025a82d1c6ec9e9c69f48ab03acc5715847ae0

逻辑备份就是通过mongodump和mongorestore这两个工具在数据库层将MongoDB的数据进行导出和导入。物理备份作用于更接近底层一些,例如作用在文件系统上,通过cp和tar等文件系统工具,将MongoDB的物理文件拷贝走进行备份。物理备份还有一种方式是通过逻辑卷这一层或者块设备这一层更为底层的部分进行备份,例如配置一个逻辑卷采用lvm snapshot的方法去做快照,或者利用像阿里云的ECS云服务器上的云盘的快照功能,从而实现物理备份。

cd06f44e8ab928191de8f0004e9fd38da6379855

MongoDB全量逻辑备份恢复是通过mongodump和mongorestore这两个工具来实现的,这两个工具不仅可以作用在正在运行的mongod进程上,也可以作用在Sharding的mongos进程上,把整个数据库的数据进行导入导出。全量逻辑备份恢复可以输出为两种格式:第一种为BSON格式,以这种方式导出之后可以看到本地磁盘上会有很多目录,每一个数据库都会有各自的BSON格式的数据;第二种为归档的格式,即把所有数据库的数据输出成一个文件,可以方便地实现流式备份和恢复。

全量逻辑备份的基本机制是通过数据库层的一些接口来实现的,在dump的过程中通过数据库find的方法,将数据库中的数据全部查询出来,如果是索引,导出的只是一些元数据,例如索引建在哪个字段上、什么类型的索引、索引有哪些选项这些元数据,并没有把索引的数据本身导出来,在恢复时通过insert方法重新将数据插回到数据库当中。在恢复的过程中需要重建索引,如果索引的数据量非常大,重建索引的过程将花费很长的时间,这是全量逻辑备份比较大的问题。

全量逻辑备份恢复的一大优点,即备份和恢复单库单表的能力,方便于某些场景的应用,例如紧急状态下需要恢复某一数据库的某一个表,此时不需要下载整个全量的数据备份,只需单独把想要恢复的表进行恢复即可。

全量逻辑备份通过数据库接口访问数据库,如果数据库配置了认证,需要账号和密码进行访问时会有一些权限的要求,可以通过MongoDB内置的backup和restore两个角色进行备份和恢复。

此外,全量逻辑备份可以指定进行gzip压缩,从而减少数据备份的大小,节省存储成本。

在MongoDB全量逻辑备份过程中数据库可以接受外部正常的读写,使用oplog选项可以抓取备份过程中的修改,从而获取一致的备份,确保数据备份的过程中,对数据的修改也会进行备份。在恢复时需要使用oplogReplay选项,这要求一个anyAction on anyResource的较高的额外权限,这点需要注意。

5a7f11c21c5fd60477b2c993fa49d05473bac630

MongoDB全量物理备份恢复通过某些手段将物理文件拷贝走进行备份,由于MongoDB可以支持多个存储引擎,物理文件与存储引擎的存储布局相关,所以物理备份恢复无法做到跨存储引擎的备份恢复,例如使用WiredTiger的存储引擎备份的数据只能恢复成WiredTiger,不能恢复成其他的存储引擎。另外物理备份有一个很大的好处是,由于备份时将所有的数据进行备份,在恢复的过程中不需要重建索引,只需要将备份数据下载下来,启动进程即可使用,相对全量逻辑备份更为高效。

然而全量物理备份的不足之处在于,它不具备备份和恢复单库单表的能力,文件之间相互关联,无法将某一个数据库的单独文件提取恢复出来。

全量物理备份方法通常可以分为两大类:第一类是通过一些系统组件的snapshot快照功能来实现备份,对系统组件有些依赖,在单盘多租户的情况下,无法做到对单块盘上每一个MongoDB实例单独进行备份,另外获取一致备份则依赖于开启MongoDB的Journal功能,Journal可以实现宕机恢复,从而可以轻松做到一致备份;第二类是使用文件拷贝这种简单的方式通过文件系统进行物理备份,由于可以做到目录级的拷贝,因此支持单盘多租户的数据拷贝,但是有个很大的问题是要获取一致的备份需要在文件拷贝开始之前执行db.fsyncLock()的命令,即对MongoDB加一个全局写锁,在整个备份的过程中数据库无法提供服务,等物理文件拷贝完毕后再执行db.fsynUnclock()解锁。

f33ff267d4e4b2e6e766b276fd5134ec8c6fbfe5

总体上来看,在备份效率上,逻辑备份不如物理备份。逻辑备份通过数据库接口读取数据,当逻辑备份数据量很小、条目很多时,效率会很低,物理备份时物理文件一般会经过文件压缩,拷贝的数据相对来说比较少,同时较充分地使用系统资源,效率会较高。在恢复效率上,逻辑备份也低于物理备份。逻辑备份需要导入数据和重建索引,而物理备份直接启动进程即可。在备份影响上,备份影响主要指在备份的过程中是否对一些正常的业务访问产生影响,由于逻辑备份通过数据库接口读取数据,它将直接与业务争抢数据库资源,而物理备份间接争抢系统的资源,相对来说备份影响比较小。在备份集的大小上,由于逻辑备份没有备份索引数据,一般比原数据库小或相同,而物理备份与原数据库是一模一样的。在兼容性上,逻辑备份优于物理备份,物理备份与存储引擎相关,无法做到跨存储引擎或跨版本的备份恢复,而逻辑备份则支持跨存储引擎以及跨版本。同时,物理备份的成功率比逻辑备份高很多,在某些场景逻辑备份无法进行恢复。

46b19a3d7db0ef968c9e6c1427b973805884dec8

MongoDB增量备份原理比较简单,在MongoDB副本集有oplog进行主备同步,增量备份就是采集oplog并进行存储。全量备份加增量备份就可以实现任意时间点的备份。

厚德载物——阿里云MongoDB备份恢复

阿里云MongoDB备份恢复主要分为四大块:备份、恢复、备份存储和备份有效性验证。

18767e38be654ec785186cfb2671a2b02fafdeec

阿里云MongoDB可以定制备份策略,为用户的MongoDB做自动备份,用户也可以在控制台进行手动备份,同时用户可以指定备份周期和保留时间。恢复策略中用户可以选择恢复时覆盖原来的实例或者克隆一个新的实例,也可以指定恢复的粒度,选择恢复到全量的备份集或者恢复到指定的时间点。备份存储中,阿里云MongoDB将数据存储在阿里云OSS上,具有10个9的可靠性。备份有效性验证则是定期对MongoDB实例的备份做一些有效性的验证,避免恢复备份时发现备份出现问题,确保备份可以进行恢复。

以下为阿里云MongoDB控制台的两个主要界面:

9f8dbd0e6f672fdfc0a5761f1af476b323fbdefb

上图为备份列表界面,可以看到备份的一些情况,包括备份的完成时间、是否为自动备份、手动备份等。用户可以点击右上角的备份实例进行手动备份,可以下载备份、根据备份创建实例或者指定一个时间点新建实例、克隆实例。

374a20b55d0efe7b666ada5d7d8d05b8a8512bad

上图为备份设置界面,用户可以制定一些备份策略,包括备份的保留天数、备份的周期等。

精益求精——阿里云MongoDB Sharding备份恢复

5b08c323cb9a277e99213e2f8cfbe2fe3eb99474

先来回顾一下MongoDB Sharding的架构,MongoDB Sharding架构主要由三大组件构成:蓝色部分为路由节点mongos,它是无状态的、没有存储数据的,不需要进行备份;绿色部分为Shard集群,用于存储用户分片的数据,通过副本集的方式实现高可用,需要进行数据备份;黄色部分为Config Servers,主要存放集群当中的元数据,同样需要进行备份。

MongoDB Sharding备份到底有哪些问题,面对这些问题,阿里云是如何进行有效解决的呢?

824f1785d4c740f078df91d150fdad263e6e6edc

第一个问题是关于集群多个节点在有外部修改情况下如何取得一致备份。在一个集群当中有多个节点,由于每一个节点的容量是不同的,导致节点备份的耗时不同,假设每个节点同时启动备份,由于每个节点备份结束的时间不同,当备份过程中仍然有应用写入时,有些节点的备份会多包含一些新写入的数据,因此整个Sharding备份结束的时间点很难进行确定。

aec413481fc844936e9c53a17490e08bd2c11494

针对这个问题,阿里云采用全量备份加增量备份的方式来做到将各节点的备份对齐至同一时间点。整个Sharding的备份时间点取决于备份结束最晚的节点,对备份结束比较早的节点,多抓取一些oplog,备份结束比较晚的节点则少抓取一些oplog,从而保证各节点的备份加oplog能够对应到同一个时间点。

3ca865a451ef587bd73dbaa0b6e678c9ad9547b2

第二个备份问题是关于内部数据的修改,在集群内部通常会有数据的迁移,上图展示了MongoDB Sharding内部数据的一些表示,在做Sharding时通常需要指定一个Shard Key,即分片的片键,如果选择使用Range分片,那么接下来的数据将会按照Shard Key的大小范围进行分布,如果选择使用哈希分片,则会按照Shard Key哈希之后的结果进行分布。Chunk是按照Shard Key进行分布后一部分值的范围所对应的集合,例如上图左侧分为4个chunk,分别对应Shard Key的不同取值范围。Chunk作为一个基础的单元在不同的Shard之间进行分布,config server中存放的一个最重要的元数据之一就是Chunk在Shard之间的分布。

172b0acacc6d864b1a4ab3b3417c105eea3e7ed5

由于对集群进行扩容等需要,增加或删除Shard都需要MongoDB Sharding对数据进行迁移,另外当集群内数据分布不均时,MongoDB也会自发地进行数据迁移,数据迁移的基本单元也是chunk。上图右侧即为一个chunk迁移的基本过程。

df3d7f161530a668404149d9dd544a4fabe2999a

我们看下MongoDB Sharding备份存在的第二个问题。如上图所示,两个Shard上的chunk不均衡,假设chunk1需要从Shard1迁移到Shard2上,迁移过程中我们进行了Sharding备份。如果当所有的节点备份结束时,chunk1的迁移可能还没有结束,这时config server上还是原来的数据分布,此时Shard1仍存在三个chunk,而Shard2存储了部分chunk1,由于数据恢复后chunk的路由是以config server为基准的,所以会认为chunk1存在于Shard1上,因此此时Shard2由于恢复出了多余的chunk1的数据产生数据重复。另外一种情况,所有节点备份结束时config server已经更新了路由信息,确认chunk1已经在Shard2上,但是由于各个节点上的时间并不严格一致,这时候有可能在Shard2中的chunk1数据还没有完全拷贝完毕,这时数据恢复时会发现有一部分的chunk1的数据丢失。综上所述,Sharding备份时遇上chunk迁移有可能导致数据的重复或丢失的问题。

f07efdeb954ae477a563312df457ebf672569cf2

针对问题二,阿里云会对Sharding内部的chunk迁移进行分析,然后对恢复的时间点进行限制,避开有数据迁移的时间段,只有当这个时间点没有数据迁移时才允许恢复至这个时间点。

97e9f40f57d6d22b3b0818d99b8dfb76d01b2615

因此,为了更好的配合这个方案,用户在使用MongDB Sharding时最好配置一个迁移的时间段,即用户可以根据业务访问行为指定迁移在哪段时间进行,从而保证其它时间段都可以进行备份恢复。可以通过上图中的三段代码配置迁移的时间点。

91b431f1c60d9bb67b165210d9b23d0a21438cc4

上图为阿里云MongoDB Sharding备份恢复的控制台,与副本集的备份列表界面相比多了选择Shard的功能,可以选择某一个Shard查看备份情况。

虚怀若谷——阿里云MongoDB物理热备份恢复

0036914bdcf3e1840d407b98befc5eba52f21ae4

上文提到,通过文件拷贝做物理备份时,备份过程全程加全局写锁,不是热备份,在这段期间MongoDB是无法正常访问的。事实上WiredTiger存储引擎支持热备份,支持在备份过程中不停服务,为什么还要在MongoDB上加全局写锁呢?其一MongoDB会在内存当中维护一些数据,需要通过fsyncLock把一些元数据刷到磁盘当中;其二WiredTiger的热备份有个问题,如果在备份的过程当中有写入,磁盘的空间增长得比较快。

be0d2b7f7177bf7816971fd5661e0a1653e2b84a

阿里云针对以上问题对MongoDB和WiredTiger进行了改造,抽象出了三个阶段的备份过程,在备份之前加入了预备份(pre-backup)步骤,在备份之后加入了后备份(post-backup)步骤,只需要在预备份阶段加全局写锁即可。同时阿里云改进了WiredTiger的热备份机制,解决了热备份过程中磁盘增长太快的问题。阿里云MongoDB物理热备份的方法在去年6月份就已经上线,目前的新实例也默认使用物理热备份方式。
相关实践学习
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
目录
相关文章
|
22天前
|
关系型数据库 分布式数据库 数据库
成都晨云信息技术完成阿里云PolarDB数据库产品生态集成认证
近日,成都晨云信息技术有限责任公司(以下简称晨云信息)与阿里云PolarDB PostgreSQL版数据库产品展开产品集成认证。测试结果表明,晨云信息旗下晨云-站群管理系统(V1.0)与阿里云以下产品:开源云原生数据库PolarDB PostgreSQL版(V11),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
28天前
|
缓存 安全 Java
阿里云数据库 SelectDB 内核 Apache Doris 2.0.6 版本正式发布
阿里云数据库 SelectDB 内核 Apache Doris 2.0.6 版本正式发布
|
26天前
|
SQL 安全 数据管理
在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
【2月更文挑战第33天】在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
28 7
|
27天前
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
367 3
|
25天前
|
存储 安全 算法
【软件设计师备考 专题 】数据库的控制功能(并发控制、恢复、安全性、完整性)
【软件设计师备考 专题 】数据库的控制功能(并发控制、恢复、安全性、完整性)
56 0
|
17天前
|
弹性计算 关系型数据库 MySQL
阿里云数据库服务器价格表,数据库创建、连接和使用教程
阿里云数据库使用流程包括购买和管理。选择所需数据库类型如MySQL,完成实名认证后购买,配置CPU、内存和存储。确保数据库地域与ECS相同以允许内网连接。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码连接。同一VPC内的ECS需添加至白名单以进行内网通信。参考官方文档进行详细操作。
76 3
|
25天前
|
SQL 存储 安全
【软件设计师备考 专题 】数据库管理系统的功能和特征
【软件设计师备考 专题 】数据库管理系统的功能和特征
72 0
|
27天前
|
弹性计算 关系型数据库 MySQL
阿里云MySQL云数据库优惠价格、购买和使用教程分享!
阿里云数据库使用流程包括购买和管理。首先,选购支持MySQL、SQL Server、PostgreSQL等的RDS实例,如选择2核2GB的MySQL,设定地域和可用区。购买后,等待实例创建。接着,创建数据库和账号,设置DB名称、字符集及账号权限。最后,通过DMS登录数据库,填写账号和密码。若ECS在同一地域和VPC内,可内网连接,记得将ECS IP加入白名单。
429 2
|
28天前
|
存储 SQL 数据挖掘
视图、触发器和存储过程:提升数据库功能
视图、触发器和存储过程:提升数据库功能
19 1
|
28天前
|
存储 SQL 数据管理
阿里云数据库 SelectDB 内核 Apache Doris 如何基于自增列满足高效字典编码等典型场景需求|Deep Dive 系列
自增列的实现,使得 Apache Doris 可以在处理大规模时展示出更高的稳定性和可靠性。通过自增列,用户能够高效进行字典编码,显著提升了字符串精确去重以及查询的性能。使用自增列作为主键来存储明细数据,可以完美的解决明细数据更新的问题。同时,基于自增列,用户可以实现高效的分页机制,轻松应对深分页场景,有效过滤掉大量非必需数据,从而减轻数据库的负载压力,为用户带来了更加流畅和高效的数据处理体验。