內存資料庫

將數據放在內存中直接操作的資料庫

內存資料庫,顧名思義就是將數據放在內存中直接操作的資料庫。相對於磁碟,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁碟上訪問能夠極大地提高應用的性能。內存資料庫拋棄了磁碟數據管理的傳統方式,基於全部數據都在內存中重新設計了體系結構,並且在數據緩存、快速演演算法、并行操作方面也進行了相應的改進,所以數據處理速度比傳統資料庫的數據處理速度要快很多,一般都在10倍以上。內存資料庫的最大特點是其“主拷貝”或“工作版本”常駐內存,即活動事務只與實時內存資料庫的內存拷貝打交道。

簡介


定義:設有資料庫系統DBS,DB為DBS中的資料庫,DBM(t)為在時刻t,DB在內存的數據集,DBM(t)屬於DB。TS為DBS中所有可能的事務構成的集合。AT(t)為在時刻t處於活動狀態的事務集,AT(t)屬於TS。Dt(T)為事務T在時刻t所操作的數據集,
Dt(T)屬於DB。若在任意時刻t,均有:
任意T屬於AT(t) Dt(T)屬於DBM(t)
成立,則稱DBS為一個內存資料庫系統,簡稱為MMDBS;DB為一個內存資料庫,簡稱為MMDB。
常見的例子有MySQL的MEMORY存儲引擎、eXtremeDB、TT、FastDB、SQLite、Microsoft SQL Server Compact等。

技術特點


(1)採用複雜的數據模型表示數據結構,數據冗餘小,易擴充,實現了數據共享。
(2)具有較高的數據和程序獨立性,資料庫的獨立性有物理獨立性和邏輯獨立性。
(3)內存資料庫為用戶提供了方便的用戶介面。
(4)內存資料庫提供4個方面的數據控制功能,分別是併發控制、恢復、完整性和安全性。資料庫中各個應用程序所使用的數據由資料庫統一規定,按照一定的數據模型組織和建立,由系統統一管理和集中控制。
(5)增加了系統的靈活性。

存儲問題


要解決持久性問題,內存資料庫也有相應的解決方案。這其中包括在集群里保存額外的數據副本,然後對資料庫進行橫向擴展,讓系統能夠在運行中不斷將更新數據複製到一個或多個備用系統當中。
一些資料庫系統還會定期將數據複製到磁碟系統,就是為了應對上述突然斷電或系統宕機的情況。當然這時候就要在額外的負載和數據可恢復性方面做出權衡。
由於內存資料庫的風險比傳統OLTP資料庫要大,所以要對它所支撐的應用系統有一個更清楚的認識。目前從整體來看,傳統的OLTP應用系統往往會避免使用內存資料庫技術,它更多地應用在特定的數據類型或者分析應用(包括批處理報表系統)當中,這些系統的數據遠沒有OLTP系統重要。
另一方面也是出於成本預算的考慮,DRAM相比於傳統磁碟甚至快閃記憶體來說都是更昂貴的。

關鍵技術


