MongoDB介绍-关键概念、架构、扩展能力
关于成功没有一个确切的公式,但关于失败我可以找到一个:总是尽力取悦所有人。
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 |
|
需要注意的是:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线”_”开头的键是保留的(不是严格要求的)。
集合
MongoDB中的 集合 就是一堆文档的组(group of Documents),相当于关系数据库中的表。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
比如,我们可以将以下不同数据结构的文档插入到集合中:
1 |
|
合法的集合名需要满足如下规则:
- 集合名不能是空字符串””。
- 集合名不能含有\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/