內存數據庫fastdb的使用研究報告

相對於傳統磁盤數據庫,內存數據庫通過將數據完全加載到內存,在內存中實現對數據的管理,在數據同步、數據傳送、事務處理、並行操作等方面進行了相應的改進設計,使得內存數據庫在處理數據上能夠比磁盤數據庫快得多,可以有效地解決計費系統中信控、實時累賬等部分對系統響應要求高的問題。

項目決定在信控模塊使用內存數據庫機制取代賬單中心模式進行實時累賬優惠觸發信控。

以下是對FastDB進行的幾點說明:

【開源代碼鏈接:http://sourceforge.net/projects/fastdb

1、 功能歸納

1內存數據庫具備傳統數據庫的一些基本功能:

A數據的管理,內存數據庫機制是支持永久數據的管理的,包括數據庫的的定義、存儲、維護等功能。

B數據的操作,內存數據庫支持對數據進行增,刪,改,查,數據完整性校驗等一些基本功能。

C事務管理,內存數據庫支持調度,進程間、線程間的一些併發等操作。

d.數據恢復備份機制,內存數據庫支持在線備份和系統崩潰後的自動恢復。

2FastDB在功能上特有的一些特點

A查詢優化,與傳統數據庫管理系統咋紅執行查詢相比,當所有的數據存在於內存當中時,查詢的數度是非常快的,但是FastDB還是進一步使用了索引(hash,T-tree)、反向指針和查詢並行化進行了查詢優化。

B提供了一個靈活方便的應用程序語言接口,能夠方便寫出查詢等語句。

2、工作原理

FastDB是一個高效率的內存數據庫系統,在磁盤上的數據庫文件和使用該數據庫的每一個應用程序佔用的虛擬內存空間相映射,這樣取消了數據文件和緩衝池中的數據傳輸。再將整個文件數據讀入內存,並且使用了高性能的鎖工具實現了只讀模式線程間、單個更改模式線程和多個只讀模式線程間的併發執行。FastDB通過位圖實現對內存進行分配,最小單位塊是分配量子(16字節)。如此大大提高了數據引用的局部性(對象數據儘可能分配在連續的內存區域),最小化了修改頁的數目和減少了事務提交時間。事務提交協議基於一個影子根頁算法,對數據庫執行原子更新操作,恢復效率很高,在存儲數據結構上可以採用T-tree結構(T-treeAVL-tree相似,只是T-tree中每個節點中順序存儲了多個值),對於大量相似重複性數據的查詢性能相當高;也可以採用Hash存儲,這是用關鍵字段定位表中記錄的最好辦法(採用等號進行查詢)。

影子根頁算法概述:FastDB數據庫中每條對象都具有唯一的標識符(OID),用作一個數組(對象索引)的下標,元素值表示對象的一個句柄,在FastDB數據庫中存在兩個索引(當前索引和影子索引),當某個對象第一次被修改時,它會創建一個副本,當前索引中的對象句柄被修改指向副本,影子索引仍然包含一個指向該對象原始版本的句柄。所有更改發生在副本上,FastDB在對象索引的一個特殊位圖頁上標記出哪個索引包含修改過的對象句柄。

當一個事務被提交時,FastDB首先檢查對象索引的尺寸的大小,若增長了,還會重新爲對象索引的影子副本重新分配內存,然後釋放“舊對象”佔用的內存,釋放後,將修改過的所有位圖頁flush到磁盤上,然後FastDB將改變數據庫頭部中的當前對象索引指示符,以切換對象索引的角色。當前對象索引將變成影子索引之後,FastDB 把修改過的所有句柄從新的對象索引中複製到先前是影子的、現在已成爲當前的對象索引中。此時,兩個索引都得到了同步。(具體內存塊的移動索引管理細節需要進一步琢磨)

3、 部署方法

1應用程序編譯環境需求,首先是任何一個FastDB應用程序必須包含頭文件:fastdb.h

然後是可以選擇調用庫文件(FastDB編譯後提供靜態庫(libfastdb_r.a)和共享庫兩種庫(libfastdb_r.so/ libfastdb_r.so.2)給調用);

最後是FastDB提供很多編譯選項接口,用戶可以根據需要進行設置,比如:容錯支持,無盤模式,鎖檢測清理機制等等功能。

2運行系統環境需求,理論上說,內存加載的數據庫文件規模最小是1MB,上限就是內存和磁盤的容量了(FastDB 的整個優化設計是基於真個數據庫系統存放在機器物理內存中,但是它依然支持將應用在規模超過物理內存的數據庫上,只是效率不會很高)

4、接口調用方法

1FastDB提供了subsql交互式工具供用戶進行備份,查詢,監控等。(按着提示走即可)

2C++接口

A打開或創建數據庫:

dbDatabase db(parameter);

db.open(parameter);

mode的有:dbReadOnlydbAllAccessdbConcurrentReaddbConcurrentUpdate四模式

BFastDB支持的數據類型:

類型                     描述

bool                     布爾類型 (true,false)

int1                      一個字節的帶符號整型(-128..127)

int2                      兩個字節的帶符號整型(-32768..32767)

int4                      四個字節的帶符號整型(-2147483648..2147483647)

int8                      八個字節的帶符號整型(-2**63..2**63-1)

real4                    四個字節的ANSI 浮點型

real8                    八個字節的雙精度浮點型

char const*           非中斷整型

dbReference<T>    到類T 的指針。

dbArray<T>          元素類型是T 的動態數組。

CFastDB對錶的接口描述

C++需要用類的形式來定義表結構,然後一一映射到表的fields,如果類有方法就得用宏:   CLASS_DESCRIPTOR(name,field_list),進行描述,還有方法宏TYPE_DESCRIPTOR(field_list)(具體的查看的幫助文檔)

最後只需要將類進行註冊:REGISTER(Class Name);

D遊標

遊標有兩種模式:    dbCursorViewOnlydbCursorForUpdate

定義舉例dbCursor<Class Name> instance (dbCursorForUpdate);

提供了數據庫的改、刪、查方法接口

Instance.udate()

Instance.remove()/removeAllSelected () /removeAll ()

Instance.select()/select(dbquery &q);

Edbquery Q;

Q = “id = ” idvalue,”and datetime = ”,currtime;

F

數據的insert方法FastDB提供了重載

dbReference<T> insert(T const& record);

所以使用起來是很簡單的。

具體細節用法查閱手冊。Hoho。。。

5、改造計劃

暫時不用改造現有機制,如果不想在內存數據庫當中形成綜合賬單表(從原來的賬單中心的四張內存表(累賬賬單表,週期性費用表,優惠結果表,調賬結果表)中提取),減少冗餘,就需要改造其現有的事務提交機制。使得事務提交後,程序能夠控制數據改變對其他進程的可見性。

6、本人的兩點擔心

1FastDB適合主導讀取模式的應用程序,在大規模數據羣處理上,進行更改事務處理的效率和準確性能上有待後查。

2FastDB雖然是一個極其優秀的開源內存數據庫,但畢竟沒有或者很少經過商用的專業的測試。系統中複雜的內存管理過程,可能容易產生過多的內存碎片,導致系統的不穩定。

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