針對持久記憶體的後寫日誌
後寫日誌
Write behind logging
基本思想
NVM 的優點是可位元組定址、接近記憶體的高效能、順序訪問和隨機訪問差距不大。 2016 年 VLDB 會議上《 write behind logging 》論文專門針對 NVM 設計了一種新的日誌記錄及恢復協議。主要思想是去掉了傳統的 append only 的 redo 和 undo 日誌,但仍然需要保留 undo 資訊用來回滾未提交事務。事務提交前需要將該事務的所有修改強制刷盤,之後在 log 中記錄 commit 標記,即這裡所說的 WBL 。恢復過程中,通過分析 commit 標記將未提交的事務通過 undo 資訊回滾掉。
而這篇論文在這個思想基礎上又進行了一系列優化,下面介紹其機制。首先吐槽一下,這篇論文寫得不是很清晰,理解起來比較困難。下面是深入理解後的機制,有不當地方還望指正。
機制
1、 幾個概念
DTT 表中元組結構 :事務ID+ 表 ID+ 更改位置
資料頁中的元組結構 :
tuple id+trx id+begin commit 時間戳 + end commit 時間戳 + 上個版本號的 tuple ID +data
Cp :該時間戳之後的提交的事務其資料不保證已經持久化到磁碟
2、一個事務操作過程
Begin;
執行操作,修改DRAM 中的資料頁
新增一個元祖到DTT 表中,該元祖不包括插入後的值
Commit :
1 )記錄下各個該事務的提交時間戳 t1
2 )掃描 DTT 表得到該事務相關元組
3 )計算 cp 和 cd 值
4 )將 DTT 表中元組持久化到磁碟,此時元組中加上了提交時間戳 t1
5 )將 cp 和 cd 構成的 WBL 持久化到 NVM
6 )通知完成組提交,釋放 DTT
Rollback :
1 )通過 DTT 中資訊進行回滾。
3、一個事務操作過程圖示
若在trx6 commit 的時間點,系統故障,那麼重啟時從 WBL 日誌檔案中遍歷得到最後一個 WBL 即 {4 ,( 5,100 ) } ,得到活躍的事務為 4 ,大於 5 的事務都未提交。分析到這裡恢復就完成,即可接受新事務。
但是磁碟上的髒資料怎麼處理?會啟用一個單獨的回收執行緒,掃描表中記錄,若記錄的時間戳大於5 ,比如事務 6 的記錄,他是不可見的,即將它回收掉;對於 1,3,2,5 都是可見的,不做處理,對於 4 ,他在組提交未提交的事務連結串列裡,也將它回收掉。
4、缺點及疑惑
1 )文中沒有詳細說明記錄是如何回收的,是後續事務訪問到進行判斷處理,還是說只是另外回收執行緒全部掃描進行判斷。資料量如果特別大的話,掃描的代價豈不是很大?全部掃描完後,才將不用的 WBL 回收掉?
2 )如果在高可用場景下,無法滿足要求,仍然需要相應的 WAL 進行復制
3 )後續的可見性判斷比較複雜,文中沒有詳細說明
原文及參考
http://www.vldb.org/pvldb/vol10/p337-arulraj.pdf
http://mysql.taobao.org/monthly/2019/01/01/
https://github.com/cmu-db/peloton/wiki/Write-Ahead-Logging
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2752849/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 針對Spring MVC的Interceptor記憶體馬SpringMVC記憶體
- Fuzzm: 針對WebAssembly記憶體錯誤的模糊測試Web記憶體
- 持久記憶體程式設計記憶體程式設計
- 針對spring mvc的controller記憶體馬-學習和實驗SpringMVCController記憶體
- 持久記憶體指令(PMDK)簡介記憶體
- Redis持久化——記憶體快照(RDB)Redis持久化記憶體
- 針對Fluent-Bit採集容器日誌的補充
- Redis持久化——AOF日誌Redis持久化
- 日誌導致jvm記憶體溢位相關問題JVM記憶體溢位
- 關於持久記憶體(PMem)你知道多少?記憶體
- JavaScript對記憶體的使用JavaScript記憶體
- 記憶體對齊記憶體
- RabbitMQ持久化機制、記憶體磁碟控制(四)MQ持久化記憶體
- redis的記憶體滿了之後,redis如何回收記憶體嗎Redis記憶體
- GO 記憶體對齊Go記憶體
- 理解記憶體對齊記憶體
- Web 前端開發日誌(三):HTML 節點的記憶體洩露問題Web前端HTML記憶體洩露
- 遊戲記憶體對比普通記憶體區別 遊戲記憶體和普通記憶體相差大嗎?遊戲記憶體
- Redis系列:RDB記憶體快照提供持久化能力Redis記憶體持久化
- 持久記憶體-RDMA讓遠端資料不再遠記憶體
- Redis基礎篇(四)持久化:記憶體快照(RDB)Redis持久化記憶體
- 結構體記憶體對齊結構體記憶體
- C# 記憶體對齊C#記憶體
- ABAP Memory Inspector 裡對動態記憶體物件的記憶體消耗度量方式記憶體物件
- python能讀寫記憶體嗎Python記憶體
- C++手寫記憶體池C++記憶體
- zaq寫入日誌
- Redis基礎篇(三)持久化:AOF日誌Redis持久化
- 記憶體安全週報第104期|微軟釋出了針對121個漏洞的修補程式記憶體微軟
- 虛擬記憶體對 OI 的影響記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- iOS 記憶體位元組對齊iOS記憶體
- C語言記憶體對齊C語言記憶體
- 7.7 實現程式記憶體讀寫記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- SLF4J日誌記錄常見寫法
- 教你更優雅地寫 API 之「記錄日誌」API