Anti-Caching:一種新型數據庫管理系統架構

1.寫在前面

之前的三篇博文主要介紹了NVM(Non-Volatile Memory)和數據庫相關的內容。NVM因其讀寫性能接近DRAM、可字節尋址、非易失、大容量等特點,在計算機科學的許多領域都具有非常身後的發掘潛力。而我目前研究的數據庫方向只是NVM所應用的一個小小的領域分支而已。

上一篇博客介紹了兩篇論文,它們都是將已有的數據庫系統(或者是將該系統的某種機制)重新實現在NVM架構上,進行一番討論,給出未來的數據庫結合NVM的可能方向。

從啓發性上來講,CMU、BROWN大學和Intel實驗室合作的工作成果具有非常深遠的意義和十分現實的研究價值。

今天,給大家介紹的就是他們三者合力做出的另一個研究,這一研究於2013年發表於數據庫頂會VLDB上,論文鏈接如下:

Anti-caching:A New Approach to Database Management System Architecture,VLDB,2013

2.本週回顧

在深入介紹Anti-caching這篇論文之前,我先來總結下前一週看得相對比較有啓發價值的論文(當然,我並不是只在讀論文)。

第一篇論文是發表於IEEE Computer Society的Survey:How Persistent Memory Will Change Software Systems,它高屋建瓴地總結了Persistent Memory的特性,指出這種內存在諸如File system,Database, virtual memory management等領域的可能應用。對於剛剛瞭解NVM(或者說成是SCM,PM也罷)的研究者來說,是一個具有提綱挈領作用的啓發式論文。
當然,它有一個缺點,就是在每個方向上展開都不豐富也不嚴密,看完之後可能會有走馬觀花的感覺,但是如果你想要了解NVM可能在哪些場景發揮作用的話,建議讀一讀,之後更加細節具體的研究就需要再去查閱更多相關文獻了。

第二篇論文是FPTree: A Hybrid SCM-DRAM Persistent and Concurrent B-Tree for Storage Class Memory,SIGMOD,2016,是一個非常新穎的研究。之前我幾乎沒有看到研究者只針對數據庫中的B+ Tree做持久性方面的優化,但這篇文章就匠心獨運地提出來通過將索引數做成Persistent,concurrent B+ Tree,可以將數據持久化而且與那些易失性樹結構相比,沒有明顯的開銷。它是在傳統的Hardware Transactional Memory基礎上,利用了SCM-DRAM混合架構,引入fingerprinting技術,達到的研究效果。
然而,遺憾的是,對於目前的我來說,這篇論文仍然顯得太過複雜了,主要是它的base knowledge我學習地還不夠。所以也只是大概看了一下的他的工作,技術細節沒法講得清楚。如果哪位研究者對此新成果有興趣且有這方面的知識基礎,相信閱讀這篇論文會有很大的裨益。

第三篇論文就是今天要着重介紹的Anti-caching了,有趣的是Anti-caching本身並沒有跟NVM結合,它是對現有的面向內存的數據庫系統的一種改進(關於memory-oriented的含義待會會進一步介紹)。因此,如果能夠在Anti-Caching的基礎之上,針對NVM的優勢做優化,使之性能更高,也是一個非常有趣且值得一做的嘗試。

3.論文介紹

(1)問題背景

數據庫發展的歷程是以高性能1爲目標的,而基於disk的數據庫系統將磁盤作爲數據的主要存儲設備,只在DRAM上做buffer pool,緩存一小部分熱數據。當transaction來臨時,若數據不在內存中,就必須讀取磁盤,因此磁盤IO成爲了disk-oriented database system2的性能瓶頸。除此之外,面向磁盤的數據庫系統一般採用併發機制來加快transaction執行的速度(多線程訪問),因此在操作過程中可能會有鎖衝突3發生。

隨着DRAM的存儲空間增大,數據庫系統設計者們想到可以將數據遷移到內存中進行,而不再將磁盤作爲數據庫的存儲設備。這就是memory-oriented database system4的基本思想。面向內存的數據庫系統大大提升了transaction執行的速度,也省去了複雜的併發控制開銷與繁重的數據logging。但是面向內存的數據庫系統存在一個不可避免的問題,它的性能只有在數據庫數據量小於可用內存空間大小的時候纔好。一旦內存裝不下整個數據庫,就會發生page fault,當前transaction任務的執行就會終止。
因此一旦數據大小超出內存容量時,作爲任務執行者和操作者就只有兩個選擇:第一是換一個更大容量的物理內存;第二是什麼都不做,看着它的性能跌落會disk-oriented database system。

由於以上兩種數據庫系統各有各的弊端,Anti-caching的研究者試圖構思出一種良好的方案,解決大容量數據與有限空間內存之間的矛盾,從而提升整個數據庫系統的性能。

(2)Anti-Caching系統設計

