MongoDB介绍-关键概念、架构、扩展能力

关于成功没有一个确切的公式,但关于失败我可以找到一个:总是尽力取悦所有人。

Herbert Bayard Swope

MongoDB是一款流行的基于文档的开源NoSQL数据库,跨平台、高性能、灵活水平扩展、支持企业级应用。存储格式为JSON格式[1]。MongoDB可以通过云平台MongoDB Atlas使用,也可以通过MongoDB Server使用。同时,MongoDB也提供基于云服务的数据分析平台。本文我们将重点介绍一些关键的概念,帮助理解MongoDB可以做什么,可以解决哪些问题。

为什么要使用MongoDB

MongoDB可以处理海量数据,比较容易上手,也适用于很多的应用场景,比如物联网(IoT)、银行、金融、游戏、电子商务、物流和内容管理。

  • 高性能 、并且易于数据迁移
  • 轻松的水平扩展能力,可以支持海量数据
  • 对开发者友好
  • 可以轻松获取 、通过云服务Atlas或者社区版的MongoDB服务器
  • 支持快速迭代
  • 有活跃的社区 支持

MongoDB要解决的问题

本质上,MongoDB是一个数据库,要解决的问题也是数据管理的问题,以及软件系统开发过程的问题。但是 演进到现在,MongoDB已经不仅仅是一个单一的数据库,而是一个数据湖、云服务部署的一个整套的 数据分析生态系统 。

  • 将大量不同来源的数据集成到一个统一的视图中
  • 可以描述并支持复杂的数据格式,即便这些格式在不停的演进和变化中。
  • 支持地理数据和 空间查询
  • 天生支持高扩展性,提供高效的查询性能。
  • 灵活部署,支持混合、公有或者私有云部署
  • 基于文档的数据库,容易理解和使用,支持敏捷的开发和项目协作。

额外的特性:

  • 高性能。支持嵌套文档模型。
  • 支持所有的CRUD操作。
  • 丰富的查询语言和算子。
  • 支持数据集的自动复制。
  • 支持分片,以达到水平扩展。
  • 支持多种存储引擎。

一些缺点:

这些缺点MongoDB社区也在尝试解决。比如:

  • 不支持ACID。不过在MongoDB 4.0之后,引入了在复制集多文档事务这一特性。
  • 不支持存储过程。

和SQL对比

和关系数据库的对比

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

MongoDB的一些基本概念

基本概念

  • 数据库-Database
  • 集合-Collection
  • 文档-Document

数据库

数据库 是物理上数据集合的容器。一个单一MongoDB数据库实例可以有多个数据库。每一个数据库都有一个独立的文件系统和一堆的文件。

文档

文档 是一组键值(key-value)对(也就是 BSON格式 ,Binary JSON,见参考[1])。MongoDB 的文档具有 动态的Schema ,也就是说,每一份文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的文档例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

{
"_id": ObjectId("5f2133a613e1be0e41851fe0"),
"title": "MongoDB简介",
"description": "公众号推文介绍MongoDB",
"author": "山野",
"url": "",
"tags": ["mongodb", "nosql", "bigdata"],
"cover": "",
"abstract": "",
"createDate": ISODate("2021-08-12T02:45:12.248Z"),
"lastModifiedDate": ISODate("2021-08-12T02:45:12.248Z"),
"remarks": [{
"date": ISODate("2021-08-12T02:45:12.248Z"),
"remark": "一些留言",
"by": "",
"by_id": ""
},
{
"date": ISODate("2021-08-12T02:45:12.248Z"),
"remark": "对我帮助很大",
"by": "",
"by_id": ""
},
{
"date": ISODate("2021-08-12T02:45:12.248Z"),
"remark": "博主很用心",
"by": "",
"by_id": ""
}
]
}

需要注意的是:

  • 文档中的键/值对是有序的。
  • 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  • MongoDB区分类型和大小写。
  • MongoDB的文档不能有重复的键。
  • 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  • 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
  • .和$有特别的意义,只有在特定环境下才能使用。
  • 以下划线”_”开头的键是保留的(不是严格要求的)。

集合

MongoDB中的 集合 就是一堆文档的组(group of Documents),相当于关系数据库中的表。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

比如,我们可以将以下不同数据结构的文档插入到集合中:

1
2
3
4
5
6
7
8
9
10
11
12
13

{
"site": "www.baidu.com"
},
{
"site": "www.google.com",
"name": "Google"
},
{
"site": "https://mp.weixin.qq.com/",
"name": "微信公众号平台",
"id": "gh_13fdasfda12"
}

合法的集合名需要满足如下规则:

  • 集合名不能是空字符串””。
  • 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
  • 集合名不能以”system.”开头,这是为系统集合保留的前缀。
  • 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

MongoDB分片

分片

在MongoDB中分片的部署架构看起来比较复杂。不过好在我们现在不需要直接进入实操的环节中。
我们只需要理解分片的各个部分即可。

Mongos

集群的入口,连接配置服务器和分片集群。因此由Mongos确定应该由哪一个分片集群来响应查询。

配置服务器

配置服务器保存所有分片的元数据。通过保持和集群所有其他部分的连接,来帮助mongos确保任何时候都可以响应查询。

分片

分片是将数据均匀地分布在不同的机器上达到扩展的目的。一般来说有2种扩展方式:
垂直扩展,增加单一机器的CPU处理能力,更多的内存和磁盘容量。
水平扩展,分割数据集,将数据分布在多个机器上。通过增加机器的数量达到扩容的目的。

复制集

每一个分片都是一个 复制集 。复制集一个服务集群,通过自动复制拷贝来实现失效自动恢复的能力。

MongoDB的重要性

和传统DB相比,MongoDB有比较明显的优势,扩展性就是一个很重要的方面。其他方面,比如:

  • 分布式 数据平台:合理的建设系统可以使得数据全局均匀分布
  • 文本搜索:文本搜索使得应用层使用起来不
  • 灵活的数据模型:支持动态的Schema,给开发者不会带来限制
  • 快速灵活的迭代开发:MongoDB支持变化,拥抱变化值得敏捷开发过程更容易。
  • 集成的特性: 分析平台 、 数据可视化 、时间驱动 流数据 处理、 文本搜索 、 空间查询 、 图计算 、内存存储、安全性都可以让开发者在没有额外负担的情况下进行数据集成。
  • 经济和成本:相比其他数据库系统,MongoDB在商业支持和维护方面都比较经济。

结论

本文中,我们简单介绍了MongoDB和它的一些 关键特性 、 概念 、 架构 、 水平扩展 能力,强调了其重要性。

在互联网和企业级的海量数据时代,MongoDB的高性能查询以及强大的水平扩展能力,不仅使软件系统开发迭代的速度更快,也使企业在对数据的利用和挖掘上提供了更好的工具。

使用MongoDB,就不会在 数据海洋 中迷失方向。

Follow me。 让我们一起在数据和技术的海洋中到达彼岸。下一期,我们将介绍如何在Windows上 如何使用 MongoDB。

参考:

[1]: 实际上MongoDB的存储格式为BSON格式,即二进制存储的JSON格式。参考:https://bsonspec.org/

[2]: https://digitalvarys.com/introduction-to-mongodb/