Page Differential Logging: 頁差分讀寫技術(一)

寫在前面

最近在閱讀到一篇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做綁定呢?

這個鍋,作爲論文閱讀者,我是不背的。作者是那麼說的,也是那麼畫的,那麼你們認爲是誰錯了呢?

故障恢復

總結與思考


這一次先寫到這裏,明天我再把故障恢復和我的思考部分完善。

謝謝閱讀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章