這裏寫圖片描述
Anti-Caching 系統結構圖如上圖(c)所示,它是基於H-Store5實現的改良版本的內存數據庫系統。它的特點是,在執行transaction之前,仍然像傳統的面向內存數據庫系統那樣把所有數據裝入DRAM中,隨着transaction的執行,數據庫會變得越來越龐大。當數據量超過操作者設定的一個閾值以後,就彈出(evict)冷數據組6到磁盤上。此時數據的存放地點是唯一的,即熱數據都在內存中,冷數據都在磁盤上,不存在某些數據既在磁盤又在內存中的情況。
那麼,我們自然會產生這樣一個問題:如果某個transaction想要訪問被彈出的冷數據,該怎麼辦?
這個時候,數據庫系統會中斷當前的transaction,並開闢一個新線程執行“prepass”過程,來取回冷數據。與此同時,下一個transaction是允許異步執行的。這樣就提高了整體的執行速度。具體的prepass流程比較複雜,但是論文在這一點上是有詳細描述的,流程圖如下所示:
這裏寫圖片描述
如果感興趣的話,建議閱讀該論文的第三部分最後一小節。

整個Anti-Caching的原理概括起來就是這麼簡單,因爲它將冷數據彈出到disk的Block table(也就是Anti-cache)中,這剛好與面向磁盤的數據庫將DRAM作爲數據Cache完全相反,所以這一系統機制的名稱就是Anti-Caching。

(3)性能評測

評測採用的Benchmark依舊是業界標準YCSB與TPC-C。
與Anti-Caching相比較的是另外兩個系統:MySQL與用分佈式cache優化的SQL。H-Store作爲一個面向內存的數據庫系統的Baseline而存在。
性能對比圖如下所示:
這裏寫圖片描述
從上述的性能對比中,可以得出很多有趣的結論:
第一,隨着數據庫數據量的增大,所有系統的性能都發生了下降,這是因爲disk read和write增加的緣故;
第二,隨着skew7的降低,所有的系統性能也都發生了下降,這是因爲訪問evicted data的頻率變高了,需要進行更多的磁盤IO;
第三,對於high skew工作負載,Anti-caching要遠遠好於MySQL,這是因爲一方面H-Store的輕量級併發控制機制(我對此並沒有深入研究)比MySQL的更加高效,另一方面Anti-cahing的細粒度管理使得tuples不會在內存和磁盤中反覆換入換出,大大減少了抖動現象的發生。
關於aLRU與LRU這兩條曲線,其區別在於根據transaction採樣,從而維繫LRU鏈表。aLRU是1%採樣,LRU是100%採樣。從圖上可以看出,aLRU要比LRU性能更高,說明採樣時一種有效節約空間資源的方法,也避免了每次transaction都要重新整理LRU鏈表的過程。

4.我的思考

可以肯定的是,這是一篇非常漂亮的論文,每一個部分的設計都很合情合理,也加入了很多研究者自己構思出的新技術以解決Anti-cahcing機制帶來的新問題。
但是,如果非要概括一下的話,他們的主要貢獻並不是Anti-Caching機制本身,而是“prepass”過程的異步控制transaction執行。因爲傳統的面向內存數據庫系統在內存過載的情況下完全可以直接退化爲Anti-Caching模式,組織冷數據,彈出到disk中,以某種形式(塊,集合,hashmap)存放。

而對於我來說,該汲取Anti-caching機制的哪些優點/特點,爲我所用,並結合NVM的優勢,使性能再進一步提高,纔是重點。
想解決的問題有:在大數據量database的情況下,如何使系統系能具有非線性下降的特性(比如緩慢的亞線性下降)?或者是在low-skew情況下,如何使得系統不至於因爲IO成爲性能瓶頸?

試想,如果將NVM作爲Anti-cache的存放空間,至少IO問題將得到有效緩解,因爲NVM的讀寫性能是2xDRAM-8xDRAM;另一方面,如果將NVM作爲DRAM替代品來使用,Anti-Caching機制也就不再有意義,因爲NVM本身就可以保證大數據量存儲。

那麼是否可以往上一層再考慮一下,如何緩解cache miss的問題?
似乎NVM本身並不能帶來多大的性能改善······
那併發控制和數據一致性保證呢?恢復速度?
NVM可以省去breakpoint的工夫,只做logging即可。

目前似乎還沒有特別清晰的思路,也是在摸索中前進。哪怕只能在現有的系統上做出一點點的改善,哪怕只改善了某一個負載場景下的性能,對我來說也一定是非常有意義的工作。
加油!


  1. 衡量數據庫性能的主要方法是執行OLTP負載,以其每秒鐘執行的transaction數量來評判性能是高是低。
  2. disk-oriented database system,即面向磁盤的數據庫系統,是最早出現的數據庫系統設計。它將全部數據放在磁盤中,隨着transaction的進行,而將熱數據緩存到DRAM中。
  3. 之所以要加鎖,是爲了防止多線程訪問同一數據(比如record)時進行修改造成的數據不一致。
  4. memory-oriented database system,即面向內存的數據庫系統。它在開始執行transaction之前,就將全部數據庫數據加載到內存中,只用disk做logging和breakpoint。
  5. H-Store是一種經典的面向內存的數據庫系統,是由Brown大學開發。它的一個商業實現版本是voltDB。
  6. 冷熱數據的區分是由內存中的維持的一個LRU鏈表來表徵的,表頭是最近不被訪問的數據,表尾是最近最常訪問的數據。這裏的數據不是按塊(block)而是按元組(tuple)來區分的,因此具有細粒度的特點。
  7. skew指的是transaction是否對某些數據有更高的訪問頻度,high skew指大部分transaction只對一小部分數據進行操作,low skew指transaction對數據的訪問比較均勻。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章