Page Differential Logging: 页差分读写技术(一)

来源:互联网 发布:黑客入侵网络考勤机 编辑:程序博客网 时间:2024/06/03 17:08

写在前面

最近在阅读到一篇2016年ASPLOS会议论文NVWAL:Exploiting NVRAM in Write-Ahead Logging时,发现它提出使用了differential logging这项技术。我对此感到十分好奇,便google了一下这个术语,发现它的原型是在2010年SIGMOD的一篇文章上Page-Differential Logging: An Efficient and DBMS-independent Approach for Storing Data into Flash Memory。

接下来我想就differential logging的起源和特点来简单地探讨一番,并试图说明这一技术在NVM上应用的可行性。

背景介绍

首先要解决的应该是3个W的问题:What,Why,HoW。什么是differential logging?为什么要使用differential logging?differential logging具体是怎样工作的?

为了故事的连贯性,首先我们来回答呢Why这个问题,即differential logging产生的历史缘由:一定是因为以前的技术不够好,所以研究者才新拟定了一个这样的方案才对。

所以,我们需要了解一下内存写(到flash闪存)的两种历史方案:page-based approach和 log-based approach,也就是基于页的方法与基于log的方法。

基于页的方式,简单来说就是,当修改了内存里data page(一个页)的一部分数据后,整个data page(又称逻辑页)都要写入到Flash作为物理页从而持久存储。这是非常符合直觉的内存写操作,哪一页被修改就将该页写入持久存储区域。根据写入位置的不同,基于页的方法又分为in-place和out-place。所谓in-place,就是指写入Flash过程要覆盖原来物理页面,即覆盖原来的数据;所谓out-place,就是指写入Flash过程不覆盖原来旧的数据页而是新开辟一个位置保存该物理页,并将旧页标记为“obsolete”状态。

由于Flash是一种比较特殊的存储器,flash中写操作不能将page中的bit改为1,因此它的覆盖写(write)操作是需要以块为单位擦除(erase)并执行多次读写才能完成的的,因此in-place方式代价很高,在Flash中并不常用,更多的是使用out-place方式,选择一个新的未使用block中的页作为物理页来写,就不需要多余的擦除操作了。

一个典型的out-place更新方式如下图所示:
这里写图片描述

接下来我们介绍基于log的方式。所谓log,也就是将数据变更的部分记录下来,然后写到Flash中,具体的操作手段是:一旦内存中逻辑页发生变更,就将更新部分写入到write buffer(也在内存中),值得注意的是,一个write buffer里可以存储不止一个逻辑页的更新内容。当write buffer满存或者应用发出write through命令时write buffer中的内容就输出到了Flash中存为log page。那么如果发生多次数据变更,也就会产生多个log page。这样一来,当我们需要读取最新的页数据时,就需要将原始数据页与多个log page中的对应更新合并,提取到内存中,这就涉及到多次read IO操作。一个典型的基于log写的方式如下图所示:
这里写图片描述
这里写图片描述

我们注意到,page-based 方式与 log-based方式在用Flash作为外存存储时都有各自的缺陷:基于页的方法写性能不好,每次修改一个页中的不管多少数据,都需要将整个页写入Flash;基于log的方法解决了基于页方法写性能不高的问题,但是它的读性能不好,因为对同一份物理页的log可能存在于多个log页中,每次读取最新数据都需要读入多个log页数据到内存。

正是基于以上两点,研究者们提出了他们认为的既有较好的读性能,又有较好的写性能的页差分读写技术。

PDL详解

现在我们来解释第二个问题:什么是differential logging?
先上图例,让后结合该图进行解释会方便一些:
这里写图片描述

如上图所示,当逻辑页L1,L2发生变更时,首先需要计算出当前变更数据(计算方式是通过将内存中的逻辑页与闪存中的base page进行比较,计算出差分数据),将关于该页的全部变更数据写入write buffer(当write buffer已存在旧的页更新数据时,删除之),write buffer满或者接到write through指令时,将differential log写入到flash中作为differential page。

和基于log的方式类似,同一个differential page可以存储多个页的差分数据,但是,一个物理页的差分数据仅存在于同一个differential page中,这一点与基于log的方式不同。

这里写图片描述

如上图所示,当需要读取最新的页数据时,需要结合最多两个页面:base page 和 differential page。当differential page中不存在关于当前页的差分数据时,只需要读取一个base page就可以了。

以上就是 page differential logging。

那么进一步地,我们需要回答 How 这个问题。虽然大致逻辑上讲得通,但差分读写技术是凭借什么来辨别base page 和 differential page 的关系的呢?

PDL的数据结构如下图所示:
这里写图片描述
在flash中存储的是base_page 和 differential_page两种数据结构。其中base_page中存有当前物理页数据之外,还存有id编号,页面类型,时间戳;differential_page,相应地,也有id编号(与base_page为绑定关系)。

注意,到这里为止,我们已经发现了一个很不合理的矛盾!一个differential page怎么可能既存储多个逻辑页的差分数据, 同时又只和一个 base_page做绑定呢?

这个锅,作为论文阅读者,我是不背的。作者是那么说的,也是那么画的,那么你们认为是谁错了呢?

故障恢复

总结与思考


这一次先写到这里,明天我再把故障恢复和我的思考部分完善。

谢谢阅读!

0 0
原创粉丝点击