微号:「moon聊技术」
关注选择“ 「星标」 ”, 重磅干货,第一 时间送达!
[如果你觉得文章对你有帮助,欢迎「关注,在看,点赞,转发」]
moon 的开场白
《「一起学」》系别终于启动了,这个系列我主要会「按照我学习的思路」,给大家更新一下,为的是「学习方法和思路」,当然重要的还有知识,以及 moon 平常是怎么学习一个新的技术的
当然《「面试八股文」》系列后面还是会更新的,别慌,等我码字
好了,前话就说这么多,开始步入正题了~
初学 mongodb
「新学一个技术应该做什么」?
「官方文档」,来,我们一起来看看官方文档是怎么说的
遇事不决,先看简介
这里第一句话很关键,文档上说,mongoDB 是一个「文档型数据库,旨在简化开发和扩展」。
这里很明显的确定了 mongoDB 的部分优势,那就是「简化开发和扩展」,那它是怎么简化开发和扩展的呢?这就是需要我们后面认真的去研究了。
然后,又提到了一个关键的词,「文档型数据库」,好了,到这里没有听过的朋友就蒙了,所以,我们往下看
什么是文档型数据库?
紧接着官方就给了说明,「MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组」。
这句话其实讲的已经非常明了了,它记录的是一个文档,所以相比 Mysql 这种关系型数据库来说,moon 第一个想到的就是,「不用写 DDL 语句来维护表字段的关系了」,文档里面,你想怎么存就怎么存。
后面官方这里提到了文档数据库的「优点」:
- 1.文档(即对象)对应于许多编程语言中的内置数据类型。
也就是说说文档内的「数据类型是自己定义」的,可以对应不同编程语言中的各种内置数据类型
- 2.嵌入式文档和数组减少了对昂贵连接的需求。
最直白的说就是类似于 Mysql 当中的 Join 语句少了
- 3.动态模式支持流畅的多态性。
这句话的 moon 是这样理解的,由于文档内容是自定义的,所以会有各种格式,比如下面这种格式就体现了其多态性
普通电话,具有打电话发短信的功能 { "type": "basic_phone", "message":1, "call":1 } iphone,具有打电话发短信的功能,并且还能玩游戏 { "type": "iphone", "message":1, "call":1, "game":1 }
集合/视图/按需实例化视图
MongoDB 将文档存储在集合中。集合类似于关系数据库中的表。
这句话就很好理解了,我就不解释了
除集合外,MongoDB 还支持:
- 只读视图(从MongoDB 3.4开始),和 SQL 的视图没有什么差异,视图是基于表/集合之上进行动态查询的一层对象,可以是虚拟的,也可以是物理的(物化视图)。
- 按需实例化视图。从4.2版本开始,MongoDB 为 aggregation pipeline 添加了 $merge 阶段。此阶段可以将管道结果合并到现有集合中,而不是完全替换现有集合。此功能允许用户创建按需物化视图,每次运行管道时都可以更新输出集合的内容。
主要特性
后面就介绍到了 mongoDB 的一些主要特性
-
高性能
- 1.对嵌入式数据模型的支持减少了数据库系统上的I / O操作。
「什么是嵌入式的数据模型呢」?
MongoDB 提供高性能的数据持久化。特别是, 对嵌入式数据模型的支持减少了数据库系统上的 I / O 操作(不用连表查询了)。 索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。
「为什么嵌入式模型可以减少数据库系统上的 I / O 操作?」
- 丰富的查询语言
MongoDB 支持丰富的查询语言以支持读写操作(CRUD)以及: 数据聚合 文本搜索和地理空间查询。
「其实数据库的核心作用就是两个,存储+查询」,各种不同的数据库几乎都是围绕着这两个点去设计的,所以查询方式也是非常重要的,MongoDB 并「不支持 sql 语句查询」,但是对于已经熟悉 sql 语句查询的人来说,官方给了我们一个很简单的理解方式,就是 sql 查询和 mongo 查询的对照
`如上图 https://docs.mongodb.com/v4.2/reference/sql-comparison/SELECT * FROM people = db.people.find
SELECT user_id, status FROM people
db.people.find(
{ },
{ user_id: 1, status: 1, _id: 0 }
)
SELECT user_id, status FROM people WHERE status = "A"
db.people.find(
{ status: "A" },
{ user_id: 1, status: 1, _id: 0 }
)`
这样是不是就很容易去理解了
- 高可用
MongoDB 的复制工具(称为副本集)提供:
1.「自动_故障转移」 2.「数据冗余」。
副本集是一组维护相同数据集合的 mongod 实例,提供了冗余和提高了数据可用性。
- 水平拓展
MongoDB 提供水平可伸缩性作为其核心 功能的一部分: 分片将数据分布在一个集群的机器上。 从 3.4 开始,MongoDB 支持基于分片键创建数据区域。在平衡群集中,MongoDB 仅将区域覆盖的读写定向到区域内的那些分片。
-
支持多种存储引擎
-
MongoDB 支持多个存储引擎:
- WiredTiger 存储引擎(包括对静态加密的支持)
- 内存存储引擎。
-
另外,MongoDB 提供可插拔的存储引擎 API,允许第三方为 MongoDB 开发存储引擎。
这其实也是「类似于 mysql 存储引擎可拔插的设计」,比较容易理解
架构
作为一个新学习的数据库,「架构图也是我们了解其信息的重要手段之一」
我们可以看到,在 mongoDB 的架构中,核心的有三个组件
-
数据分片(Shards)
- 分片用于存储真正的集群数据,可以是一个单独的 Mongod实例,也可以是一个副本集。 生产环境下Shard一般是一个 Replica Set,以防止该数据片的单点故障。
- 对于分片集合(sharded collection)来说,每个分片上都存储了集合的一部分数据(按照分片键切分),如果集合没有分片,那么该集合的数据都存储在数据库的 Primary Shard中。
-
配置服务器(Config Servers)
- 保存集群的元数据(metadata),包含各个Shard的路由规则,也包括了 chunk (分片数据块)的信息。
-
查询路由(Query Routers)
- Mongos是 Sharded Cluster 的访问入口,其本身并不持久化数据 。Mongos启动后,会从 Config Server 加载元数据,开始提供服务,并将用户的请求正确路由到对应的Shard。
- Sharding 集群可以部署多个 Mongos 以分担客户端请求的压力。
其实到了这里就基本差不多了,但是为了「加深」我们对于 mongoDB 的「印象」,我会去再看一下,「MongoDB 和 Mysql 到底有什么区别」
MongoDB 和 Mysql 有什么区别
数据库 | MongoDB | MySQL |
---|---|---|
数据库模型 | 非关系型 | 关系型 |
存储方式 | bson格式 | 不同引擎有不同的存储方式 |
查询语句 | MongoDB查询方式 | SQL语句 |
数据处理方式 | 基于内存,将热数据存放在物理内存中,从而达到高速读写 | 不同引擎有自己的特点 |
事务性 | 仅支持单文档事务操作,弱一致性 | 支持事务操作 |
占用空间 | 占用空间大 | 占用空间小 |
join操作 | MongoDB没有join | MySQL支持join |
总结
以上的知识对于一个新技术的入门来说,肯定是够用了 但是「重点还是在于归纳总结」,当你看完这些知识的时候,你脑海里对它有什么印象
对于 mongoDB ,当你看完这篇文章的时候,你需要知道它是一个
- 「cp 类型的文档数据库」
- 它有着自己「独特的数据查询方式」,操作语法是怎样的
- 它支持「水平扩展」
- 「自动故障转移和数据冗余(数据分散在不同的 shard 上,有备份)成就了它的高可用」
- 一个请求打到 mongoDB 中需要一层「路由来将请求映射到具体的数据分片上」
- 只「支持单个文档的事物」。。。。。。
入门就到这里了,后面我们再展开,包括「索引,分片原理,故障转移机制」等等
喜欢的朋友可以给 moon 来个星标,有文章都会第一时间推送给你,欢迎大家一起讨论