MongDB介绍与部署
# MongoDB介绍
# 简介
MongoDB是一款分布式文件存储、基于文档的非关系型开源数据库(NoSQL),它将数据存储为一个BSON文档(类似于JSON对象)。
MongoDB于2009年首次发布,它的设计目标是为了解决传统的关系型数据库在大规模数据存储和高并发访问方面的限制,它的名称Mongo源自humongous(庞大的)一词,暗示了它的设计目标是处理大规模的数据。
虽然MongoDB是NoSQL数据库,但它存储的数据之间仍然可以存在某种形式的关系,是最接近于关系型数据库的NoSQL数据库。
# 适用场景
MongoDB的优势在于其数据模型和存储引擎的灵活性、架构的可扩展性以及对强大的索引支持。
需要大数据量的存储和快速水平扩展,MongoDB支持分片集群,可以很方便地添加更多的节点,让集群存储更多的数据,具备更强的性能。
需要更多类型索引来满足应用场景,MongoDB支持多种类型的索引,包括单字段索引、复合索引、多键索引、哈希索引、文本索引、 地理位置索引等,每种类型的索引有不同的使用场合。
# 场景案例
- 小米
小米利用 MongoDB 构建了其云平台的后端服务,用于存储和管理大量的用户数据、设备数据以及物联网数据。
- 滴滴出行
滴滴出行使用MongoDB来处理地理位置数据和优化其调度系统。MongoDB的地理空间索引和查询功能对于滴滴这样的出行服务尤其重要。
- 网易
网易利用 MongoDB 来支持其游戏和邮箱服务中的大数据处理和存储需求,特别是在用户个性化推荐和数据分析方面。
- 携程
携程在其旅行和预订平台中使用 MongoDB,用于优化搜索服务和处理大量的用户交互数据。
Google 使用 MongoDB 为多个内部项目和产品提供后端存储服务,特别是在处理大规模数据集时。
# 存储结构
# 介绍
MongoDB的存储结构只是名称上区别于传统的关系型数据库,实际上类似MySQL的结构化存储。主要由如下三个单元组成:
- 文档(Document):MongoDB中最基本的单元,由BSON键值对(key-value)组成,类似于关系型数据库中的行(Row)。
- 集合(Collection):一个集合可以包含多个文档,类似于关系型数据库中的表(Table)。
- 数据库(Database) :一个数据库中可以包含多个集合,可以在MongoDB中创建多个数据库,类似于关系型数据库中的数据库(Database)。
也就是说,一个数据库包含一个或多个集合,一个集合包含多条BSON文档,BSON文档由字段和值组成。
MySQL | MongoDB |
---|---|
数据库(Database) | 数据库(Database) |
表(Table) | 集合(Collection) |
行(Row) | 文档(Document) |
列(Col) | 字段(Field) |
主键(Primary Key) | 对象 ID(Objectid) |
索引(Index) | 索引(Index) |
嵌套表(Embeded Table) | 嵌入式文档(Embeded Document) |
数组(Array) | 数组(Array) |
# 数据库
数据库用于存储集合,一个MongoDB中可以创建多个数据库,每一个数据库都有自己的集合和权限。
MongoDB中预留了几个特殊的数据库:
- admin:admin数据库主要用于保存用户和角色。例如system.users表存储用户、system.roles表存储角色。一般不建议用户直接操作这个数据库。一些特定的服务器端命令也只能从这个数据库运行,比如关闭服务器。
- local:local数据库是不会被复制到其他分片的,因此可以用来存储本地单台服务器的任意collection。一般不建议用户直接使用local库存储任何数据,也不建议进行CRUD操作,因为数据无法被正常备份与恢复。
- config:当MongoDB使用分片设置时,config数据库可用来保存分片的相关信息。
- test:默认创建的测试库,连接mongod服务时,如果不指定连接的具体数据库,默认就会连接到 test 数据库。
数据库名需要满足以下条件:
- 不能是空字符串
""
。 - 不得含有
' '
(空格)、.
、$
、/
、\
和\0
(空字符)。 - 应全部小写。
- 最多64字节。
数据库名最终会用于文件系统里的文件,这也就是有如此多限制的原因。
# 集合
MongoDB集合存储在数据库中,它使用无模式的方式存储数据,这意味着可以在同一集合插入不同格式和类型的数据,不过一般都会插入有一定的关联性的数据。
集合不需要事先创建,当第一个文档插入或者第一个索引创建时,如果该集合不存在,则会创建一个新的集合。
无模式指存储的数据(通常是文档)不需要预先定义其结构。这意味着在同一个集合内,存储的文档没有固定的结构,可以拥有完全不同的字段和数据类型。
意味着允许开发者在不中断或修改现有数据结构的情况下,快速迭代和修改应用的数据模型。
无模式相对于有模式,它要求在数据存储之前必须明确定义其表结构、数据类型等。这意味着如果需要调整表的数据结构,通常需要通过修改表结构来实现,这可能涉及到复杂的数据库迁移和停机时间。如MySQL就是使用有模式。
集合名需要满足以下条件:
- 集合名不能是空字符串
""
。 - 集合名不能含有
\0
(空字符),这个字符表示集合名的结尾。 - 集合名不能以"system."开头,这是为系统集合保留的前缀。例如
system.users
这个集合保存着数据库的用户信息,system.namespaces
集合保存着所有数据库集合的信息。 - 集合名必须以下划线或者字母符号开始,并且不能包含
$
。
# 文档
MongoDB中一条记录就是一个BSON文档,它是由多个键值对组成的数据结构,类似于JSON对象,是MongoDB中的基本数据单元。它支持丰富的字段值类型,例如字符串、数值、布尔值、数组、其他文档、时间戳等等。
BSON是Binary JSON的简称,是JSON文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于JSON规范的数据类型的扩展。BJSON的遍历速度优于JSON,但BJSON使用的存储空间更多。
文档的键是字符串,键名需要满足以下条件:
- 键不能含有
\0
(空字符)。这个字符用来表示键的结尾。 .
和$
有特别的意义,只有在特定环境下才能使用。- 以下划线
_
开头的键是保留的(不是严格要求的)。
# 存储引擎
# 介绍
存储引擎(Storage Engine)是数据库的核心组件,负责管理数据在内存和磁盘中的存储方式。
与MySQL一样,MongoDB采用的也是插件式的存储引擎架构,支持不同类型的存储引擎,不同的存储引擎解决不同场景的问题。在创建数据库或集合时,可以指定存储引擎。
插件式的存储引擎架构可以实现Server层和存储引擎层的解耦,可以支持多种存储引擎,如MySQL既可以支持B-Tree结构的InnoDB存储引擎,还可以支持LSM结构的RocksDB存储引擎。
# 常用引擎
MongoDB支持的主要存储引擎包括WiredTiger、In-Memory、MMAPv1。不过从 MongoDB 3.2版本开始,WiredTiger成为了默认的存储引擎,而MMAPv1存储引擎在后续的版本中被弃用。
# WiredTiger
WiredTiger是MongoDB的默认存储引擎,从MongoDB3.2版本开始引入,它基于B+树进行实现,非常适合大多数工作负载。它支持文档级别的并发控制、支持多种数据压缩选项、支持ACID事务。
# In-Memory Storage Engine
In-Memory存储引擎是MongoDB的一个可选存储引擎,提供了更快的数据访问速度,适用于对读写性能有极高要求的场景。它的数据存储在内存中,且重启时数据不会持久化,一般用于缓存和临时数据的快速存取。