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

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

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
时间: 2024-09-30 02:56:41

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

MongoDB 3.2版WiredTiger存储引擎性能测试

MongoDB 3.2版WiredTiger存储引擎性能测试 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs MongoDB 3.2于最近发布了,它使用WiredTiger作为其默认的存储引擎.这五年来,MongoDB从诞生到流行,发展可谓是相当迅猛. MongoDB 3.0就开始支持"可插拔的存储引擎"功能,因此在3.2版使用WiredTiger也在情理之中.WiredTiger引擎基于B-Tree算法,

MongoDB 数据存储引擎

存储引擎(Storage Engine)是MongoDB的核心组件,负责管理数据如何存储在硬盘(Disk)和内存(Memory)上.从MongoDB 3.2 版本开始,MongoDB 支持多数据存储引擎(Storage Engine),MongoDB支持的存储引擎有:WiredTiger,MMAPv1和In-Memory. 从MongoDB 3.2 版本开始,WiredTiger成为MongDB默认的Storage Engine,用于将数据持久化存储到硬盘文件中,WiredTiger提供文档级别

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

Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4. 页和字段2 5. 数据存取的选择:行存储还是列存储?3 6. 常见的存储引擎3 6.1. 简单类型MyISAM.3 6.2. 复杂类型,支持事务与外键 MySQL存储引擎[InnoDB.3 6.3. InnoDB数据存储结构3 6.4. Memory](Heap) 存储引擎5 6.5. NDBC

mongodb之存储引擎

前言 存储引擎是Mongodb管理数据存储主要的组件,Mongodb支持多种存储引擎,每种存储引擎适合特定的场景 WiredTiger 特性 1. version >= 3.2版本默认存储引擎2. 支持文档级别的并发3. 使用MVCC(MultiVersion Concurrency Control)实现并发控制4. 可以通过快照恢复数据5. 优先写journal日志保证数据落地,单机模式建议开启journal日志6. 支持集合和索引数据压缩7. 使用存储引擎内部缓存和文件系统缓存 适用场景 适

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

1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4. 页和字段2 5. 数据存取的选择:行存储还是列存储?3 6. 常见的存储引擎3 6.1. 简单类型MyISAM.3 6.2. 复杂类型,支持事务与外键 MySQL存储引擎[InnoDB.3 6.3. InnoDB数据存储结构3 6.4. Memory](Heap) 存储引擎5 6.5. NDBCluster分布式存储引擎6 7. other6 7.1.

MongoDB 查看存储引擎

需要登录到具体的主/从节点查询,mongos查询不到 db.serverStatus() 其中有这个 "storageEngine" : {  "name" : "wiredTiger",  "supportsCommittedReads" : true,  "readOnly" : false,  "persistent" : true }, 查看WiredTiger内部缓存到底占用了

MongoDB存储引擎(中)——WiredTiger

上一篇博文介绍了MongoDB的MMAPv1存储引擎,本文接着介绍MongoDB另一个存储引擎--WiredTiger,WiredTiger是在MongoDB3.0版本引入的,并且在MongoDB3.2版本开始成为MongoDB默认的存储引擎.相比较MMAPv1,WiredTiger功能更强大,而且具有更高的性能. 相对于MMAPv1,WiredTiger进行了一系列改进: 1. 文件空间分配方式改进 MMAPv1存储引擎是在数据库级别分配文件的,将每个数据库中所有的集合和索引都混合存储在数据库

mongodb三种存储引擎高并发更新性能专题测试

背景说明 近期北京理财频道反馈用来存放股市实时数据的MongoDB数据库写响应请求很慢,难以跟上业务写入速度水平.我们分析了线上现场的情况,发现去年升级到SSD磁盘后,数据持久化的磁盘IO开销已经不是瓶颈.通过日志分析,线上单次写入(更新)请求大多在数十毫秒这个级别,数据库端观察几个主要的db在繁忙时通常有95%以上的时间在进行锁等待.线上数据库并发很高,接近1000个连接,所以怀疑是并发争用表锁导致性能不足. 我们知道MongoDB的mmap存储引擎一直是库/表级锁,因此任何写操作并发越高锁争

MongoDB存储引擎

MongoDB的存储引擎是一个很重要的组件,负责MongoDB如何在内存和磁盘中存储数据.MongoDB支持多种存储引擎,因为不同的应用场景使用不同的存储引擎可以使MongoDB的性能表现更佳. 从MongoDB3.2开始,MongoDB默认使用WiredTiger存储引擎.它很适合用于高负载的应用,也是官方首选建议使用的存储引擎.WiredTgier存储引擎提供一个文档级别的并发模型,检验点功能和压缩功能.MongoDB企业版本还支持加密功能. MongoDB3.2之前MMAPv1是默认的存储