注册 登录
  • 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

MongoDB WiredTiger存储引擎原理

MongoDB 彭东稳 7772次浏览 已收录 0个评论

Mongodb-3.2已经WiredTiger设置为了默认的存储引擎(之前版本使用MMAPV1存储引擎),最近通过阅读wiredtiger源代码(在不了解其内部实现的情况下,读代码难度相当大,代码量太大,强烈建议官方多出些介绍文章),理清了wiredtiger的大致原理,并简单总结,不保证内容都是正确的,如有问题请指出,欢迎讨论交流。

按照Mongodb默认的配置,WiredTiger的写操作会先写入Cache,并持久化到WAL(Write ahead log),每60slog文件达到2GB时会做一次Checkpoint,将当前的数据持久化,产生一个新的快照。Wiredtiger连接初始化时,首先将数据恢复至最新的快照状态,然后根据WAL恢复数据,以保证存储可靠性。

MongoDB WiredTiger存储引擎原理

WiredtigerCache采用Btree的方式组织,每个Btree节点为一个pageroot pagebtree的根节点,internal pagebtree的中间索引节点,leaf page是真正存储数据的叶子节点;btree的数据以page为单位按需从磁盘加载或写入磁盘。

MongoDB WiredTiger存储引擎原理

Wiredtiger采用Copy on write的方式管理修改操作(insertupdatedelete),修改操作会先缓存在cache里,持久化时,修改操作不会在原来的leaf page上进行,而是写入新分配的page,每次checkpoint都会产生一个新的root page

MongoDB WiredTiger存储引擎原理

Checkpoint时,wiredtiger需要将btree修改过的PAGE都进行持久化存储,每个btree对应磁盘上一个物理文件,btree的每个PAGE以文件里的extent形式(由文件offset + size标识)存储,一个Checkpoit包含如下元数据:

§  root page地址,地址由文件offsetsize及内容的checksum组成

§  alloc extent list地址,存储从上次checkpoint起新分配的extent列表

§  discard extent list地址,存储从上次checkpoint起丢弃的extent列表

§  available extent list地址,存储可分配的extent列表,只有最新的checkpoint包含该列表

§  file size 如需恢复到该checkpoint的状态,将文件truncatefile size即可

Mongodb里一个典型的Wiredtiger数据库存储布局大致如下:

储基本配置信息

§  WiredTiger.lock用于防止多个进程连接同一个Wiredtiger数据库

§  table*.wt存储各个tale(数据库中的表)的数据

§  WiredTiger.wt是特殊的table,用于存储所有其他table的元数据信息

§  WiredTiger.turtle存储WiredTiger.wt的元数据信息

§  journal存储Write ahead log

MongoDB WiredTiger存储引擎原理

一次Checkpoint的大致流程如下:

对所有的table进行一次Checkpoint,每个tableCheckpoint的元数据更新至WiredTiger.wt。

WiredTiger.wt进行Checkpoint,将该table Checkpoint的元数据更新至临时文件WiredTiger.turtle.set。

WiredTiger.turtle.set重命名为WiredTiger.turtle。

上述过程如中间失败,Wiredtiger在下次连接初始化时,首先将数据恢复至最新的快照状态,然后根据WAL恢复数据,以保证存储可靠性。

WiredTiger支持行级别锁,mmapV1支持表级别锁,在并发比较大的情况下3.2要比3.0表现的优秀点。


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)or分享 (0)
关于作者:

您必须 登录 才能发表评论!