(一)數據存儲方式的差異
從磁盤數據庫轉變到內存數據庫,首先需要考慮的是如何改變數據的存儲方式。對於磁盤數據庫,需要考慮如何使數據的存儲能儘量少地佔用磁盤空間。需要讀寫的數據量越小,能獲得更高的磁盤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的數據匹配技術。
- 靳若冰,基於商業數據庫的實時數據庫開發研究。
- 石英偉,分佈式實時內存數據庫關鍵技術研究與實現。
- 樑智興,內存數據庫恢復技術研究。
- 張效尉,王大羽,內存數據庫故障恢復策略研究。