首页 > 数据库 > NoSQL > Mongodb Wiredtiger存储引擎实现原理
Mongodb-3.2已经WiredTiger设置为了默认的存储引擎,最近通过阅读wiredtiger源代码(在不了解其内部实现的情况下,读代码难度相当大,代码量太大,强烈建议官方多出些介绍文章),理清了wiredtiger的大致原理,并简单总结,不保证内容都是正确的,如有问题请指出,欢迎讨论交流。
按照Mongodb默认的配置,?WiredTiger的写操作会先写入Cache,并持久化到WAL(Write ahead log),每60s或log文件达到2GB时会做一次Checkpoint,将当前的数据持久化,产生一个新的快照。
Wiredtiger的Cache采用Btree的方式组织,每个Btree节点为一个page,root page是btree的根节点,internal page是btree的中间索引节点,leaf page是真正存储数据的叶子节点;btree的数据以page为单位按需从磁盘加载或写入磁盘。
Wiredtiger采用Copy on write的方式管理修改操作(insert、update、delete),修改操作会先缓存在cache里,以skiplist的形式组织;持久化时,修改操作不会在原来的leaf page上进行,而是写入新分配的page,每次checkpoint都会产生一个新的root page。
Checkpoint时,wiredtiger需要将btree修改过的PAGE都进行持久化存储,每个btree对应磁盘上一个物理文件,btree的每个PAGE以文件里的extent形式(由文件offset + size标识)存储,一个Checkpoit包含如下元数据:
Mongodb里一个典型的Wiredtiger数据库存储布局大致如下
$tree .
├── journal
│ ├── WiredTigerLog.0000000003 │ └── WiredTigerPreplog.0000000001 ├── WiredTiger
├── WiredTiger.basecfg ├── WiredTiger.lock ├── WiredTiger.turtle ├── admin
│ ├── table1.wt │ └── table2.wt ├── local
│ ├── table1.wt │ └── table2.wt └── WiredTiger.wt
一次Checkpoint的大致流程如下
上述过程如中间失败,Wiredtiger在下次连接初始化时,首先将数据恢复至最新的快照状态,然后根据WAL恢复数据,以保证存储可靠性。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15498/viewspace-1982581/ ,如需转载,请注明出处,否则将追究法律责任。