转自:http://www.mongoing.com/archives/2540

传统数据库引擎的数据组织方式,一般存储引擎都是采用 btree 或者 lsm tree 来实现索引,但是索引的最小单位不是 K/V 记录对象,而是数据页,数据页的组织关系实现就是存储引擎的数据组织方式。

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

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

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

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

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

  • root page地址,地址由文件offset,size及内容的checksum组成
  • alloc extent list地址,存储从上次checkpoint起新分配的extent列表
  • discard extent list地址,存储从上次checkpoint起丢弃的extent列表
  • available extent list地址,存储可分配的extent列表,只有最新的checkpoint包含该列表
  • file size 如需恢复到该checkpoint的状态,将文件truncate到file size即可

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
  • WiredTiger.basecfg存储基本配置信息
  • WiredTiger.lock用于防止多个进程连接同一个Wiredtiger数据库
  • table*.wt存储各个tale(数据库中的表)的数据
  • WiredTiger.wt是特殊的table,用于存储所有其他table的元数据信息
  • WiredTiger.turtle存储WiredTiger.wt的元数据信息
  • journal存储Write ahead log

一次Checkpoint的大致流程如下

对所有的table进行一次Checkpoint,每个table的Checkpoint的元数据更新至WiredTiger.wt
对WiredTiger.wt进行Checkpoint,将该table Checkpoint的元数据更新至临时文件WiredTiger.turtle.set
将WiredTiger.turtle.set重命名为WiredTiger.turtle
上述过程如中间失败,Wiredtiger在下次连接初始化时,首先将数据恢复至最新的快照状态,然后根据WAL恢复数据,以保证存储可靠性。

参考资料

    1. Wiredtiger官方文档
    2. Mongodb internal
    3. Wiredtiger Block Manager Overview

MongoDB Wiredtiger存储引擎实现原理——Copy on write的方式管理修改操作,Btree cache的更多相关文章

  1. MongoDB Wiredtiger存储引擎实现原理

    Mongodb-3.2已经WiredTiger设置为了默认的存储引擎,最近通过阅读wiredtiger源代码(在不了解其内部实现的情况下,读代码难度相当大,代码量太大,强烈建议官方多出些介绍文章),理 ...

  2. MongoDB wiredTiger存储引擎下的存储方式LSM和B-Tree比较

    前段时间做拦截件监控的时候把拦截件生命期存入mongodb,因生命期有各种变化,因此对此表的更新写操作非常多,老大给我看了一篇文章,才知道mongodb已经支持lsm存储方式了. 原文如连接:http ...

  3. wiredtiger存储引擎介绍——本质就是LSM,当然里面也可以包含btree和列存储

    见:http://www.slideshare.net/profyclub_ru/4-understanding-and-tuning-wired-tiger-the-new-high-perform ...

  4. 把mmapv1存储引擎存储的mongodb3.0数据库数据复制到WiredTiger存储引擎的mongodb3.2中

    mongodb3.0在mmapv1的存储引擎基础上添加了一个新的存储引擎WiredTiger.但是3.0的默认存储引擎依旧是mmapv1,因此我们项目之前也就用的默认方式. 但是mongodb更新实在 ...

  5. mongodb的存储引擎

    mongodb版本为3.4 mongodb存储引起的一些概述 存储引擎是MongoDB的核心组件,负责管理数据如何存储在硬盘和内存上.从MongoDB 3.2 版本开始,MongoDB 支持多数据存储 ...

  6. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  7. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  8. 浅析Mysql InnoDB存储引擎事务原理

    浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021

  9. 了解MySQL存储引擎工作原理

    MySql数据库最大的特色就是其插件式的存储引擎架构,本文主要介绍MySql常用的存储引擎,为开发时选择合适的存储引擎提供参考. 1. MySql体系结构# 在介绍存储引擎之前先来介绍下MySql的体 ...

随机推荐

  1. Linux中的服务管理

    RPM包默认安装的服务 查看已安装的服务: chkconfig --list 默认安装位置: /etc/init.d 启动脚本 /etc/sysconfig 初始化环境配置文件 /etc  配置文件位 ...

  2. css字体样式

    css字体样式(Font Style) 属性       css文本样式 序号 中文说明 标记语法 1 字体样式 {font:font-style font-variant font-weight f ...

  3. width

    position:absolute 其widht:%是想对于最近的已经定位的父元素,如果没有就想对于body widht 是指的内容区的with,设置除了width其他的元素都会使元素变的比width ...

  4. Kattis - convexpolygonarea 【数学】

    题意 给出一系列点,求这个多边形面积 思路 向量叉积 AC代码 #include <cstdio> #include <cstring> #include <ctype. ...

  5. C# 调用VS自带程序WebDev.WebServer40.EXE 源代码

    通过Process.Start启动,VS自带程序WebDev.WebServer40.EXE 在内网架设网站时,为安装IIS条件下用VS自带的小程序来测试效果非常不错! using System; u ...

  6. 026_默认的MapReduce Driver(最小驱动问题)

    1. 最小配置的MapReduce Driver 读取输入文件中的内容,输出到指定目录的输出文件中,此时文件中的内容为: Key---输入文件每行内容的起始位置. Value---输入文件每行的原始内 ...

  7. Linux Shell基础 通配符

    通配符 在 Bash 中,如果需要模糊匹配文件名或目录名,就要用到通配符.下面为常用的通配符. 表 1 通配符 通配符 作 用 ? 匹配一个任意字符 * 匹配 0 个或任意多个任意字符,也就是可以匹配 ...

  8. Linux基本命令 文件处理命令

    概述 命令格式:命令 [-选项] [参数] 例如:ls -la /etc 说明:1.个别命令使用不遵守此格式.2. 当有多个选项时,可以写在一起. ls 命令示例 文件打印命令cat.tac.more ...

  9. cocos打包出现错误,执行命令出错,返回值:2。 Traceback (most recent call last): File "E:\cocos_workspace\MyGameOne\proj.android\build_native.py", line 43, in <module> build(opts.build_mode) File "E:\cocos_workspace\MyGa

    先看看NDK的版本,如果不行,就删除\proj.android\obj\local\armeabi下的文件.

  10. 【Topcoder】SRM157 DIV2总结

    250分题:简单的二分,就是平常玩的猜数字游戏 代码:GitHub 500分题:给出一个员工一天的打卡时间段,要求求出员工这一天的工资.其中正常上班时间是6:00:00到18:00:00,薪水是wag ...