开发者社区> 明俨> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Mongodump的archive(归档)模式原理解析

简介:
+关注继续查看

Mongodump是MongoDB官方的逻辑备份工具,本文将介绍其archive(归档)模式的相关原理。

archive模式

使用archive输出的话,mongodump会将各个集合的数据进行一个混合,最后输出到一个文件里。这样有两个好处:

  1. 方便进行网络传输。
  2. 方便和其他工具配合使用如直接作为mongorestore的输入。

Mongodump的archive模式的实现支持多个集合并发进行dump,通常来说要实现并发就很难做到输出到一个文件中,我们来看下它是怎么做的。

流程

Mongodump使用go写的,因此大量使用了goroutine。主要需要关注两类goroutine,一类是dump数据的(可指定并行度即goroutine个数)Backup goroutine,还有一个则是混合各集合数据并真正输出到归档文件的Multiplexer goroutine。如下图所示:
mongodump_golang_channel_diagram

初始

这个Multiplexer goroutine主要通过一个select调用来通过channel接收backup goroutine过来的数据。它被设计成可以动态添加和删除select的channel,初始化时会有一个control channel用于接收需要监听哪些channel。当一个backup goroutine开始准备对某个集合进行备份时,它会创建3个channel:一个用于发送集合数据给Multiplexer goroutine的writeChan、一个用于从Multiplexer goroutine接收写成功数据长度的writeLenChan,还有一个用于从Multiplexer goroutine接收集合dump完毕信号的writeCloseFinishedChan。除了这3个channel之外,它还会创建一个16MB大小的buf。它把这些数据封装在一个MuxIn数据结构里,通过control channel发送给Multiplexer goroutine。
Backup_goroutins
当Multiplexer goroutine启动后就不停的执行select(),当它从control channel收到MuxIn数据结构时,就会将其中的writeChan添加到select的channel中,并将这个MuxIn保存在自己的数组中。然后下一轮循环就会开始监听control channel和这个writeChan。

dump过程

每个Backup goroutine开始干活时,它一边从mongodb dump数据,一边将数据通过writeChan发送给Multiplexer goroutine。这是一个典型的生产者消费者模型,为了不让消费者的磁盘I/O影响到生产者(从mongodb读数据),它又起了一个Dump goroutine,通过一个buffChan来传输数据,顺便在这个goroutine中处理退出信号(主goroutine起了一个信号处理goroutine用于捕获SIGTERM、SIGINT和SIGHUP,再通过一个termChan和其他goroutine通信),当接收到退出信号时,关闭buffChan并退出。
Dump_goroutine

Backup goroutine的buf收满之后,就将数据通过writeChan发送给Multiplexer goroutine,并等待从writeLenChan接收数据,如果返回的写成功的数据长度和buf的数据长度不一致 ,则返回失败。

Multiplexer goroutine从writeChan收到数据,将数据写入归档文件。由于同时可能有多个Backup goroutine在工作,因此需要对数据进行混合。这里主要是按集合进行分条(slice)处理,每个条有一个header、body和一个terminator。Header就是集合的Namespace(db和集合名),body是集合的数据,terminator是一个4字节的结束标记。另外每个集合的最后一条之后还有一个标明集合结束的EOF条。Multiplexer goroutine会维护一个当前正在处理的集合名,如果发生集合数据交叉,会结束当前条(写入一个terminator),然后另起一个新的条(写入一个新的header)。写完数据后,会将这次写成功的数据通过writeLenChan发送给Backup goroutine。归档文件的物理格式如下图所示:
mongodump_archive_file_format

结束

Backup goroutine针对某个集合dump结束时,会依次关闭writeChan、writeLenChan,然后等待从writeCloseFinishedChan接收数据。Multiplexer goroutine感知到writeChan关闭时,发送数据给writeCloseFinishedChan,然后往当前条写入条结束标记以及EOF条。这里之所以要有一个writeCloseFinishedChan是为了避免Multiplexer goroutine的control channel比writeChan先关闭。如果control channel关闭了,那就会结束整个dump过程。Backup goroutine从writeCloseFinishedChan接收到数据返回后又可以处理下一个集合,直到所有集合处理完毕。

