热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解剖MongoDB【1】系统概览

By盛楠、邓侃关于MongoDB,我们能看到的资料,基本都是在指导大家如何使用MongoDB,但是,MongoDB内部是如

By 盛楠、邓侃

关于MongoDB,我们能看到的资料,基本都是在指导大家如何使用MongoDB,但是,MongoDB内部是如何运作的,资料不是很多。

阅读使用手册,会有很多疑惑之处。例如,有人说,MongoDB 等同于分布式的 MySQL。它把一个Table ,按 row,分割成多个Shards,分别存放在不同的 Servers 上。这种说法是否正确?

不深入了解 MongoDB 的内部结构,就无法透彻地回答类似问题。这个系列文章,就来和大家探讨MongoDB的内部的工作方式。

MongoDB架构概览

图1-1 MongoDB架构图

MongoDB 通常运行在一个服务器集群上,而不是一个单机。图1-1,描述了一个MongoDB集群的基本组成部分,包括若干shards,至少一个config server,至少一个routing servers(又称 mongos)。


Shards

MongoDB的最基本的数据单元,叫document,类似于关系式数据库中的行 row。一系列documents,组成了一个collection,相当于关系式数据库中的table。当一个 collection 数据量太大时,可以把该collection按documents切分,分成多个数据块,每个数据块叫做一个chunk,多个chunks聚集在一起,组成了一个shard。

Sharding 的意义,不仅保障了数据库的扩容(scalability),同时也保障了系统的负载均衡(load balance)。


Shard keys

为了把collection切分成不同的chunks,从而存放到不同的shards中,我们需要制定一个切分的方式。

如前所述,在 MongoDB 数据库中,一个表collection由多个行 documents 组成,而每个 document,有多个属性 fields。同一个 collection 中的不同的 documents,可能会有不同的 fields。例如,有个 collection 叫 Media,包含两条 documents,

  {
     "ISBN": "987-30-3652-5130-82",
     "Type": "CD",
     "Author": "Nirvana",
     "Title": "Nevermind",
     "Genre": "Grunge",
     "Releasedate": "1991.09.24",
     "Tracklist": [
        {
          "Track" : "1",
          "Title" : "Smells like teen spirit",
          "Length" : "5:02"
        },
        {
          "Track" : "2",
          "Title" : "In Bloom",
          "Length" : "4:15"
        }
      ]
   }
  
  {
      "ISBN": "987-1-4302-3051-9",
      "Type": "Book",
      "Title": "Definite Guide to MongoDB: The NoSQL Database",
      "Publisher": "Apress",
      "Author": " Eelco Plugge",
      "Releasedate": "2011.06.09"
  }

假如,在同一个 collection 中的所有 document,都包含某个共同的 field,例如前例中的“ISBN”,那么我们就可以按照这个 field 的值,来分割 collection。这个 field 的值,又称为 shard key。

在选择 shard key 的时候,一定要确保这个 key 能够把 collection 均匀地切分成很多 chunks。

例如,如果我们选择“author”作为 shard key,如果有大量的作者是重名的,那么就会有大量的数据聚集在同一个 chunk 中。当然,假设很少有作者同名同姓,那么“author”也可以作为一个shard key。换句话说,shard key 的选择,与使用场景密切相关。

很多情况下,无论选择哪一个单一的 field 作为 shard key,都无法均匀分割 collection。在这种情况下,我们可以考虑,用多个 fields,构成一个复合的 shard key

延续前例,假如有很多作者同名同姓,他们都叫“王二”。用 author 作为 shard key,显然无法均匀切割 collection。这时我们可以加上 release-date,组成 name-date 的复合的 shard key,例如“王二 2011”。


Chunks

    MongoDB 按 shard key,把 collection切割成若干chunks。每个 chunk 的数据结构,是一个三元组,{collection,minKey,maxKey},如图1-2 所示。

MongoDB架构概览
图1-2 chunk的三元组

其中,collection 是数据库中某一个表的名称,而 minKey 和 maxKey 是 shard key的范围。每一个 document 的shard key 的值,决定了这条document应该存放在哪个chunk中。

如果两条 documents 的 shard keys 的值很接近,这两条 documents 很可能被存放在同一个 chunk 中。

Shard key 的值的顺序,决定了 document 存放的 chunk。在 MongoDB 的文献中,这种切割 collection 的方式,称为 order-preserving。

一个 chunk 最多能够存储64MB的数据。 当某个 chunk 存储的 documents 包含的数据量,接近这个阈值时,一个 chunk 会被切分成两个新的 chunks。

当一个 shard 存储了过多的 chunks,这个shard中的某些 chunks 会被迁移到其它 shard 中。

这里有个问题,假如某一条 document 包含的数据量很大,超过 64MB,一个 chunk 存放不下,怎么办?在后续章节介绍 GridFS 时,我们会详细讨论。


Replica set

在生产环境中,为了保证数据不丢失,为了提高系统的可用性(availability),每一个shard被存储多份,每个备份所在的 servers,组成了一个 replica set。

