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

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介:

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
目录
相关文章
|
8天前
|
算法
以太网CSMA/CD协议:通信原理、碰撞检测与退避机制深度解析
以太网CSMA/CD协议:通信原理、碰撞检测与退避机制深度解析
25 1
|
8天前
|
程序员 数据库 微服务
长事务管理不再难:Saga模式全面解析
本文介绍了分布式事务中的Saga模式,它用于解决微服务架构下的事务管理问题。Saga通过一系列本地事务和补偿操作确保最终一致性,分为编排和协同两种模式。文章重点讲解了编排模式,其中 Saga 协调者负责事务的执行和失败后的补偿。Saga 模式适用于业务流程明确且需要严格补偿的场景,能有效管理长事务,但实现上可能增加复杂性,并存在一致性延迟。文章还讨论了其优缺点和适用场景,强调了在面对分布式事务挑战时,Saga 模式的价值和潜力。
36 6
|
9天前
|
Prometheus 监控 关系型数据库
数据库同步革命:MySQL GTID模式下主从配置的全面解析
数据库同步革命:MySQL GTID模式下主从配置的全面解析
23 0
|
1天前
|
安全 Java 数据安全/隐私保护
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
12 0
|
1天前
|
JSON 安全 Java
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
8 0
|
3天前
|
存储 Cloud Native NoSQL
深度解析数据库技术:核心原理、应用实践及未来展望
一、引言 在信息化高速发展的今天,数据库技术作为数据管理的基石,承载着企业运营、决策支持、大数据分析等核心功能
|
8天前
|
物联网 开发者 智能硬件
无线模块透明传输原理及过程解析
透明传输是无线模块中一种保持数据原样的传输技术,它使数据在发送和接收时不经过任何处理,确保内容一致。该过程包括配置模块为透明模式、数据通过串口发送、模块封装帧格式并通过无线信道传输,以及接收端解封装并传递给应用。这种传输方式简化开发、保证数据完整性、提高通信效率且灵活性高,常用于物联网和智能家居等领域的无线通信。
|
9天前
|
存储 安全 测试技术
网络奇谭:虚拟机中的共享、桥接与Host-Only模式解析
网络奇谭:虚拟机中的共享、桥接与Host-Only模式解析
19 0
|
9天前
|
消息中间件 存储 Kafka
深入解析Kafka中的动态更新模式
深入解析Kafka中的动态更新模式
16 0
|
9天前
|
域名解析 网络协议 程序员
网络原理(7)——以太网数据帧和DNS协议(数据链路层和应用层)
网络原理(7)——以太网数据帧和DNS协议(数据链路层和应用层)
14 0

推荐镜像

更多