(一)資料存儲方式的差異
從磁盤資料庫轉變到記憶體資料庫,首先需要考慮的是如何改變資料的存儲方式。對于磁盤資料庫,需要考慮如何使資料的存儲能盡量少地占用磁盤空間。需要讀寫的資料量越小,能獲得更高的磁盤I/O效率。對于記憶體資料庫,畢竟相對于磁盤來說記憶體的價格還是比較昂貴的,是以存儲資料的大小就顯得越發重要了。在磁盤資料庫系統中,區分出經常被通路的資料對象,将這些對象存放在同一個磁盤分區内,可以提高磁盤I/O的效率。磁盤的機械實體特性,适合于讀取順序存儲的資料而對于随機位置資料的讀寫,需要經過耗時的磁盤尋道等I/O時間的等待,磁盤I/O效率就要差很多。在記憶體資料庫中,對于時間的影響就不是那麼嚴重了。相比磁盤,記憶體更加适用于對資料的随機通路。記憶體的通路速度很快,是磁盤通路速度的數十倍。是以,在記憶體資料庫系統中,系統的主要性能瓶頸轉移到資料通路延遲和資料管理算法的處理器消耗上。不少的記憶體資料庫系統都緻力于減少在通路資料時所耗費的處理器時間(包括處理器空等時間和處理器運算時間),甚至在某些情況下,采取用空間換時間的政策,來提升系統的效率。不同的記憶體資料庫,有不同的資料存儲方案。在傳統的記憶體資料庫系統中,記憶體的資料存儲模式設計顯得更加自由,大量使用指針來引導對資料的通路。同時也給應用程式更大的靈活性,可以直接通過指針來通路記憶體資料庫中的資料。在記憶體中通過使用直接指向資料位址的指針,看起來解決了記憶體資料庫中的記錄資料通路上的瓶頸。但是,這也會帶來一些問題。在當今的計算機硬體的架構中,記憶體的通路速度始終滿足不了處理器對資料通路速度的要求,處理器和記憶體之間的緩存(Cache)變得更加重要。對記憶體的随機通路,不能很好地配合緩存的硬體設計。雖然記憶體不像硬碟具有磁頭的尋道和定位等機械因素的牽制,但是随機通路記憶體中的資料,會把多個不同的記憶體塊重複的裝入記憶體和處理器之間的多級緩存中。是以在記憶體資料庫系統的資料存儲方式設計上,不僅要考慮到記憶體通路資料的方式,也要考慮到緩存對記憶體通路的性能影響。
(二)資料通路方式的差異
如今,随着對處理器緩存作用的認識的逐漸加深,記憶體資料庫的資料通路技術的熱點研究方向是在通路的過程中如何利用好處理器緩存,使得性能得到最大優化。人們重新研究過在記憶體資料庫系統中曾普遍使用的索引,例如T樹,發現其對緩存的使用率很差,反而制約了其性能潛力的發掘。是以人們相繼研制出對緩存敏感的索引,例如CSS樹,CSB+樹等。同時多種針對緩存效率的索引優化方法也被使用。
在記憶體資料庫系統中的查詢處理也與磁盤資料庫有所差異。在磁盤資料庫系統上,查詢處理的時間消耗,以磁盤I/O的操作時間為主,而在記憶體資料庫上,因為沒有磁盤I/O的操作,是以處理器的計算時間和緩存的利用成為最主要的開銷。在記憶體資料庫上,有不少特殊的查詢處理方法,例如将表裡面的外鍵值用指向外鍵值的指針來替換。外鍵的值相同就使用相同的指針。這樣在join做操作的時候,可以直接比較外鍵指針,而不是比較外鍵的值,顯然這種方法是比較高效的,特别是外鍵的值是字元串類型的時候。同樣的道理,在物化的中間結果上也隻需要儲存指向實際值的指針,而不必将實際資料拷貝到中間結果表(intermediate table)上。在記憶體資料庫中,join的方法可以不使用歸并排序(sort-merge)的方式,因為歸并排序會帶來處理的負擔并且排序的中間結果也會占用空間。雖然過去有過實驗資料證明基于T樹的歸并join通常比歸并排序join在性能上更好,但是最近的研究結果又表明,如果排序的方法能夠對緩存做優化,歸并排序join在記憶體資料庫上還是有重要位置的。
(三)事務處理方式的差異
在事務處理時,由于記憶體的通路速度比磁盤快,是以,在記憶體資料庫中事務的執行速度通常也較快。在采用基于鎖的并發控制系統中,這意味着鎖的時間不會保持太長,由此在做并發控制時不必像磁盤資料庫那樣時刻注意對鎖的控制和操作。是以,在記憶體資料庫中,對鎖的管理又有些與磁盤資料庫不同的設計思路。比如說,通常系統會通過選擇小的加鎖粒度來減少對鎖的競争。但是在記憶體資料庫系統中,資料已經常駐在記憶體中,并且對該資料上的鎖持有時間又很短,那麼使用低粒度鎖的優點不是那麼明顯了。使用大粒度的鎖例如表級鎖,不僅能簡化鎖管理,也有一些性能上的優勢。在記憶體資料庫中,對整個資料庫加鎖并不是一件不可想象的事情。
對資料庫加鎖使得所有的事務都将串行化執行。串行化執行也有不少的好處:首先,可以消除許多并發控制上的開銷,例如加鎖和放鎖,對死鎖的檢測和處理等;再次,由于事務的串行化執行,使得在執行單個事務的過程中,處理器的緩存上下文無需被切換,可以在事務指令和事務所通路資料的連續性基礎上,更好地利用處理器的指令緩存和資料緩存。因為在并發條件下,當一個事務在等待鎖的時候,需要排程激活另外一個符合執行條件的事務開始執行。原先在處理器緩存中的事務指令和資料都将廢棄,需要重新切換加載新的指令和資料,這将耗費不少的處理器時間。但是,串行化執行在有長事務出現的情況下,就不太實際了。可以考慮使用某種政策,使得短事務能夠和長事務并發執行。在鎖的實作過程中,記憶體資料庫可以在被加鎖的資料對象上使用新的技術。在記憶體資料庫中,存儲在磁盤上的資料對象本身并不帶有任何的鎖資訊。而在磁盤資料庫中,資料對象存儲在記憶體中,我們可以用非常友善而又簡單的方法使得資料對象本身也附帶一些鎖資訊,來标示自身的加鎖狀态。例如,事務在通路資料對象時,不必通過全局的加鎖Hash表來判斷目前資料對象的加鎖狀态,而是直接在通路資料對象時,讀取對象自身的加鎖狀态資訊。如果對象還沒有被加鎖,則事務可以對資料對象進行相應的操作。
(四)記憶體資料庫常用技術
記憶體資料庫的技術包括了記憶體資料庫的恢複處理技術(Recovery)、并發控制技術(Concurrency Control)、存儲與資料組織技術(Storage and Date Organization)、事務送出處理技術(Transaction Processing)、資料遷移技術(Data Migration)、資料通路技術(Data Access)、查詢處理和查詢優化技術(Query Processing and Query Optimization)、負載均衡(Load Balancing)技術等各個方面。其中由于應用程式直接通路資料,資料庫更易受到應用軟體錯誤和系統崩潰等故障帶來的傷害。記憶體資料庫的恢複較之傳統磁盤資料庫要複雜得多,也更為關鍵,恢複部件一定要被恰當地設計、實作和維護。記憶體資料庫恢複系統的設計方法,由于應用領域和設計思路的不同而千差萬别,但它們追求的目标是相同的,都是保持資料庫的一緻性,使資料庫能從故障中快速恢複,且恢複時占用盡量少的時空開銷。由于記憶體資料庫主要基于記憶體,記憶體又具有易失性,存儲在記憶體中的資料出現故障時,很容易導緻資料的丢失,為了防止資料不丢失,就必須在磁盤或者其它非易失性存儲器中儲存它的備份。而資料庫的備份、日志存儲及異常情況下的系統恢複需要執行大量費時的磁盤I/O 操作,這必将成為系統的瓶頸,影響系統正常的事務處理能力,是以,在系統出現故障時,快速、有效地確定資料恢複到一緻性狀态就顯得特别重要。
日志、檢測點和重裝技術是記憶體資料庫故障恢複技術的三大要素。這些技術主要包括恢複處理器(Recovery Processor)、NVRAM、熱備份技術、影子記憶體、影子頁面、預送出、成組送出、模糊檢查點、非模糊檢查點、日志驅動檢查點、部分重載和完全重載等。其中,恢複處理器、NVRAM、熱備份技術在速度和穩定性能上都相當不錯,不足之處在于都需要額外硬體支援。恢複處理器技術就是增加一個CPU,用它專門處理日志、檢查點程序以及系統崩潰後的恢複程序;NVRAM是一種非易失性記憶體,具有記憶體的存儲速度,而且掉電時記憶體中的資料不丢失,日志等資訊刷到NVRAM的速度比刷到磁盤上快很多,事務日志刷到NVRAM就完成送出,具有較快的時間響應性;熱備份技術是用另一台遠端機器作為映像,維持一個資料庫熱備,當資料庫主伺服器崩潰時,這個備份資料庫随時能切換成資料庫主伺服器,確定伺服器正常提供服務。在檢查點方面,有非模糊檢查點、模糊檢查點、日志驅動檢查點三類。模糊檢查點程序不加任何鎖,而且不阻塞事務的正常執行,不足之處在于模糊檢查點更新的資料庫映像無法保證事務一緻性;非模糊檢查點需要對被檢查的資料項加鎖,特别是在大容量記憶體環境下,檢查點操作需要将整個資料庫的髒頁拷貝到磁盤,過程中産生很多磁盤I/O操作,導緻檢查時間消耗比較長,無法支援對事務響應時間要求比較高的應用,但是它們備份出來的資料庫由于滿足事務一緻性,其恢複算法相對簡單。而日志驅動檢查點在檢查的時候,使日志作用于磁盤備份,速度很慢,一般用于遠端備份。重載就是利用資料庫的外存版本和日志檔案恢複記憶體資料庫的過程,它有兩種類型:部分重載和完全重載。它的方法有:順序重載、帶優先級的順序重載和基于優先級的帶存取頻率的重載。
(五)展望
記憶體資料庫是一個與傳統資料庫有着顯著差異的新興方向,應用進展值得關注。當然,最近幾年,一些廠商陸續推出全閃存伺服器和适應閃存架構的資料庫。閃存作為機械硬碟和記憶體之間的一種存儲形态,也展現出了比較大的發展潛力。記憶體資料庫和閃存資料庫未來發展孰優孰劣,還需要經過大量實踐的檢驗。
*本文在撰寫過程中,得到貴州大學李晖教授的指導。
*
參考文獻:
- 王晨,記憶體資料庫若幹關鍵技術研究。
- 袁培森,記憶體資料庫的設計與實作。
- 宋毅,緩存敏感T樹的設計與實作。
- 史習一,在資料清洗過程中基于MMDB的資料比對技術。
- 靳若冰,基于商業資料庫的實時資料庫開發研究。
- 石英偉,分布式實時記憶體資料庫關鍵技術研究與實作。
- 梁智興,記憶體資料庫恢複技術研究。
- 張效尉,王大羽,記憶體資料庫故障恢複政策研究。