MongoDB 一个page的生命周期

环境

MacBook Pro

前言

在MongoDB中文社区看到一篇文章时,感觉文章里面的图画的不太对,
所以自己又重新画了下。

是关于MongoDB中一个page的生命周期的图:

在这里插入图片描述

讲解:

1、从page on disk那里开始,数据从磁盘读取到内存(page in memory
2、数据在内存中被修改,此时该page变成了一个脏的page;其将会被reconcile(page updated in memory),什么是reconcile下文会讲
3、evict线程会根据现在cache的使用量,分段扫描一些page(可能是drity pageclean page),进行淘汰,释放cache空间
4、evict线程会把干净page直接丢弃掉,所谓干净的page就是没有发生修改的page
对于脏的page,会对已经reconcilepage丢弃掉。

那么什么是reconcile呢?

reconcile

wiretiger使用的Hazard Pointer,对page刷盘时,其实就是对该页的Hazard Pointer的’写获取’操作,并且在刷盘时保持 原有磁盘上的page不变,直接找一个新的page空间,把内存里page的修改(保存在page的modify_list中)变成磁盘page的结构写入 ,这个page刷盘的过程称为reconcile

Q:我有个疑问,这里到底有没有刷入磁盘中?
A:应该是刷入了
Q:<wt使用的HazardPointer,对page刷盘时,其实就是对该页的HazardPointer的’写获取’操作> — 这句话理解起来非常拗口,到底什么意思?
A : 我觉得应该去掉“对”字,改为:其实就是该页的HazardPointer的’写获取’操作

也可以换种说法:

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

那么什么是Hazard pointer 呢? 疑问真是一个接着一个,哈哈哈

Hazard pointer

Hazard Pointer在WireTiger中的应用

摘自网上一段 话:

Hazard pointer 是怎样应用在 WT 中呢?我们这样来看待这个事情,把内存 page 的读写看做 hazard pointer 的读操作,把 page 从内存淘汰到磁盘上的过程看做 hazard pointer 的写操作,这样瞬间就能明白为什么 WT 在页的操作上可以不遵守 The FIX Rules 规则,而是采用无锁并发的页操作。要达到这种访问方式有个条件就是内存中 page 本身的结构要支持 lock free 访问,这个在剖析 WiredTiger 数据页无锁及压缩一文中介绍过了。从上面的描述可以看出 evict page 的过程中首先要做一次 hazard pointer 写操作检查,而后才能进行 page 的 reconcile 和数据落盘。

这里面提到了一个The FIX Rules 规则这是啥呢?-- 共三条

  • 修改一个 page 需要获得该页的 x-latch lock。
  • 访问一个 page 需要获得该页的 s-latch lock 或者 x-latch lock。
  • 持有该 page 的 latch 直到修改或者访问该页的操作完成 latch unlock。

这篇文章也有提到The FIX Rules规则
MySQL · 引擎特性 · InnoDB mini transation

Hazard Pointer

Hazard Pointer是一个无锁并发技术,其应用场景是单个线程写和多个线程读的场景,大致的原理是这样的,每个读的线程设计一个与之对应的无锁数组用于标记这个线程引用的 hazard pointer 对象。读线程的步骤如下:

读线程在访问某个 hazard pointer 对象时,先将在自己的标记数组中标记访问的对象。
读线程在访问完毕某个 hazard pointer 对象时,将其对应的标记从标记数组中删除。

写线程的步骤大致是这样的,写线程如果需要对某个 hazard pointer 对象写时,先判断所有读线程是否标记了这个对象,如果标记了,放弃写。如果未标记,进行写。

参考地址:
MongoDB WiredTiger 存储引擎cache_pool设计 (上) – 原理篇

WiredTiger实现:一个LRU cache深坑引发的分析

实现无锁的栈与队列(5):Hazard Pointer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值