記憶體資料庫技術選型

2022-01-10 16:37:01 字數 3777 閱讀 7181

最近一段時間研究了記憶體資料庫,總結了一下,分享給大家。我們先從應用場景說起。

一. 記憶體資料庫的應用場景

二. 業界有哪幾類主流的記憶體資料庫

1. 關係型記憶體資料庫

2. 鍵值對記憶體資料庫

3. 傳統資料庫的記憶體資料庫引擎

還有oracle 的timesten、sap的hana等,這些商業中介軟體不在我們研究的範圍之內。

那麼,傳統資料庫和記憶體資料庫之間是什麼關係?相互補充、珠聯璧合的關係

記憶體資料庫不會獨立於傳統資料庫而單獨存在,因為記憶體是易失的。現在具有持久化功能的記憶體庫,如redis、couchbase等,其持久化功能相較傳統資料庫還較溥弱,持久化效能也不如傳統資料庫。因此,記憶體資料庫在一段時期內,將是傳統資料庫的一種強有力的補充。

如果說傳統資料庫是一支軍隊,那麼記憶體資料庫就是為執行某種特殊任務的特種部隊,不要求功能多,但一定要快速、迅猛。

我們繼續一一對比分析一下上面所述的幾類記憶體資料庫。

三. 業界主流的記憶體資料庫

1. sql server 2016 in-memory oltp

sql server 2016的in-memory oltp,通俗地講,是記憶體資料庫,使用記憶體優化表(memory-optimized table,簡稱mot)來實現,mot駐留在記憶體中,使用 hekaton 記憶體資料庫引擎訪問。在查詢mot時,只從記憶體中讀取資料行,不會產生disk io消耗;在更新mot時,資料的更新直接寫入到記憶體中。記憶體優化表能夠在disk上維護乙個資料副本,該副本只用於持久化資料,不用於資料讀寫操作。  

在記憶體資料庫中,不是所有的資料都需要儲存在記憶體中,有些資料仍然能夠儲存在disk上,硬碟表(disk-based table,簡稱dbt)是傳統的表儲存結構,每個page是8kb,在查詢和更新dbt時,產生disk io操作,將資料從disk讀取到記憶體,或者將資料更新非同步寫入到disk中。

記憶體資料庫將原本儲存在disk上的資料,儲存在記憶體中,利用記憶體的高速訪問優勢實現資料的快速查詢和更新,但是,記憶體資料庫,不僅僅是儲存空間的變化,hekaton 記憶體資料庫訪問引擎實現本地編譯模組(natively compiled),交叉事務(cross-container transaction)和查詢互操作(query interop):

本地編譯模組:如果**模組只訪問mot,那麼可以將該模組定義為本地編譯模組,sql server直接將tsql指令碼編譯成機器**;sql server 2016支援本地編譯的模式有:儲存過程(sp),觸發器(trigger),標量值函式(scalar function)或內嵌多語句函式(inline multi-statement function)。相比於解釋性(interpreted)tsql 模組,機器**直接使用記憶體位址,效能更高。

交叉事務:在解釋性tsql模組中,乙個事務既能訪問硬碟表,也能訪問記憶體優化表;實際上,sql server建立了兩個事務,乙個事務用於訪問硬碟表,乙個事務用於訪問記憶體優化表,在dmv中,分別使用transaction_id 和 xtp_transaction_id 來標識。

查詢互操作:解釋性tsql指令碼能夠訪問記憶體優化表和硬碟表,本地編譯模組只能訪問記憶體優化表。

記憶體資料被整合到sql server關係引擎中,使用記憶體資料庫時,客戶端應用程式甚至感受不到任何變化,dal介面也不需要做任何修改。由於query interop的存在,任何解釋性tsql指令碼都能透明地訪問mot,只是效能沒有本地編譯tsql指令碼效能高。在使用分布式事務訪問mot時,必須設定合適的事務隔離級別,推薦使用read committed,如果發生mssqlserver_41333 錯誤,說明產生交叉事務隔離錯誤(cross_container_isolation_failure),原因是當前事務的隔離級別太高。