这个 replica set 包括一个 primary DB 和多个secondary DBs。为了数据的一致性,所有的修改 (insert / update / deletes) 请求都交给 primary 处理。处理结束之后,再异步地备份到其他 secondary 中。

Primary DB 由 replica set中的所有 servers,共同选举产生。当这个 primaryDB server 出错的时候,可以从 replica set 中重新选举一个新的 primaryDB,从而避免了单点故障。

Replica set 的选举策略和数据同步机制,确保了系统的数据的一致性。后文详述。


Config Server

Config servers 用于存储 MongoDB 集群的元数据 metadata,这些元数据包括如下两个部分,每一个 shard server 包括哪些 chunks,每个 chunk 存储了哪些 collections 的哪些 documents。

    每一个 config server 都包括了 MongoDB 中所有 chunk 的信息。

Config server 也需要 replication。但是有趣的是,config server 采用了自己独特的 replication 模式,而没有沿用 replica set。

如果任何一台 config server 挂了,整个 config server 集群中,其它 config server 变成只读状态。这样做的原因,是避免在系统不稳定的情况下,冒然对元数据做任何改动,导致在不同的 config servers 中,出现元数据不一致的情况。

MongoDB 的官方文档建议,配置 3 个 config servers 比较合适,既提供了足够的安全性,又避免了更多的 config servers 实例之间的数据同步,引起的元数据不一致的麻烦。


Mongos

    用户使用MongoDB 时,用户的操作请求,全部由 mongos 来转发。

当 mongos 接收到用户请求时,它先查询 config server,找到存放相应数据的 shard servers。然后把用户请求,转发到这些 shard servers。当这些 shard servers完成操作后,它们把结果分别返回给 mongos。而当 mongos 汇总了所有的结果后,它把结果返回给用户。

Mongos 每次启动的时候,都要到 config servers 中读取元数据,并缓存在本地。每当 config server中的元数据有改动,它都会通知所有的 mongos。

Mongos 之间,不存在彼此协同工作的问题。因此,MongoDB 所需要配置的 mongos server的数量,没有限制。


通过以上的介绍,我们对每个组成部分都有了基本的了解,但是涉及到工作的细节,我们尚有诸多疑问,例如,一个chunk的数据太大,如何切分?一个shard数据太多,如何迁移?在 replica set 中,如何选择primary?server挂了,怎么进行故障恢复?接下来的章节,我们逐个回答这些问题。


,出现元数据不一致的情况。

MongoDB 的官方文档建议,配置 3 个 config servers 比较合适,既提供了足够的安全性,又避免了更多的 config servers 实例之间的数据同步,引起的元数据不一致的麻烦。


Mongos

    用户使用MongoDB 时,用户的操作请求,全部由 mongos 来转发。

当 mongos 接收到用户请求时,它先查询 config server,找到存放相应数据的 shard servers。然后把用户请求,转发到这些 shard servers。当这些 shard servers完成操作后,它们把结果分别返回给 mongos。而当 mongos 汇总了所有的结果后,它把结果返回给用户。

Mongos 每次启动的时候,都要到 config servers 中读取元数据,并缓存在本地。每当 config server中的元数据有改动,它都会通知所有的 mongos。

Mongos 之间,不存在彼此协同工作的问题。因此,MongoDB 所需要配置的 mongos server的数量,没有限制。


通过以上的介绍,我们对每个组成部分都有了基本的了解,但是涉及到工作的细节,我们尚有诸多疑问,例如,一个chunk的数据太大,如何切分?一个shard数据太多,如何迁移?在 replica set 中,如何选择primary?server挂了,怎么进行故障恢复?接下来的章节,我们逐个回答这些问题。



推荐阅读
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 【漫画解析】数据已删,存储空间为何未减?揭秘背后真相
    在数据迁移过程中,即使删除了原有数据,存储空间却未必会相应减少。本文通过漫画形式解析了这一现象背后的真相。具体来说,使用 `mysqldump` 命令进行数据导出时,该工具作为 MySQL 的逻辑备份工具,通过连接数据库并查询所需数据,将其转换为 SQL 语句。然而,这种操作并不会立即释放存储空间,因为数据库系统可能保留了已删除数据的碎片信息。文章进一步探讨了如何优化存储管理,以确保数据删除后能够有效回收存储空间。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 解读中台架构:微服务与分布式技术的区别及应用
    中心化与去中心化是长期讨论的话题。中心化架构的优势在于部署和维护相对简单,尤其在服务负载较为稳定的情况下,能够提供高效稳定的性能。然而,随着业务规模的扩大和技术需求的多样化,中心化架构的局限性逐渐显现,如扩展性和故障恢复能力较差。相比之下,微服务和分布式技术通过解耦系统组件,提高了系统的灵活性和可扩展性,更适合处理复杂多变的业务场景。本文将深入探讨中台架构中微服务与分布式技术的区别及其应用场景,帮助读者更好地理解和选择适合自身业务的技术方案。 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
  • 尽管存在唯一列,仍显示“当前选择不包含唯一列。网格编辑、复选框、编辑、复制和删除功能不可用”的消息。 ... [详细]
author-avatar
北京雅舍
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有