文章目錄
前言
筆者最近在學習一個第三方高效K-V存儲系統RocksDB,相比較於其它類似成熟的存儲系統而言,其中有很多共同之處,不過也有其獨到設計之處。本文是筆者結合RocksDB GitHub上的wiki頁進行的一個匯總整理,也順當是幫助大家對RocksDB內部的整體模塊設計有一個快速的了解。
RocksDB的整體模塊
RocksDB作為一個可嵌入式的持久化存儲系統,它是一個單點高性能的存儲DB,不是我們平常我們說的分布式存儲系統。RocksDB能支持非常高吞吐量的IO讀寫,可以很好地作為大型分布式存儲系統元數據的存儲媒介,比如Hadoop Ozone就將其元數據使用RocksDB作為元數據的結果寫出。
RocksDB有和其它分布式存儲系統類似的術語操作定義,比如WAL(Write-Ahead-Log),Transaction,Compact,Snapshot等等。不同點在於分布式存儲系統需要依賴服務間的RPC通信做WAL的操作,而RocksDB沒有RPC的概念。所以RocksDB本質上來說它是一個可插拔式的存儲引擎選擇。
以下是筆者整理出的RocksDB的整體架構預覽圖:
在上圖中,總共將RocksDB分成了5大子模塊,分別為:
- Basic Operation,基本操作定義
- Terminology,內部術語定義
- Tool,內部工具
- Logging/Monitoring ,日志和監控
- System Behavior,內部系統行為
本文內容篇幅有限,下面我們只對上述部分模塊進行解讀。
RocksDB內部模塊解讀
此節我們對上圖中的部分模塊進行解讀。
Terminology
首先是RocksDB內部的相關術語定義說明,如上圖所示,主要有以下一些術語:
- Write-Ahead-Log File,類似於HDFS JournalNode中的editlog,用於記錄那些未被成功提交的數據操作,然后在重啟時進行數據的恢復。
- SST File,SST文件是一段排序好的表文件,它是實際持久化的數據文件。里面的數據按照key進行排序能方便對其進行二分查找。在SST文件內,還額外包含以下特殊信息:
- Bloom Fileter,用於快速判斷目標查詢key是否存在於當前SST文件內。
- Index / Partition Index,SST內部數據塊索引文件快速找到數據塊的位置。
- Memtable,內存數據結構,用以存儲最近更新的db更新操作,memtable空間寫滿后,會觸發一次寫出更新操作到SST文件的操作。
- Block Cache,純內存存儲結構,存儲SST文件被經常訪問的熱點數據。
Basic Operation
其次是Basic Operation模塊,雖說RocksDB在官網中介紹說是作為主要提供K-V形式的鍵值存儲,但是其內部提供的操作接口絕不僅僅是get,put兩類操作,比如還有如下幾類能適用於特殊使用場景的操作:
- Iteration,RocksDB能夠支持區間范圍內的key迭代器的遍歷查找。
- Compaction Filter,用戶可使用Compaction Filter對key值進行刪除或其它更新操作的邏輯定義,當系統進行Compact行為的時候。
- Creating and Ingesting SST files,當用戶想要快速導入大批量數據到系統內時,可以通過線下創建有效格式的SST文件並導入的方式,而非使用API進行KV值的單獨PUT操作。
- Delete Range,區間范圍的刪除操作,比一個個Key的單獨刪除調用使用更方便。
- Low Priority Write,當用戶執行大批量數據load的操作時但擔心可能會影響到系統正常的操作處理時,可以開啟此屬性進行優先級的調整。
- Read-Modify-Write,這個操作的實際含義是Merge操作的含義,讀取現有鍵值,進行更新(累加計數或依賴原有值的任何更新操作),將新的值寫入到原Key下。 如果使用原始Get/Set API的前提下,我們要調用2次Get 1次,然后再Set 1次,在Merge API下,使用者調用1次就足夠了。
- Transaction,RocksDB內部提供樂觀式的OptimisticTransactionDB和悲觀式(事務鎖方式)的TransactionDB來支持並發的鍵值更新操作。
System Behavior
在RocksDB內部,有着許多系統操作行為來保障系統的平穩運行。
- Compression,SST文件內的數據能夠被壓縮存儲來減小占用空間。
- Rate Limit行為。用戶能夠對其寫操作進行速度控制,以此避免寫入速度過快造成系統讀延遲的現象。
- Delete Schedule,系統文件刪除行為的速度控制。
- Direct IO,RocksDB支持繞過系統Page Cache,通過應用內存從存儲設置中直接進行IO讀寫操作。
- Compaction,數據的Compact行為,刪除SST文件中重復的key以及過期的key數據。
Logging/Monitoring
RocksDB內部有以下的日志監控工具:
- Logger,可用的Logger使用類。
- Statistic / Perf Context and IO Stats Context,RocksDB內部各類型操作的時間,操作數計數統計信息,此數據信息能被用戶用來發現系統的性能瓶頸操作。
- EventListener,此監聽接口提供了一些event事件發生后的接口回調,比如完成一次flush操作,開始Compact操作的時候等等。
Tool
此外,RocksDB還提供以下3大類型的工具
第一類,性能測試工具,
- Benchmark Tool
- Stress Tool,壓力測試工具
第二類,workload模擬工具:
- 用戶數據訪問行為模擬工具
- Workload生成工具
第三類,性能分析工具,DB Analyzer。
綜上所述,就是RocksDB總體框架預覽了,每個模塊的內部其實還是有很多細節設計可以展開討論的,感興趣的同學可閱讀wiki鏈接進行進一步地學習。
引用
[1].https://github.com/facebook/rocksdb/wiki