`
welcome66
  • 浏览: 400639 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入剖析 MongoDB 架构

阅读更多

 

近日,软件工程师Ricky Ho的在 他的博客里发表了一篇关于MongoDB架构( MongoDB Architecture)的博文,虽然这是一个听起来感觉很宽泛的话题,但是作者在文章中确实对MongoDB由内至外的架构进行了剖析。本文截取了其文章中的几张重点架构示意图进行简要描述。 

1、MongoDB数据文件内部结构 

 

  • MongoDB在数据存储上按命名空间来划分,一个Collection是一个命名空间,一个索引也是一个命名空间。
  • 同一个命名空间的数据被分成很多个Extent,Extent之间使用双向链表连接。
  • 在每一个Extent中,保存了具体每一行的数据,这些数据也是通过双向链接来连接的。
  • 每一行数据存储空间不仅包括数据占用空间,还可能包含一部分附加空间,这使得在数据Update变大后可以不移动位置。
  • 索引以BTree结构实现。

2、在MongoDB中实现事务 


众所周知, MongoDB只支持对单行记录的原子性修改,并不支持对多行数据的原子操作。但是通过上图中的不可思议的操作步骤,实际上你也可以自己实现该事务。 其步骤如下: 

  • 第1步:先记录一条事务记录,将要修改的多行记录的修改值写到里面,并设置其状态为init(如果这时候操作中断,那么在重新启动时,会判断到它处于init状态,从而将其保存的多行修改操作应用到具体的行上)。
  • 第2步:然后更新具体要修改的行,将刚才写的事务记录的标识写到它的tran字段中。
  • 第3步:将事务记录的状态从init变成pending(如果在这时候操作中断,那么在重新启动时,会判断到它的状态是pending,这时查看其所有对应的多条要修改的记录,如果其tran值不为空,那么就进行第4步;如果值为空,说明第4步已经执行过了,直接将其状态从pending变成 commited就行)。
  • 第4步:将需要修改的多条记录的相应值加以修改,并且unset掉之前的tran字段。
  • 第5步:将事务记录那一条的状态从pending变成commited,事务至此完成。

其实上面的步骤并不罕见,在支持事务的DBMS中,其事务原子性提交的保证大多都与上面类似。而事务记录的tran那条记录,就类似于这些DBMS中的redolog。 

3、MongoDB数据同步 

 
MongoDB采用Replica Sets模式的同步流程


本流程可简要描述如下: 

  • 红色箭头表示写操作可以写到Primary上,然后异步同步到多个Secondary上。
  • 蓝色箭头表示读操作可以从Primary或Secondary任意一个中读取。
  • 各个Primary与Secondary之间一直保持心跳同步检测,用于判断Replica Sets的状态。

4、分片机制 

 

  • MongoDB的分片是指定一个分片key来进行,数据按范围分成不同的chunk,每个chunk的大小有限制。
  • 有多个分片节点保存这些chunk,每个节点保存一部分的chunk。
  • 每一个分片节点都是一个Replica Sets,这样保证数据的安全性。
  • 当一个chunk超过其限制的最大体积时,会分裂成两个小的chunk。
  • 当chunk在分片节点中分布不均衡时,会引发chunk迁移操作。

5、服务器角色 


前面讲了分片的机制,下面是具体在分片时几种节点的角色: 

  • 客户端访问路由节点mongos来进行数据读写。
  • config服务器保存了两个映射关系,一个是key值的区间对应哪一个chunk的映射关系,另一个是chunk存在哪一个分片节点的映射关系。
  • 路由节点通过config服务器获取数据信息,通过这些信息,找到真正存放数据的分片节点进行对应操作。
  • 路由节点还会在写操作时判断当前chunk是否超出限定大小。如果超出,就分列成两个chunk。
  • 对于按分片key进行的查询和update操作来说,路由节点会查到具体的chunk然后再进行相关的工作。
  • 对于不按分片key进行的查询和update操作来说,mongos会对所有下属节点发送请求然后再对返回结果进行合并。
分享到:
评论

相关推荐

    如何安装MongoDB 如何使用MongoDB

    名为《深入浅出MongoDB应用实战开发(基础、开发指南、系统管理、集群及系统架构)》,教程侧重于讲解MongoDB的常用特性及高级特性,从实际开发的角度出发对MongoDB进行全方位深入剖析,学员从中可领会到MongoDB设计...

    玩转电商系统 深入剖析智慧电商平台_完整版 PDF电子书下载 带书签目录

    通过以上分析可以看出,《玩转电商系统深入剖析智慧电商平台》这本书不仅涵盖了电商平台的核心技术要点,还针对实际应用场景提出了具体的实践方案。无论是对于想要深入了解该领域的技术人员还是正在寻求解决方案的...

    mongodb官网文档集合

    总之,MongoDB官网文档是一个包罗万象的知识宝库,不仅包含了产品特性的详细介绍,还有针对开发者和管理员的实际操作指南,以及对技术原理的深度剖析,对于任何希望深入了解和熟练掌握MongoDB的人来说,都是不可或缺...

    Spring技术内幕:深入解析Spring架构与设计原理(完整版)

    《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制与设计理念的专业书籍。在本文中,我们将详细探讨Spring架构的关键组成部分、设计原则以及它们如何协同工作,帮助开发者构建高效...

    mongoDb源码和笔记

    源码是MongoDB的原始代码,通过阅读源码,开发者可以学习到数据库系统的架构设计、数据存储、查询优化、并发控制以及网络通信等方面的知识。笔记可能是作者在研究源码过程中的心得和总结,可能涵盖了关键模块的功能...

    深入剖析Java编程,掌握面试精华!

    在深入剖析Java编程的过程中,掌握面试精华至关重要。Java作为一种广泛使用的编程语言,其深度和广度都相当丰富,尤其在企业级应用开发中占据主导地位。面试时,面试官通常会从基础知识、核心概念、实战经验等多个...

    SPRING技术内幕:深入解析SPRING架构与设计原理第2版

    本书深入剖析了Spring架构的设计原理,对于想要深入了解Spring并提升自己技能的开发者来说,是一份宝贵的资源。通过阅读和实践,读者可以更好地理解和掌握Spring框架,从而在实际开发中游刃有余。

    Spring技术内幕:深入解析Spring架构与设计原理

    《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心技术和设计理念的专业书籍。本书旨在帮助读者理解Spring的内部工作机制,从而更好地利用这个强大的Java平台进行开发。 Spring框架是...

    图灵Java高级互联网架构师第6期分布式框架专题笔记.zip

    07-深入底层C源码讲透Redis核心设计原理 08-Redis 6 新特性以及核心数据结构原理剖析 09-Redis队列Stream、Redis多线程详解-Mark 10-Redis HyperLogLog与事务和Redis 7.0那点事-Mark 11-MongoDB快速实战与基本原理 -...

    最全面的门户网站架构设计方案

    首先,文档深入剖析了网站的性能瓶颈分析。在设计任何架构前,了解性能瓶颈是至关重要的。这通常包括数据库查询效率、服务器处理能力、网络带宽限制以及用户并发访问等问题。通过分析这些瓶颈,可以针对性地提出解决...

    互联网公司技术架构资料.新浪微博.构建高性能的微博系统

    《构建高性能的微博系统》是针对互联网公司技术架构的一份重要参考资料,特别是以新浪微博为案例进行深入剖析。本文将从以下几个方面详细阐述该主题: 1. 微博系统的整体架构设计:高性能的微博系统通常采用分布式...

    李智慧_大型网站技术架构:核心原理与案例分析(全本)

    作者可能深入剖析了这些技术的优缺点以及适用场景。 微服务架构是近年来的热门话题,它提倡将单一应用拆分为一组小型、独立的服务,每个服务都可独立部署和扩展。书中可能会讲述如何设计和实施微服务架构,以及如何...

    TOP100Summit2018-爆款架构

    总的来说,《TOP100Summit2018-爆款架构》深入剖析了构建高可用、高性能互联网架构的关键技术和实践,对于从事IT行业的开发者和架构师来说,这些都是不可或缺的知识点,有助于提升系统设计和运维的能力。

    大型网络技术架构-李智慧

    《大型网络技术架构-李智慧》是一本深入探讨大型网站技术构建的核心原理和实际案例的专著。在当今数字化时代,随着互联网应用的蓬勃发展,大型网络技术架构的重要性日益凸显。李智慧作为业界专家,通过本书为我们...

    大型网站技术架构:核心原理与案例分析

    书中结合实际案例,深入剖析了大型网站在性能、可扩展性、可靠性、安全性等方面的核心原理。 首先,本书重点讨论了Java技术在大型网站架构中的应用。Java作为企业级应用的首选语言,其稳定性和跨平台特性使其在构建...

    系统架构课程,后端通用知识体系,动态算法

    本课程聚焦于系统架构的构建以及后端通用知识体系的建立,同时深入探讨了动态算法这一关键的编程技巧。动态算法是解决复杂计算问题的有效工具,常用于优化和求解最优化问题,在面试中也是考察开发者能力的重要方面。...

    大型网站技术架构

    《大型网站技术架构》这本书深入剖析了诸如淘宝、新浪微博、维基百科等知名大型网站背后的技术架构,旨在帮助读者理解并掌握构建高可用、高性能、高可扩展的互联网系统的关键技术。在这里,我们将探讨其中的一些核心...

Global site tag (gtag.js) - Google Analytics