記憶體資料庫解析與主流產品對比(一)
作者:實驗室小陳/大資料開放實驗室
8月26日,星環邀請來自華東師範大學軟體工程學院的博士生導師宮學慶教授帶來《資料庫前沿技術系列講座》,分享資料庫業內前沿發展和研究熱點。現將宮學慶教授的培訓第一講內容:記憶體資料庫的技術發展分享給大家 。
— 基於磁碟的資料庫管理系統 —
伴隨著技術的發展,記憶體已經越來越便宜,容量也越來越大。單臺計算機的記憶體可以配置到幾百GB甚至TB級別。對於一個資料庫應用來說,這樣的記憶體配置已經足夠將所有的業務資料載入到記憶體中進行使用。雖然大資料處理的資料量可能是PB級別的,但那些資料一般是非結構化的資料。通常來講,結構化資料的規模並不會特別大,例如一個銀行10年到20年的交易資料加在一起可能只有幾十TB。這樣規模的結構化資料如果放在基於磁碟的DBMS中,在面對大規模SQL查詢和交易處理時,受限於磁碟的I/O效能,很多時候資料庫系統會成為整個應用系統的效能瓶頸。
— 緩衝區管理方式 —
基於磁 盤的資料庫管理系 統中的資料訪問示例
傳統DBMS中的記憶體地址對映
對於傳統基於磁碟的DBMS而言,即使記憶體緩 衝區足夠大,可以將所有資料載入到記憶體中,但訪問資料過程中的地址對映和轉換依然存在,只是省掉了將資料塊從磁碟載入到記憶體的開銷。即使資料已經全部被載入到記憶體,基於磁碟的DBMS效能上與記憶體資料庫相比還是有很大差距,這是其中一個重要的原因。
總結來看,基於磁碟的DBMS和記憶體資料庫在實現技術上一個重要區別是:在訪問資料時,基於磁碟的DBMS需要透過地址對映將資料在磁碟上的地址轉換成在記憶體中地址,而記憶體資料庫在設計上則是直接使用資料在記憶體中的地址 。
— 事務AC ID屬性保證 —
-
併發控制
記憶體資料庫在訪問資料時也需要加鎖,但和基於磁碟的DBMS不同,鎖和資料在記憶體中是存放在一起的,通常是將鎖資訊儲存在資料記錄Header中。為什麼基於磁碟的DBMS要單獨將鎖資訊放在Lock Table中,而記憶體資料庫就可以把鎖資訊和資料存放在一起呢?因為在基於磁碟的DBMS中,資料塊是有可能被系統從記憶體緩衝區中替換到磁碟上,如果鎖資訊和資料放在一起,一旦資料塊被替換出去,Lock Manager和所有事務都無法獲得關於資料的鎖資訊。所以說對於傳統基於磁碟的DBMS來講,鎖要單獨維護在記憶體中,且需要始終保持在記憶體中,不能被替換出去。而對於記憶體資料庫來說,不存在這樣的場景。
實際上,資料庫管理系統中有兩種鎖機制,分別被稱為Lock和Latch,目的都是為了保護資料的一致性不被併發訪問所破壞。Lock機制是對資料庫邏輯內容的保護,一般來說擁有持續時間長,通常是事務執行的整個過程;並且Lock機制要支援事務的回滾以撤銷事務對資料修改。而Latch機制是為了保證記憶體中特定的資料結構不會因為併發訪問而導致錯誤,比如在多執行緒程式設計時有一個共享佇列發生插入、刪除等操作時,需要Latch保證操作過程中的佇列不受其他執行緒的干擾。Latch的保持時長與操作有關,本次操作做完就結束,同時也不需要支援對資料修改的回滾。
所以傳統DBMS如果要對緩衝區中的一個Page做操作則需要加Latch;如果是修改資料庫的內容則需要加Lock,單獨放在Lock Table維護和管理。下圖是對Lock和Latch的一個簡單對比 。
-
Logging 和 Recovery
資料庫管理系統中,Logging和Recovery機制是日誌來保證事務的原子性和永續性的方式。原子性意味著一個事務中的所有操作必須同時成功或者撤銷,在執行一半做不下去時,可以按照日誌進行回滾;永續性意味著資料如果丟失,可以根據日誌來進行恢復。
在傳統 DBMS的L ogging和Recovery中,最重要的概念是WAL(Write-Ahead Log)——預寫式日誌。 WAL是指系統中所有更新操作都有對應的日誌,而在日誌沒有落盤前,對資料的修改不 允許落盤 。 系統中每條日誌都有一個LSN號(Log Sequence Number),所有的LSN號單調遞增,日誌落盤的過程是向磁碟的連續寫(順序寫)。但 如果系統嚴格按照一條日誌對應一條操作,日誌落盤後馬上將操作對資料的更新結果落盤,那麼系統效能會受到很大影響。所以,大多數的DBMS會採用 Steal + No Force的緩衝區管理策略。 Steal是指DBMS可以將未提交事務的更新刷到磁碟,不必等事務提交時再把更新刷到磁碟,提高了系統刷盤的靈活性和效能; 如果在事務未提交時發生crash,由於更新可能已經寫到磁碟,這時就需要透過對日誌的undo操作進行回滾。 No Force是指在事務已經提交後,對資料的更新可以依然存放在記憶體緩衝區中不寫入磁碟,在合併其他事務的更新後再一次性寫入磁碟,為系統提供最佳化空間。 但No Force可能帶來的風險是: 如果事務已經成功提交但更新沒有寫到磁碟,此時出現crash,則仍然在記憶體中的資料更新就會丟失,需要根據已經寫到磁碟的日誌(事務成功提交的前提是其所有日誌都必須已經落盤)進行redo操作。
有了WAL和Steal + No Force機制後,就可以給基於磁碟的DBMS提供最大的靈活性,來最佳化磁碟I/O。但對於記憶體資料庫而言,所有的資料放在記憶體裡,是否還需要這個機制呢?可以明確的一點是,記憶體資料庫還是需要Logging的,但和基於磁碟的DBMS有所區別,在日誌中只記載redo操作所需的資訊,不記載undo所需的資訊。 大家可以想一下這是為什麼?另一方面,記憶體資料庫在Logging過程中不記錄關於索引的更新,只記錄對於基礎表的更新,那Logging過程中所需寫盤的內容就少了很多。而在記憶體資料庫出現故障需要恢復時,首先從磁碟上儲存的檢查點(Check Point)資料和日誌中恢復基礎表,然後在記憶體中重新構造索引。
— 面向磁碟的DBMS效能開銷 —
— 記憶體資料庫技術歷史發展 —
-
1984年 - 1994年
-
1994年 - 2005年
-
前兩階段小結
DBMS歷史技術總結
— 資料庫系統的現代化發展
—
-
去掉傳統的緩衝區機制 : 傳統的緩衝區機制在記憶體資料庫中並不適用,鎖和資料不需要再分兩個地方儲存,但仍然需要併發控制,需要採用與傳統基於鎖的悲觀併發控制不同的併發控制策略。 -
儘量減少執行時開銷: 磁碟I/O不再是瓶頸,新的瓶頸在於計算效能和功能呼叫等方面,需要提高執行時效能。 -
採用編譯執行方式: 傳統資料庫多采用火山模型執行引擎,每一個Operator都被實現為一個迭代器,提供三個介面:Initial、Get-Next、Closed,從上往下依次呼叫。這種執行引擎的呼叫開銷在基於磁碟的資料庫管理系統中不佔主要比重(磁碟I/O是最主要瓶頸),但在記憶體資料庫裡可能會構成瓶頸。假設要讀取100萬條記錄,就需要呼叫100萬次,效能會變得難以忍受,這就是記憶體資料庫中大量採用編譯執行方式的原因。直接呼叫編譯後的機器程式碼,不再需要執行時的解釋和指標呼叫,效能會有效提升。 -
可擴充套件的高效能索引構建: 雖然記憶體資料庫不從磁碟讀資料,但日誌依然要寫進磁碟,需要考慮日誌寫速度跟不上的問題。可以減少寫日誌的內容,例如把undo資訊去掉,只寫redo資訊;只寫資料但不寫索引更新。如果資料庫系統崩潰,從磁碟上載入資料後,可以採用併發的方式重新建立索引。只要基礎表在,索引就可以重建,在記憶體中重建索引的速度也比較快。
— 本文小結 —
本篇主要介紹了基於磁碟的資料庫管理系統與記憶體資料庫管理系統在幾個實現方面存在的主要異同,以及記憶體資料庫從1984年開始到現在的技術發展。後面會繼續分享關於記憶體資料庫技術的發展,從資料組織、索引、併發控制、編譯查詢和持久化角度出發,介紹並對比幾款主流記憶體資料庫產品的實現技術。
注 :本文部分材料來自於:
1. VLDB 2016會議上的現代主存資料庫系統教程(Modern Main-Memory Database Systems Tutorial)
2. CMU(卡耐基梅隆大學)Andy Pavlo教授的高階資料庫系統(Advanced Database Systems)課程
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69994106/viewspace-2754512/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 記憶體資料庫解析與主流產品對比(二)記憶體資料庫
- 記憶體資料庫解析與主流產品對比(三)記憶體資料庫
- 2020主流國產BI產品對比
- 磁碟資料庫與記憶體資料庫的特點比較資料庫記憶體
- 資料儲存加密的主流方案對比與難點解析加密
- 主流資料庫比較資料庫
- 【記憶體資料庫】TimesTen記憶體資料庫
- 記憶體資料庫如何發揮記憶體優勢?記憶體資料庫
- 關聯式資料庫與文件資料庫對比資料庫
- 【大頁記憶體】Oracle資料庫配置大頁記憶體記憶體Oracle資料庫
- 遊戲記憶體對比普通記憶體區別 遊戲記憶體和普通記憶體相差大嗎?遊戲記憶體
- 國產資料庫oceanBbase,達夢,金倉與mysql資料庫的效能對比 六、python讀mysql資料庫資料庫MySqlPython
- 國產資料庫oceanBbase,達夢,金倉與mysql資料庫的效能對比 七、python讀oceanBase資料庫資料庫MySqlPython
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- Oracle - 資料庫的記憶體調整Oracle資料庫記憶體
- 瀚高資料庫記憶體結構資料庫記憶體
- 關於軟體的程式碼混淆的產品對比與分析
- DDR4記憶體頻率2400和3000的區別 高頻記憶體與低頻記憶體效能效能對比記憶體
- 國產資料庫oceanBbase,達夢,金倉與mysql資料庫的效能對比 九、python讀金倉資料庫資料庫MySqlPython
- 國產資料庫oceanBbase,達夢,金倉與mysql資料庫的效能對比 八、python讀達夢資料庫資料庫MySqlPython
- 資料庫新兵:分散式實時分析記憶體資料庫eSight資料庫分散式記憶體
- 嵌入式產品常見記憶體概念記憶體
- 資料庫實現原理#6(共享記憶體)資料庫記憶體
- 分析師解讀記憶體資料庫MemSQLSP記憶體資料庫SQL
- 南大通用極速記憶體資料庫記憶體資料庫
- 去O路上的歷程--開源分散式資料庫產品對比(TBase VS AntDB)分散式資料庫
- 對PDM產品資料管理應用與發展
- [20210803]對比transparent hugepage的記憶體消耗.txt記憶體
- Netty原始碼解析 -- 記憶體對齊類SizeClassesNetty原始碼記憶體
- 常用MQ產品的對比MQ
- APM呼叫鏈產品對比
- 直播強勢來襲:Oracle nologgiing;資料庫上雲;國產資料庫比對Oracle資料庫
- Netty原始碼解析 -- 記憶體池與PoolArenaNetty原始碼記憶體
- 雲時代,MySQL到ClickHouse資料同步產品對比推薦MySql
- 手寫一個業務資料比對庫
- 主備資料庫狀態手工比對(一)資料庫
- 國產資料庫oceanBbase,達夢,金倉與mysql資料庫的效能對比 四、python讀mysql寫入達夢資料庫資料庫MySqlPython
- 國產資料庫oceanBbase,達夢,金倉與mysql資料庫的效能對比 五、python讀mysql寫入金倉資料庫資料庫MySqlPython