2. apache ignite

apache ignite是乙個記憶體資料組織是高效能的、整合化的以及分布式的記憶體平台,他可以實時地在大資料集中執行事務和計算,和傳統的基於磁碟或者快閃儲存器的技術相比,效能有數量級的提公升。

可以將ignite視為乙個獨立的、易於整合的記憶體元件的集合,目的是改進應用程式的效能和可擴充套件性。

data grid:ignite記憶體資料網格是乙個記憶體內的鍵值儲存,他可以在分布式集群的記憶體內快取資料。 它通過強語義的資料位置和關係資料路由,來降低冗餘資料的雜訊,使其可以節點數的線性增長,直至幾百個節點。 ignite資料網格速度足夠快,經過官方不斷的測試,目前,他是分布式集群中支援事務性或原子性資料的最快的實現之一。

sql grid:記憶體sql網格為apache ignite提供了分布式記憶體資料庫的功能,它水平可擴充套件,容錯並且相容sql的ansi-99標準。 sql網格支援完整的dml命令,包括select, update, insert, merge以及delete。 同時支援分布式sql join關聯

彙總一下,apache ignite的功能特性:

從以上的apache ignite的特性看,它就是乙個關係型的記憶體資料庫。貌似在這個領域,apache ignite做的非常好。這一點非常符合我們技術選型的需要!一句話:

可以像運算元據庫一樣,操作記憶體快取!

3. fastdb

fastdb是高效的關係型記憶體資料庫系統,具備實時能力及便利的c++介面。fastdb針對應用程式通過控制讀訪問模式作了優化。通過降低資料傳輸的開銷和非常有效的鎖機制提供了高速的查詢。對每乙個使用資料庫的應用資料庫檔案被影射到虛擬記憶體空間中。因此查詢在應用的上下文中執行而不需要切換上下文以及資料傳輸。fastdb中併發訪問資料庫的同步機制通過原子指令實現,幾乎不增加查詢的開銷。

fastdb的特點:

缺點:

4. redis&memcached

redis和memcached,從本質上看,都屬於key-value記憶體資料庫,redis無論從穩定性、效能和功能上都要強於memcached。

nosql結構設計,不支援關係型資料結構。

redis我們已經大規模應用了,本次技術選型的重要在於關係型記憶體資料庫上,所以,redis和memcached不作深入研究和討論。

初步的選型總結:

從需求和功能滿足度上看:apache ignite 最滿足我們的需求,從apache ignite的特性看,它就是乙個關係型的記憶體資料庫。貌似在這個領域,apache ignite做的非常好。這一點非常符合我們技術選型的需要!一句話:

可以像運算元據庫一樣,操作記憶體快取!

先放出兩張圖給大家:

周國慶2017/8/25

資料庫選型

資料處理大致可以分成兩大類 聯機事務處理oltp on line transaction processing 聯機分析處理olap on line analytical processing 1 oltp是傳統的關係型資料庫的主要應用,主要是基本的 日常的事務處理,例如銀行交易。oltp 系統強調...

資料庫選型

mysql 是乙個最流行的關係型資料庫,在網際網路產品中應用比較廣泛。一般情況下,mysql 資料庫是選擇的第一方案,基本上有 80 90 的場景都是基於 mysql 資料庫的。因為,需要關係型資料庫進行管理,此外,業務存在許多事務性的操作,需要保證事務的強一致性。同時,可能還存在一些複雜的 sql...

mysql資料庫技術選型 MySQL 選擇資料庫

mysql 選擇資料庫 在你連線到 mysql 資料庫後,可能有多個可以操作的資料庫,所以你需要選擇你要操作的資料庫。從命令提示視窗中選擇mysql資料庫 在 mysql 提示視窗中可以很簡單的選擇特定的資料庫。你可以使用sql命令來選擇指定的資料庫。例項以下例項選取了資料庫 w3cschool r...