MongoDB–WiredTiger存储引擎(写数据流程,持久化,Cache)
文章目录
- MongoDB--WiredTiger存储引擎(写数据流程,持久化,Cache)
- 一:WiredTiger是什么
- 二:写操作流程
- 三:关于B树
- 四:Cache
- 五:增删改
- 六:Checkpoint
在mongoDB3.2之后,默认的存储引擎是WiredTiger。
一:WiredTiger是什么
WiredTiger是一个存储引擎,mongoDB3.2之后默认采用的就是WiredTiger.wiredTiger支持document级别的锁,在MongoDB3.6里面, 支持了事务,在MongoDB4.0里面, 终于有了针对副本集的多文档事务实现 。
WiredTiger
与原先的MMAPV1
相比有以下优势:
- 性能&并发:在大多数工作负载下,
WiredTiger
的性能要比MMAPV1
高很多。WiredTiger
引擎为现代多核系统量身定制,更好地发挥多核系统的处理能力。MMAPV1
引擎使用表级锁,因此,当某个单表上有并发的操作,吞吐将受到限制。WiredTiger
使用文档级锁,由此带来并发及吞吐的提高。对于典型的应用,切到WiredTiger
引擎,可带来5-10倍的性能提升。 - 压缩&加密:
MMAPV1
引擎要求数据在内存和在磁盘的形式一致(map磁盘内存映射)。因此,它并不支持压缩和加密。WiredTiger
并没有这层限制,可以更好地支持。 - 索引前缀压缩:
WiredTiger
存储索引时使用前缀压缩——相同的前缀只存一次。由此带来的效果是:索引更小了,对物理内存使用也更少了。
二:写操作流程
- wiredTiger写操作先写到cache,并且持久化到WAL(预写日志)
- 每60s或者文件达到2G,执行一次checkpoint持久化到磁盘,产生一个快照
- Wiredtiger连接初始化时,首先将数据恢复至最新的快照状态,然后根据WAL恢复数据,以保证存储可靠性
三:关于B树
B树,英文中的B-Tree,一个 m 阶的B树满足以下条件:
每个结点至多拥有m棵子树;
根结点至少拥有两颗子树(存在子树的情况下);
除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树;
所有的叶结点都在同一层上;
有 k 棵子树的分支结点则存在 k-1 个关键码,关键码按照递增次序进行排列;
关键字数量需要满足ceil(m/2)-1 <= n <= m-1;
四:Cache
Wiredtiger的Cache采用Btree的方式组织,每个Btree节点为一个page,root page是btree的根节点,internal page是btree的中间索引节点,leaf page是真正存储数据的叶子节点;btree的数据以page为单位按需从磁盘加载或写入磁盘。
五:增删改
采用Copy on write的方式管理insert、update、delete。
修改操作:
1、数据读入Cache里,
2、对数据修改,
3、持久化时,写入新的page(不会写原理的leaf page)。
4、执行Chechpoint之后,产生新的page。
六:Checkpoint
每次Checkpoint的过程:
1、对所有的table进行一次Checkpoint,将每个table的Checkpoint的元数据更新到WiredTiger.wt
2、再对WiredTiger.wt进行Checkpoint,将Checkpoint的meta数据更新到WiredTiger.turtle.set
3、将WiredTiger.turtle.set重命名为WiredTiger.turtle
WiredTiger包含以下文件:
WiredTiger.basecfg :存储基本配置信息
WiredTiger.lock用于防止多个进程连接同一个WiredTiger数据库
table*.wt存储各个table的数据
WiredTiger.wt:是特殊的table,用于存储所有其他table的meta数据信息
WiredTiger.turtle:存储WireTiger.wt的meta数据信息journal存储Write ahead log
上述过程如中间失败,Wiredtiger在下次连接初始化时,首先将数据恢复至最新的快照状态,然后根据WAL恢复数据,以保证存储可靠性。