MMDB除了具有一般資料庫的特徵外,又具有自己的特殊性質,其關鍵技術的實現具有特殊性。
MMDB關鍵技術有:⑴數據結構;⑵MMDB索引技術;⑶查詢處理與優化;⑷事務管理;⑸併發控制;⑹數據恢復。
MMDB不同於DRDB,DRDB技術在內存資料庫中不再適用,要對這些關鍵技術進行新的研究。
存儲性能要求
在許多的資料庫應用系統中,尤其在電話程式控制交換領域,對數據的訪問性能有很高的要求。這類應用一般都有很高的事務量,又要求有很低的事務響應延遲,而且對資料庫的可靠性有很高的要求,例如一個電話交換的應用,每秒鐘會對資料庫有數千個查詢或者更新請求,每個請求要求有低於50毫秒的響應延遲,並且在一年中資料庫只能有數分鐘的停機時間。MMDB系統能夠滿足這些資料庫應用的要求,但是這需要MMDB系統的各個部件在實現方式和策略上,為應用做最大的優化。
存儲方案
MMDB中的存儲模型比DRDB更加靈活。在傳統的MMDB中,為了考慮對內存空間的利用,在系統中專門開闢一塊空間來存放記錄中各個屬性的值,同時,將記錄中屬性值用指針來替換,指針實際指向存儲在堆中的屬性值。這種存儲方案,在使用初期確實節省了大量的內存空間。尤其在記錄中有大量重複值的情況下。並且由於記錄中各個欄位只存放4個位元組長(32位環境下)的指針,因此記錄可以很好的支持變長記錄的存儲,不需要再像DRDB系統中那樣,在記錄頭部存放偏移量來支持變長欄位的存儲。但是這種存儲方案沒有很好的考慮到對處理器緩存的利用。通過指針間接訪問數據,幾乎相當於在內存空間中的隨機訪問,嚴重影響了緩存的利用率。尤其在64位的計算環境不斷普及,內存的容量理論上可以達到無限,同時內存的價格在不斷下降,但是內存的訪問速度仍然沒有達到處理器的速度的情況下。因此。在傳統MMDB系統中,這種利用指針來節省內存空間,卻忽視緩存作用的存儲模式,在現在的應用環境下,反而有點得不償失。
可以說,先進的資料庫應用程序越來越注重對內存的訪問效率,高性能的資料庫系統因而必須最大限度的利用處理器緩存,將可能被用到的數據緩存在多層次的緩存中。數據放置的位置對於緩存的利用優化尤其重要。選擇好的數據存放方案,改進數據分佈的空間局部性,能夠提高對緩存的利用率,提升性能。目前新的數據存儲方案的設計思路集中於對記錄內部各個屬性值的存儲布局做調整,能夠按照需求訪問記錄中的部分屬性,從而消除不必要的內存訪問所帶來的內存延遲。因此,在本文中,提出一種在MMDB系統中使用的數據存儲方法。它仍然在記錄中存放實際的值,但是為緩存的利用做了優化。

數據載入


電信的二次批價和實時累賬是計費系統中的兩個必備功能。所謂二次批價是相對於一次批價來說的。一次批價是按照國家標準資費來進行價格計算,比如: 全球通每分鐘本地通話為0.4元,在一次批價完成後,會根據這個用戶的套餐進行再一次的計算。以北京全球通用戶接聽4分鐘的電話為例,一次批價完成後,這條話單的價格是1.6元,如果這個用戶參加了10元包月接聽套餐,那麼在二次批價后,這次通話的費用就為0元。一次批價是用於各大運營商之間結算的,而二次批價是針對用戶個人的。
實時累賬是將用戶從每月1號到目前為止的所有費用累加起來,也就是用戶目前可以通過10086查到截止到前一天的實時話費。累賬值可以幫助用戶控制高額話費或是供用戶即時查詢消費信息。
二次批價和實時累賬過程涉及用戶資料、用戶套餐等與用戶相關的信息,電信支撐系統在開始批價時必須載入這些數據。稍大一點的省級運營商的這些數據就會超過1000萬條,計費處理模型也由於套餐的組合、產品的組合以及不同的優惠規則變得相當複雜,載入這部分數據對系統而言是一筆不小的開銷,這就使得現在的計費處理速度比較慢,而且很難做到對數據的實時更新。內存資料庫的引入在一定程度上解決了這個問題。
在計費二次批價過程中數據量最大的是詳單數據,這部分數據不用放在內存資料庫中,每處理完一個話單文件或達到設定的提交記錄數時直接操作磁碟資料庫,不會影響系統性能。最急切的是將用戶資料、套餐、營業套餐和計費套餐對應關係數據、計費套餐模型數據及用戶累計數據放到內存資料庫中,這部分數據查詢操作遠比數據新增和更新操作要頻繁。除了這些數據外,當然還有應用需要的其他數據也都可以載入到內存資料庫。
在採用內存資料庫后,用戶通過營業部或客戶查詢實時話費的時候完全可以做到實時,比目前只能提供查詢到前一天的實時話費在業務上有了質的飛躍。因為系統在處理這部分數據時查詢流程和以前的完全一樣,但系統省去了以往內存中的數據和磁碟資料庫數據同步的環節,所以就能做到了實時查詢。對於信控來說也同樣,以往系統在累完賬后要按照一定周期刷新信控數據,這就存在一個時間差,不能夠完全做到實時。
而採用內存資料庫后,信控可以直接取得內存資料庫中的實時話費累計表中的數據,完全實現實時預警、停機。二次批價和累賬中採用內存資料庫后,對防欺詐、收入保障系統也有相當大的好處,這樣能夠充分保證運營商的切身利益。
另外,在採用內存資料庫后,整體提高了系統批價、累賬的處理速度,大大緩解訪問磁碟資料庫的壓力,提高數據查詢、修改、刪除的效率,也為後付費和預付費的融合提供了可能。