Goroutine们何时退出

主goroutine在创建Backup goroutine时会创建一个resultChan。当Backup goroutine发现所有集合都dump完毕时,或者在dump过程中遇到错误时,都会往resultChan发送数据并退出。当主goroutine从resultChan接收到每个Backup goroutine发送的数据时,或者收到某个Backup goroutine发送的错误,就会返回。当主goroutine干完所有事情返回时,它会关闭Multiplexer goroutine的control channel,这样Multiplexer goroutine就可以退出了。

结语

Mongodump通过这种架构实现了输出到一个归档文件兼顾支持并发的需求,可以作为一个参考。

参考文献

  1. Multiplexing Golang Channels to Maximize Throughput

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
apollo系列之apollo2 mcu开发(基础篇)之1.3-解析编译生成的IAR中的map文件
apollo系列之apollo2 mcu开发(基础篇)之1.3-解析编译生成的IAR中的map文件
144 0
第28节 从库Seconds_Behind_Master延迟总结
从库Seconds_Behind_Master延迟总结 到这里本系列已经接近尾声了,是时候对常见引起主从延迟的情形进行一个总结了。我想如果我一开始就把这些情形拿出来也许大家对具体的原因不是那么清楚,但是经过本系列的学习,我相信当我说起这些情形的时候大家都很清楚它的原因了。
853 0
高性能以太坊节点服务QuikNode详细介绍
随着Web3的演化,开发者已经开始在以太坊区块链上快速开发去中心化应用。虽然在以太坊上开发dApp很酷,但是要搭建自己的以太坊节点还是挺令人头疼的一件事,这需要不短的时间,而且还需要一些技巧。QuikNode通过提供高性能的以太坊节点服务解决了这一问题,正如其官网所说,这是*运行专用以太坊节点的最快、最简单的方法*。
1985 0
[转载]AOP 的利器:ASM 3.0 介绍
引言 什么是 ASM ? ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。
984 0
Autofac3 在MVC4中的运用原理
这是一种新的开发模式,注入开发模式,或者叫它IOC模式,说起IOC你可以这样去理解它,它为你的某个实现流出一个注入点,你生产的对象,可以根据你之前的配置进行组合。  IOC全称是Inversion of Control,即反转控制,或者说是依赖注入更为合适。
572 0
Spring Security 3.2.x与Spring 4.0.x的Maven依赖管理
原文链接: Spring Security with Maven原文日期: 2013年04月24日翻译日期: 2014年06月29日翻译人员: 铁锚1. 概述本文通过实例为您介绍如何使用 Maven 管理 Spring Security 和 Spring 的依赖关系.最新的Spring Security发布版本可以在 Maven Central仓库 中找到. 译者建议访问MVNRespotory中org.springframework.security链接。
842 0
ORA-00254/ORA-15173 Archive_log Directory On Asm Being Deleted
    最近的RAC环境中遭遇ORA-00254,ORA-15173,即无法进行归档。通常情况下归档失败我们考虑更多的是归档路径的不可达,或归档所在的磁盘空间不足造成的。
1147 0
Adhesive框架系列文章--Mongodb数据服务模块使用(下)
在前一篇中,我们介绍的主要是站在开发人员的角度如何使用Mongodb数据服务来保存数据,这一篇会介绍在保存数据之后,如何去查看数据,也就是怎么样去使用Mongodb数据服务的通用后台。 Mongodb数据服务的后台是采用Silverlight4制作的。
1086 0
+关注
明俨
郑涔,花名明俨,阿里云数据库组高级技术专家,主要关注分布式存储、Nosql数据库等技术领域,目前主要参与MongoDB云数据库的研发,致力于让开发者用上最好的MongoDB云服务
12
文章
10
问答
来源圈子
更多
让用户数据永远在线,让数据无缝的自由流动
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载