转自: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

转载于:https://www.cnblogs.com/bonelee/p/6346413.html

MongoDB Wiredtiger存储引擎实现原理——Copy on write的方式管理修改操作,Btree cache...相关推荐

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

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

  2. Mongodb WiredTiger存储引擎特性

    数据库的存储引擎组件,负责管理存储在内存和硬盘上的数据.MongoDB支持多个存储引擎,为特定的工作指派合适的存储引擎为您的用例可以显著提高应用程序的性能. **MongoDB WiredTiger* ...

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

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

  4. WiredTiger存储引擎分析

    初始化 mongodb中wiredtiger初始化 MONGO_INITIALIZER_WITH_PREREQUISITES(WiredTigerEngineInit, ("SetGloba ...

  5. MONGODB 的存储引擎更快,更高,更强的秘诀 --译

    在过去的20年里,存储硬件的性能提高了两个数量级,首先固态存储系统 SSD 的引入,同时SATA导向了PCIE 的接口方式,最终非易失性的技术以及制造工艺的创新.2019年4月,Intel 发布了首款 ...

  6. WiredTiger存储引擎知多少?

    关注我们,及时下载学习资源 内容来源:2018 年 10 月 27 日,MongoDB中文社区联席主席郭远威在"2018年MongoDB中文社区 广州大会"进行<WiredT ...

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

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

  8. 【大数据 OLAP ClickHouse 引擎】ClickHouse 系统架构和存储引擎实现原理 : 为什么 ClickHouse 这么快? Why is ClickHouse so fast?

    文章目录 ClickHouse 系统架构和存储引擎实现原理 ClickHouse 简介 ClickHouse 整体架构 & 核心模块 1. Column与Field 2. DataType 3 ...

  9. 一个简单的程序来使用WiredTiger 存储引擎

    前言 WiredTiger 自 mongodb3.0 集成进来之后为mongodb拉回了大量的口碑,从而在mongodb-3.2 版本直接代替了in-memory存储引擎,作为了mongodb的默认存 ...

最新文章

  1. Asp.Net开发架构设计(二)
  2. 车模换几代了,电池什么时候换?
  3. TP-GAN 侧脸修复
  4. 记:第一次更新服务器CUDA和GPU驱动
  5. IT项目管理的十六个字心得体会
  6. 稳定高效大型系统架构---集群中间件开发
  7. win10如何修改IP地址
  8. LeetCode 84. 柱状图中最大的矩形(单调递增栈)
  9. 44.分治算法练习:  一元三次方程求解
  10. Java进阶篇设计模式之三 ----- 建造者模式和原型模式
  11. 遥感数字图像处理——第三章——空间域处理方法
  12. 车机芯片:今后买车就像从前配电脑
  13. Python生成n位随机数字字符串
  14. 基于深度学习的三维人体姿态估计
  15. 人、狼、羊、白菜过河问题(广度搜索)
  16. Python-print 函数之换行
  17. 机器学习/算法面试笔记1——损失函数、梯度下降、优化算法、过拟合和欠拟合、正则化与稀疏性、归一化、激活函数
  18. 13 Msql之四种事务隔离界别
  19. [大话设计模式C++版] 第14章 老板回来,我不知道 —— 观察者模式
  20. 计算共形几何是计算机科学和,科学网—《计算共形几何》教程第一章 - 顾险峰的博文...

热门文章

  1. c mysql存储过程实例_MySQL存储过程实例
  2. fftw库 vs2019_FFTW库在VS 2010中的使用方法
  3. mysql报196271错误_超过mysql最大连接的异常
  4. 什么是okr,和kpi的区别在哪里
  5. 一份字节跳动面试官给你的Java技术面试指南,彻底帮你搞懂
  6. 【深度学习】解析神经网络中的数值稳定性、模型初始化和分布偏移(Pytorch)
  7. 【深度学习入门到精通系列】对抗样本和对抗网络
  8. java mysql 删除 博客园_mysql的增删改查
  9. linux切换到顶层命令,一些在Linux下提高工作效率的常用命令
  10. java runnable main_Java 线程类问题写一个线程类MyThread,该线程实现了Runnable接口,写一个main方法, * 用for循...