【DBA课程-笔记】第 3 章:MongoDB数据库核心知识

内容

[一、MongoDB 数据库架构](#一、MongoDB 数据库架构)

[A. MongoDB数据库体系架构](#A. MongoDB数据库体系架构)

[1. 存储引擎(MongoDB Storage Engines):](#1. 存储引擎(MongoDB Storage Engines):)

[2. MongoDB 数据逻辑架构](#2. MongoDB 数据逻辑架构)

[二、MongoDB 存储引擎](#二、MongoDB 存储引擎)

[A. 查看mongodb服务器的状态](#A. 查看mongodb服务器的状态)

[B. 查看引擎信息(4.2.1 没有这个命令)](#B. 查看引擎信息(4.2.1 没有这个命令))

[C. 查看 - 集合状态(包含引擎信息)](#C. 查看 - 集合状态(包含引擎信息))

[三、集合 Collection](#三、集合 Collection)

[A. 创建集合](#A. 创建集合)

[B. 查看集合状态](#B. 查看集合状态)

[C. 查看集合所有文档 + 美化](#C. 查看集合所有文档 + 美化)

[四、文档模型 与 BSON](#四、文档模型 与 BSON)

[A. MongoDB 文档模型](#A. MongoDB 文档模型)

[B. MongoDB文档模型设计原则](#B. MongoDB文档模型设计原则)

1.数据模型两种方式

[2. Mongodb文档结构分为](#2. Mongodb文档结构分为)

2-1:引用方式

[2-2:嵌入式 (文档嵌套)](#2-2:嵌入式 (文档嵌套))

五、日志Log机制(数据安全问题)

[A. Mongodb 日志Journa](#A. Mongodb 日志Journa)

[B. Mongod.conf 控制日志](#B. Mongod.conf 控制日志)

[C. 深入MongoDB日志模式底层原理](#C. 深入MongoDB日志模式底层原理)

[D. 控制WiredTiger日志持久化](#D. 控制WiredTiger日志持久化)

[E. 配置文件 mongod.conf](#E. 配置文件 mongod.conf)

[1. 地址](#1. 地址)

[2. 内容说明](#2. 内容说明)

[3. windows带日志下--服务器启动(演示)](#3. windows带日志下--服务器启动(演示))

[六、MongoDB 总结](#六、MongoDB 总结)

[A. Document 内嵌 VS 引用 优缺点](#A. Document 内嵌 VS 引用 优缺点)

[B. MongoDB存储引擎主要有哪些 ?C. 几种主流存储引擎的差异?优缺点?D. MongoDB日志结构 ?E. MongoDB恢复数据库数据的原理?F. BSON如何保证数据的序列化?G. MongoDB文档模型 ?H. MongoDB文档模型优缺点?I. 如何控制MongoDB日志写入时间?](#B. MongoDB存储引擎主要有哪些 ?C. 几种主流存储引擎的差异?优缺点?D. MongoDB日志结构 ?E. MongoDB恢复数据库数据的原理?F. BSON如何保证数据的序列化?G. MongoDB文档模型 ?H. MongoDB文档模型优缺点?I. 如何控制MongoDB日志写入时间?)


一、MongoDB 数据库架构

A. MongoDB数据库体系架构

1. 存储引擎(MongoDB Storage Engines):

  • WiredTiger (对处理读写,并发更灵活)
  • MMAPv1
  • In-Memory (企业版使用)
  • Encrypted
  • 3rd Party Engine

2. MongoDB 数据逻辑架构

  • 二进制BSON文档
  • Journal 日志:性能优化
  • Index 索引:查询优化
  • Collection:
  • Capped:可以模拟数据排队的消息队列
  • 语言执行引擎:

二、MongoDB 存储引擎

  • 作用:解决数据存储和磁盘的交互,以及索引机制,大量IO操作
  • 存储引擎负责管理数据存储,包括内存和磁盘2个区域

|------------|-----------------------------------------------|---------------|
| 引擎名 | 说明 | 描述 |
| MMAPV1 | 【官方】3.0之前版本 | |
| WiredTiger | 【官方】3.0之后版本(默认) | 锁机制提升性能 |
| Encrypted | 【官方】企业版 | |
| In-Memory | 【官方】企业版 | |
| RocksDB | 【Facebook】可以结合mongodb,以及mysql一起使用 | 写入性能优化 |
| TerarkDB | 【字节跳动】工程团队 | 存储空间 + 查询性能优化 |
| 其他引擎 | 如: 阿里云提供支持,RocksDB 和 TerarkDB, WiredTiger(默认) | |

A. 查看mongodb服务器的状态

db.serverStatus()

B. 查看引擎信息(4.2.1 没有这个命令)

db.serverStatus().storgeEngine

C. 查看 - 集合状态(包含引擎信息)

db.users.stats()

三、集合 Collection

  • 类似于关系型数据库中的表 Table
  • MongoDB 数据库可以包含多个集合,一个集合可以包含多个文档( Document)
  • 如果集合不存在,MongoDB会在保存第一条数据时自动创建集合(懒创建)
  • 可以使用 db.createCollection0 创建集合
  • 集合不限制文档Document的字段架构
  • MongoDB 3.2开始 可以启用 Schema Validation 强制验证文档结构
  • MongoDB还提供了Capped Collection固定容量大小的集合

A. 创建集合

  • 创建集合名为:log

  • 固定容量大小:5242880 ,单位字节

  • 文档个数: max:5000 ,表示最多5000个文档

    db.createCollection("log",{ capped : true, size : 5242880, max : 5000 })

B. 查看集合状态

db.users.stats()

C. 查看集合所有文档 + 美化

db.users.find().pretty()

四、文档模型 与 BSON

A. MongoDB 文档模型

  • Document 文档,类似于关系型数据库中的行Row,数据基本单元
  • 文档结构类似于JSON文档,存储键值对Key-Value数据
  • MongoDB保存数据的基本格式是BSON Document
  • BSON是二进制JSON,目的节约存储空间
  • MongoDB的文档支持更丰富的数据类型
  • _id 是默认的主键,使用的是ObjectId类型保证唯一,也可以自定义
  • 字段存储有特定的顺序,允许嵌套复杂类型,如文档类型的数据
  • 除了数据使用文档、查询、过滤、索引管理等功能也全部使用文档(以文档为操作单位)
  • BSON 文档大小有 16M的限制
  • 超出16M 限制的数据可以使用GridFS存储

B. MongoDB文档模型设计原则

1.数据模型两种方式

  • Normalized 范式 (设计标准,为了节省磁盘空间)
  • Denormalized 反范式(随着磁盘价格大幅度下降,为了追求性能,不计成本累加硬件)

2. Mongodb文档结构分为

  • 【范式】引用方式 : 也就是RDBMS中的外键关联
  • 【反范式】嵌入式 : 也就是Ducoment文档中的内嵌节点

2-1:引用方式

2-2:嵌入式 (文档嵌套)

五、日志Log机制(数据安全问题)

A. Mongodb 日志Journa

  • 为了防止突发故障导致的数据丢失,MongoDB提供了日志机制
  • WiredTiger使用写前日志 write-ahead transaction log 和Checkpoint检查点 一起来确保数据正确持久性
  • 如果MongoDB日志存在检查点,就使用日志重放修改直到上一个检查点
  • 日志使用了snappy压缩库
  • 最小日志大小128字节,小于此大小不启用压缩
  • 单节点,不启用日志,可能导致数据修改丢失
  • WiredTiger引擎日志默认100M毫秒刷一次磁盘,日志文件最大100M,超过会自动创建新文件
  • WiredTiger引擎会自动删除直到上一个CheckPoint的日志文件

B. Mongod.conf 控制日志

  • 启动日志
  • 日志路径:/data/db/journal

C. 深入MongoDB日志模式底层原理

  • Shared View:共享内存数据视图
  • 数据写入周期是60S

D. 控制WiredTiger日志持久化

  1. MongoDB的日志在DbPath目录下的Journal目录下
  2. 启动参数 --journal 开启,使用 --nojournal 关闭,也可以配置文件关闭
  3. WiredTiger默认提交日志时间是间隔100毫秒
  4. 3.2 版本WiredTiger写入日志间隔默认50毫秒
  5. 3.6 版本以后WiredTiger设置检查点间隔是60秒
  6. 如果 写入操作设置了 j: true,引擎会立即写磁盘
  7. 日志大小是100MB,写满以后,重新创建日志文件
  8. 如果强制关闭Mongod进程可能会导致日志丢失
  9. 使用storage.journal.commitIntervalMs控制间隔
  10. In-Memory引擎不支持此参数 (控制持久化参数)
  11. MMAPv1引擎默认提交日志时间是间隔30毫秒
  12. WiredTiger引擎自动删除直到上一个CheckPoint的日志文件

E. 配置文件 mongod.conf

1. 地址

  • linux下:/etc/mongod.conf
  • docker中:/data/configdb/ ,一般默认没有,可以通过部署时映射到该目录下

2. 内容说明

  • dbpath :数据库文件存放目录

  • path:日志存放目录

  • port:端口号

  • bindip : 0.0.0.0 允许外部容器访问 ,注:不要写127.0.0.1

  • auth : 不使用密码账户登录

    Where and how to store data.

    storage:
    dbPath: /mnt/mongodb/data
    journal:
    enabled: true
    systemLog:
    destination: file
    logAppend: true
    path: /mnt/mongodb/logs/mongod.log

    network interfaces

    net:
    port: 27017
    bindIp: 0.0.0.0

    #auth

    auth:false

3. windows带日志下--服务器启动(演示)

  • linux/docker 默认自动启动服务器

    服务器启动(默认开启日志)

    mongod.exe --dbpath "c:\MongoDB\data\db" --logpath "C:\MongoDB\data\log\mongo.log"

    服务器启动(开启日志)

    mongod.exe --dbpath "c:\MongoDB\data\db" --journal --logpath "C:\MongoDB\data\log\mongo.log"

    服务器启动(关闭日志)

    mongod.exe --dbpath "c:\MongoDB\data\db" --nojournal --logpath "C:\MongoDB\data\log\mongo.log"

    客户端启动

    mongo.exe --port 27017

六、MongoDB 总结

A. Document 内嵌 VS 引用 优缺点

|--------|-----------------|----------------------|
| | 内嵌 | 引用 |
| 优点 | 快速读取 | 节约空间 关系灵活 数据更新时候比较简单 |
| 缺点 | 数据冗余 数据更新时候比较复杂 | 需要从多个表读数据 |

B. MongoDB存储引擎主要有哪些 ?

C. 几种主流存储引擎的差异?优缺点?
D. MongoDB日志结构 ?
E. MongoDB恢复数据库数据的原理?
F. BSON如何保证数据的序列化?
G. MongoDB文档模型 ?
H. MongoDB文档模型优缺点?
I. 如何控制MongoDB日志写入时间?

相关推荐
吉大一菜鸡1 小时前
FPGA学习(基于小梅哥Xilinx FPGA)学习笔记
笔记·学习·fpga开发
CCSBRIDGE3 小时前
Magento2项目部署笔记
笔记
亦枫Leonlew4 小时前
微积分复习笔记 Calculus Volume 2 - 5.1 Sequences
笔记·数学·微积分
爱码小白5 小时前
网络编程(王铭东老师)笔记
服务器·网络·笔记
LuH11245 小时前
【论文阅读笔记】Learning to sample
论文阅读·笔记·图形渲染·点云
一棵开花的树,枝芽无限靠近你7 小时前
【PPTist】组件结构设计、主题切换
前端·笔记·学习·编辑器
犬余7 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式
数据爬坡ing8 小时前
小白考研历程:跌跌撞撞,起起伏伏,五个月备战历程!!!
大数据·笔记·考研·数据分析
咖肥猫8 小时前
【ue5学习笔记2】在场景放入一个物体的蓝图输入事件无效?
笔记·学习·ue5
郭尘帅6669 小时前
Ajax学习笔记
笔记·学习·ajax