三、MongoDB的组成结构

本文主要讨论这几个问题:

  1. MongoDB的体系结构
  2. MongoDB的数据逻辑结构
  3. MongoDB的数据存储结构

1. MongoDB的体系结构

当我们下载了MongoDB进行解压安装后,会发现MongoDB主要包括这几部分:
这里写图片描述

  • 数据库服务(mongod)
  • 分片集群部署中,数据和查询的路由服务(mongos)
  • shell客户端(mongo)
  • 导入导出工具(mongoimport / mongoexport)
  • 备份恢复工具(mongodump / mongorestore)
  • 拉取并重放oplog的工具(mongooplog)
  • 监控工具(mongostat、mongotop、mongosniff)
  • GridFS的命令行操作工具(mongofiles)
  • 性能测试工具(mongoperf,暂时只能测I/O)
  • 查看bson文件的工具(bsondump)

其中最主要的程序当然是mongod(数据库服务),mongod在不同的部署方案中(单机部署,副本集部署,分片集群部署),通过不同的配置,可以扮演多种不同的角色:

  • 在单机部署中扮演 数据库服务器(提供所有读写功能)
  • 在副本集部署中,通过配置,可以部署为 primary节点(主服务器,负责写数据,也可以提供查询)、secondary节点(从服务器,它从主节点复制数据,也可以提供查询)、以及arbiter节点(仲裁节点,不保存数据,主要用于参与选举投票)
  • 在分片集群中,除了在每个分片中扮演上述角色外,还扮演着配置服务器的角色(存储有分片集群的所有元数据信息,mongos的数据路由分发等都要依赖于它)

在一台服务器上,可以启动多个mongod服务。但在实际生产部署中,通常还是建议一台服务器部署一个mongod实例,这样不仅减少资源竞争,而且服务器故障也不会同时影响到多个服务。

2. MongoDB的数据逻辑结构

当启动mongod服务后(我们也称创建了一个mongod实例),我们就可以通过客户端(比如默认提供的shell客户端mongo)连接mongod服务进行数据操作。
在进行数据操作前,我们有必要先了解一下MongoDB的数据逻辑结构。
在MongoDB中,数据逻辑结构分为数据库(database)、集合(collection)、文档(document)三层,熟悉关系型数据库的同学可以分别把它们对应为关系型数据库中的数据库(database)、表(table)、行(row)。

  • 一个mongod实例中允许创建多个数据库。
  • 一个数据库中允许创建多个集合(集合相当于关系型数据库的表)。
  • 一个集合则是由若干个文档构成(文档相当于关系型数据库的行,是MongoDB中数据的基本单元)。

下面我们详细介绍下MongoDB中的数据库,集合,文档:

  1. 数据库

    • 在一个数据库中可以创建多个集合,原则上我们通常把逻辑相近的集合都放在一个数据库中,当然出于性能或者数据量的关系,也可能进行拆分。
    • 在MongoDB中有几个内建的数据库:
      • admin
        • admin库主要存放有数据库帐号相关信息。
      • local
        • local数据库永远不会被复制到从节点,可以用来存储限于本地单台服务器的任意集合
        • 副本集的配置信息、oplog就存储在local库中。
        • 注意:重要的数据不要存储在local库,因为没有冗余副本,如果这个节点故障,存储在local库的数据就无法正常使用了。
      • config
        • config数据库用于分片集群环境,存放了分片相关的元数据信息。
      • test
        • MongoDB默认创建的一个测试库,连接mongod服务时,如果不指定连接的具体数据库,默认就会连接到test库。
  2. 集合

    • 集合由若干条文档记录构成。
    • 前面介绍MongoDB的时候提到过,集合是schema-less的(无模式或动态模式),这意味着集合不需要在读写数据前创建模式就可以使用,集合中的文档也可以拥有不同的字段,随时可以任意增减某个文档的字段。
    • 在集合上可以对文档进行增删改查以及进行聚合操作。
    • 在集合上还可以对文档中的字段创建索引。
    • 除了一般的集合外,还可以创建一种叫做定容集合(capped collection)类型的集合,这种集合与一般集合主要的区别是,它可以限制集合的容量大小,在数据写满的时候,又可以从头开始覆盖最开始的文档进行循环写入。副本集就是利用这种类型的集合作为oplog,记录primary节点上的写操作,并且同步到从节点重放,以实现主副节点数据复制的功能。
  3. 文档

    • 文档是MongoDB中数据的基本存储单元,它以一种叫做BSON文档的结构表示。
    • BSON,即Binary JSON,多个键及其关联的值有序地存放在其中,类似映射,散列或字典。
    • 需要注意的是,文档中的键/值对是有序的,不同序则是不同文档。并且键是区分大小写的,否则也为不同文档。
    • 文档的键是字符串,而值除了字符串,还可以是int, long, double,boolean,子文档,数组等多种类型。
    • 文档中不能有重复的键。
    • 每个文档都有一个默认的_id键,它相当于关系型数据库中的主键,这个键的值在同一个集合中必须是唯一的,_id键值默认是ObjectId类型,在插入文档的时候,如果用户不设置文档的_id值得花,MongoDB会自动生成生成一个唯一的ObjectId值进行填充。

3. MongoDB的数据存储结构

MongoDB的数据目录下主要存储有 预写日志(journal)、集合的数据(collection)、集合的索引(index)。
预写日志(journal),相当于关系型数据库中redo log的作用,它主要用于减少随机IO,以及可以用来在mongod服务崩溃重启后,恢复崩溃前还没来得及刷写到数据文件的写操作。
集合的数据文件(collection)则存放的是集合的BSON文档。
集合的索引文件(index)则存放的是集合中的索引数据。
当然除了这些数据外,MongoDB还维护有其他数据,另外不同的存储引擎,数据的存储结构也有差异,这个留待后面介绍存储引擎的时候再讨论。
下图是3.2.6版本wiredTiger中集合的数据、索引、journal文件结构(如果配置directoryPerDB=true的话,每个数据库的数据和索引文件会分别存放在以各自db name命名的文件夹中)
这里写图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值