mongodb基础知识

1 mongodb与mysql的比较

在这里插入图片描述

2 mongodb的优缺点

在这里插入图片描述
优势:
(1)高性能: 持久化化是先存储到内存中,在异步刷新到磁盘中,所以读写速度很快;
(2)高可用: 使用了复制集(副本集)能实时同步一份相同的数据,能够自动进行故障转移;
(3)可扩展: Sharded cluster (分片集群)
(4)灵活: 采用BSON方式存储,类似于JSON格式,文档型的存储方式,和对象转换方便;

缺点:
(1)没有事务机制,不能回滚;
(2)锁只有集合锁,没有行级锁;

mongodb和mysql相似点:
所有数据都是持久化到磁盘中,只是热点数据缓存到内存中,都有备份日志可以恢复数据。

3 适用场景

日志记录
队列消息:bjson格式存储,消息字段新增,不用改表结构
监控数据‘

4 存储结构

BJSON(类似于json)格式
BJSON有json没有的类型 Date BinData

支持的数据类型

{
"name":"zhangsan",  //字符串
"isDangYuan":true, //boolean
"age":23, //数字
"address":{  //内嵌文档
"province":"山东省",
"city":"泰山市"
},
location:["1","2"]  //数组

}

5 关键特性

高性能和丰富的查询语言
高可用
可扩展
支持多种存储引擎

(1) 高性能和丰富的查询语言

高性能:

a 高性能的数据持久化;(保存)
和mysql直接存储到磁盘的区别,mongodb先存储到内存中, 在异步以100ms刷新到磁盘中存储,
对于热点数据直接从内存中读取速度是很快的;
b 索引(查询)

丰富的查询语言:

a crud查询
b 数据聚合
c 文本搜索和地理空间查询

(2)高可用性和数据持久化

高可用性:

mongodb的复制集(相当于副本集)提供:
自动故障转移;
数据冗余

数据持久化:

副本集是一个保证和master保持相同数据的集合, 保证了数据持久化的可用性;

(3)可扩展

使用场景:

当MongoDB复制集遇到下面的业务场景时,你就需要考虑使用Sharded cluster
存储容量需求超出单机磁盘容量
活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能
写IOPS超出单个MongoDB节点的写服务能力
在这里插入图片描述

分片集群架构:
在这里插入图片描述

实现分片集群时,MongoDB 引入 Config Server 来存储集群的元数据,引入 mongos 作为应用访问的入口,mongos 从 Config Server 读取路由信息,并将请求路由到后端对应的 Shard 上

角色说明

A.数据分片(Shards)
用来保存数据,保证数据的高可用性和一致性。可以是一个单独的mongod实例,也可以是一个副本集。
在生产环境下Shard一般是一个Replica Set,以防止该数据片的单点故障。所有Shard中有一个PrimaryShard,里面包含未进行划分的数据集合:
B.配置服务器(Config servers)
保存集群的元数据(metadata),包含各个Shard的路由规则。
C.查询路由(Query Routers)
Mongos是Sharded cluster的访问入口,其本身并不持久化数据(Sharded cluster所有的元数据都会存储到Config Server,而用户的数据则会分散存储到各个shard)
Mongos启动后,会从config server加载元数据,开始提供服务,将用户的请求正确路由到对应的Shard
Sharding集群可以有一个mongos,也可以有多mongos以减轻客户端请求的压力

(4)存储引擎

MMAP 3.2版本之前

库级锁: 并发处理能力差
删除不及时: 磁盘空间和内存空间难以及时清理掉
(MMAP存储时,集合和索引是混合存储在一份磁盘文件中,及时删除掉了集合或者索引,占用的磁盘空间也很难及时清除掉)

WiredTiger 3.2版本之后(含)

文档级别锁:允许并发的更新同一个集合中不同的文档,提高了吞吐能力
支持压缩: 支持集合和索引Block方式压缩,减少了磁盘空间占用
及时删除: 集合和索引分别存储在不同文件中,集合或者索引删除后,对应的存储文件会随即删除;

In-Memory存储引擎

将数据只存储在内存中,只将少量的元数据和诊断日志(Diagnostic)存储到硬盘文件中,由于不需要Disk的IO操作

6 GridFS存储原理

(1)GridFS简介
用来存储大文件

(2)存储过程
通过GridFS存储一个文件时,都会存储到2个集合中, 一个fs.files用来存储文件的元数据,另一个是fs.chunks用来存储文件内容的二进制数据.
在这里插入图片描述

每个文件在fs.files中只有一个文档,记录着该文件的元信息,其中“_id"具有文件唯一性; 每个文件在fs.chunks有一到多个文档用来存储文件内容,其中"files_id"与fs.files中”_id"对应,n代表文件内容的顺序; 查找文件时,先从fs.files中找到该文件元信息的文档,获取"_id", 在用"_id"去匹配fs.chunks中的"files_id"找到文件内容,根据n自然顺序排序就能获取该文件的所有内容。

fs.files文档的格式:
在这里插入图片描述

fs.chunks文档的格式:
在这里插入图片描述

7 架构

在这里插入图片描述
复制集: (高可用)

三个对等节点构成复制集群,节点分成master和secondray角色,其中master负责读写、secondrary只负责读,master中写入的数据会同步到2个secondrary数据库中,当master出现宕机,会重新选举出一个新的master, 实现了自动故障转移

分片集群:(可扩展)

当单机服务器磁盘空间达到最大,需要考虑引入分片存储数据, 同一个集合数据根据分片策略存储到不同的
节点数据库中, 当查询数据的时候,根据sharing 条件,路由到特定节点数据库中

8 存储过程

wiredTiger引擎存储过程
在这里插入图片描述

模块介绍

journal: 类似于orcal的redo日志,当数据库突发宕机时,可以从journal中恢复之前的写操作;

data file: mongodb在存储数据的磁盘文件;

shared view: 每60s或者内存写操作数据达到2G, 会刷新此内存中数据到data file中存储;

private view: 每个写操作发生时,会先存储到private view内存中存储,提高mongodb吞吐量

存储过程
1 当发生一个写操作,先存储到privateview内存中,每100ms会刷新private view内存中数据到journal中,
然后同步更新数据到shared view内存中;

2 每隔60s或者shared view内存中数据达到2G, mongodb会刷新shared view中内存到data file文件中,
然后同步清除掉journal中被刷新到data file中的写操作,并同步更新数据到private view,防止private
view内存过脏

3 当数据库出现突发宕机,可以从journal中恢复日志数据,然后同步到shared view,最后刷新到data file
文件中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值