數據同步


電信營業數據和計費系統中的數據總是在不斷的變化中,這就涉及內存資料庫中的數據和磁碟資料庫數據的同步問題(為了描述清楚,這裡的磁碟資料庫以Oracle DB為例來說明)。數據同步包括兩部分: 從內存資料庫到Oracle DB數據同步和從Oracle DB到內存資料庫的同步。
Oracle DB到內存資料庫同步
這部分數據同步採用增量表的方式,營業系統或CRM新增或更新的數據將生成到Oracle的增量表中,計費後台程序先到這些增量表中查詢數據。如果能在這些增量表中查到數據就把這些數據更新到內存資料庫對應表中,如果查不到,就直接從內存資料庫中直接查詢,從而保證了數據的完整性和實時性。由於增量表的數據量一般會很小,所以這部分操作不會影響系統的性能。
內存資料庫到Oracle DB同步
由於Oracle的計費後台批價、累賬數據幾乎都載入到了內存資料庫中,所以Oracle資料庫對應的數據表將主要用於對內存資料庫的數據備份。
用戶最新的實時話費等信息都保存在內存資料庫中,實時話費查詢將直接連接到內存資料庫中查詢,保證用戶得到最新的費用信息。信控也直接從內存資料庫查詢數據,因此對Oracle中的這部分數據已經沒有實時性的要求。這時內存資料庫到Oracle的同步可以由應用程序生成文件,定時地往Oracle資料庫中同步備份,或者採用Oracle存儲過程在系統相對空閑時間段進行數據導入就可以了。
內存資料庫與傳統資料庫的異同
傳統的資料庫系統是關係型資料庫,開發這種資料庫的目的,是處理永久、穩定的數據。關係資料庫強調維護數據的完整性、一致性,但很難顧及有關數據及其處理的定時限制,不能滿足工業生產管理實時應用的需要,因為實時事務要求系統能較準確地預報事務的運行時間。
對磁碟資料庫而言,由於磁碟存取、內外存的數據傳遞、緩衝區管理、排隊等待及鎖的延遲等使得事務實際平均執行時間與估算的最壞情況執行時間相差很大,如果將整個資料庫或其主要的“工作”部分放入內存,使每個事務在執行過程中沒有I/O,則為系統較準確估算和安排事務的運行時間,使之具有較好的動態可預報性提供了有力的支持,同時也為實現事務的定時限制打下了基礎。這就是內存資料庫出現的主要原因。
內存資料庫所處理的數據通常是“短暫”的,即有一定的有效時間,過時則有新的數據產生,而當前的決策推導變成無效。所以,實際應用中採用內存資料庫來處理實時性強的業務邏輯處理數據。而傳統資料庫旨在處理永久、穩定的數據,其性能目標是高的系統吞吐量和低的代價,處理數據的實時性就要考慮的相對少一些。實際應用中利用傳統資料庫這一特性存放相對實時性要求不高的數據。
在實際應用中這兩種資料庫常常結合使用,而不是以內存資料庫替代傳統資料庫。
而內存資料庫也分全內存計算和熱內存計算。全內存計算,即數據需要全部裝載到內存中進行計算,對硬體要求高,譬如QlikView等產品。熱內存計算,部分數據載入到內存中即可以進行計算,硬碟和內存會有數據交換來計算未載入的數據,譬如Yonghong Z-Suite。

分類


存資料庫和磁碟資料庫
MMDB與DRDB之間主要區別在於MMDB的主資料庫常駐內存,體系結構設計的優化目標是提高內存和CPU使用效率[6,24]。與DRDB相比,MMDB的優點如下:
完成同樣的功能,所需機器指令大大降低;
事務處理無需I/O,極大提高了系統性能;
不再需要緩衝區管理器,消除了磁碟和內存之間數據拷貝開銷;
在數據組織與管理中,廣泛使用指針,簡化了內存管理,降低了空間開銷。