MongoDB数据库架构
MongoDB存储引擎
存储引擎负责管理数据存储,包括内存和磁盘,解决数据的存储和磁盘的交互
mongodb的存储引擎可以自由的替换,但是要符合mongoDB的API
mongoDB官方支持的存储引擎
WiredTiger是3.2之后默认使用的存储引擎:提高了更良好的锁并发机制,可以支持文档级别的锁
MMAPv1是3.2之前的使用的存储引擎,在锁机制这一块儿不是太好
In-Memory是企业版支持从存储引擎
Encrypted是企业版支持的存储引擎,加密存储引擎
第三方
RocksDB是facebook出的一个nosql存储引擎,主要是解决写入并发的性能,也可以结合mysql使用
TerarKDB是解决存储空间的优化和查询性能的优化
阿里云数据库mongoDB版扩展支持的存储引擎
命令查看服务状态信息
db.serverStatus()
查看服务引擎
db.serverStatus().storageEngine
db.serverStatus().storageEngine
{
“name” : “wiredTiger”,
“supportsCommittedReads” : true,
“oldestRequiredTimestampForCrashRecovery” : Timestamp(0, 0),
“supportsPendingDrops” : true,
“dropPendingIdents” : NumberLong(0),
“supportsSnapshotReadConcern” : true,
“readOnly” : false,
“persistent” : true,
“backupCursorOpen” : false
}
MongoDB数据逻辑架构
固定集合Capped:定义了一个集合容量(数据大小)固定,超过了运行淘汰,设定一个淘汰机制,例如先进先出,场景:数据排队的消息队列,在MongoDB内部做主从复制的时候,使用了base集合,使用固定容量大小的存储日志同步到从服务器
集合Collection
- 类似与关系型数据库中的表Table
- MogonDB数据库可以包含多个集合,一个集合可以包含多个文档(Document)
- 如果集合不存在,MongoDB会在保存第一条数据的时候创建
- 可以使用
db.createCollection()
创建集合 - 集合不限制文档doucment的字段架构
- MongoDB 3.2 开始可以启用Schema Validation 强制验证文档结构
- MongoDB还提供了Capped Collection 固定容量大小的集合
- db.createCollection(“log”,{capped:true,size:5242880,max:5000})
- max:5000 文档的个数,两个都指定满足一个就行
use deerlili
show collections
db.users.stats()
{
"ns" : "deerlili.users",
"size" : 1717,
"count" : 22,
"avgObjSize" : 78,
"storageSize" : 36864,
"capped" : false,
"wiredTiger" : {
"metadata" : {
"formatVersion" : 1
}...
}
MongoDB文档模型与BSON
- Doucment文档,类似于关系型数据库中的行Row,数据基本单元
- 文档结构类似于JSON文档,存储键值对数据
- MongoDB保存数据的基本格式是BSON Doucment
- BSON是二进制的JSON,目的的节约存储空间
- MongoDB的文档支持更丰富的数据类型
- _id是默认的主键,使用的是ObjectId类型保证唯一,也可以自定义
- 字段存储有特定的顺序,允许嵌套复杂类型,如文档类型的数据
- 除了数据使用文档、查询、过滤、索引管理等功能也全部使用文档
- BSON文档大小有16M的限制,就是一行的数据16M
- 超出16M限制的数据可以使用GridFS存储
MongoDB文档模型设计原则
数据模型两种方式
Normalized 范式
Denormalized 反范式
MongoDB文档结构分为
引用式:也就是RDBMS中的外键关联
嵌入式:也就是Doucment文档中的内嵌结点
MongoDB日志Log机制(Journal)
- 为了防止突发故障导致的数据丢失,MongoDB提供了日志机制
- WiredTiger使用前写日志write-ahead transaction log和Checkpoint检查点一起来确保数据正确持久性
- 如果MongoDB日志存在检查点,就使用日志重放功能修改直到上一个检查点
- 日志使用了snappy压缩库
- 最小日志大小128字节,小于此大小不启用压缩
- 单节点,不启用日志,可能导致数据修改丢失
- WiredTiger引擎日志默认大小100ms毫秒刷一次磁盘,日志大小最大100M,超过会自动创建新文件
- WiredTiger引擎会自动删除直到上一个checkpoint的日志文件
配置文件
locate mongod.conf
一般在在/etc/mongod.conf
Mongod.conf 控制日志
深入MongoDB日志模式底层原理
控制WiredTiger日志持久化
- MongoDB的日志在dbpath目录下的Journal目录下
- 启动参数
--journal
开始启用--nojournal
关闭,也可以配置文件关闭 - WiredTiger默认提交日志时间的间隔100毫秒
- 3.2版本WiredTiger写入日志间隔默认50毫秒
- 3.6以后WiredTiger设置检查点间隔是60秒
- 如果写入操作设置了
j:true
,引擎会立即写磁盘 - 日志大小最大100M,超过会自动创建新文件
- 如果强制关闭Mongod进程可能会导致日志丢失
- 使用storage.journal.commitIntervalMs控制间隔
- In-Memory引擎不支持此参数
- MMAPv1引擎默认提交日志时间的间隔30毫秒
- WiredTiger引擎自动删除直到上一个checkpoint的日志文件
MongoDB面试题
- Document内嵌vs引用
Embedding内嵌:快速读取、数据冗余、数据更新时候比较复杂
Linking引用:节约空间,关系灵活,数据更新比较简单、需要从多个表读数据 - MongoDB存储引擎主要有哪些?
- 几种主流存储引擎的差异?优缺点?
- MongoDB日志结构
- MongoDB恢复数据库数据的原理?
- BSON如何保证数据的序列化?
- MongoDB文档模型?
- MongoDB文档模型的优缺点?
- 如何控制MongoDB日志写入时间?