RocksDB 7.0.0 已釋出,Facebook 開發的 k-v 儲存系統

2022-03-15 11:00:37

RocksDB 7.0.0 現已釋出,RocksDB 是一個來自 Facebook 的可嵌入的支援持久化的 key-value 儲存系統,也可作為 C/S 模式下的儲存資料庫,基於 LevelDB 構建。 

RocksDB 7.0.0

Bug修復

  • 修復了當啟用 memtable Bloom 過濾器 (memtable_prefix_bloom_size_ratio > 0) 時,批次 MultiGet 可能返回由 DeleteRange 刪除的鍵的舊值的主要錯誤。
  • 修復了更多 EventListener::OnTableFileCreated 呼叫的情況,狀態為 OK,file_size==0,且沒有保留 SST 檔案。
  • 修復了DB::GetMergeOperands().
  • 修復並行事務提交和 memtable 切換導致的 2PC 寫提交事務的資料丟失問題()。
  • 修復了 NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVELNUM_DATA_BLOCKS_READ_PER_LEVEL  NUM_SST_READ_PER_LEVEL 統計資訊,每個級別的每個 MultiGet 批次報告一次。

效能改進

  • 減少了構建線上 LSM 樹一致性檢查所使用的檔案位置雜湊表的開銷,這可以提高某些工作負載的效能(參見)。
  • 切換到使用排序std::vector而不是std::map儲存 blob 檔案的後設資料物件,可以提高某些工作負載的效能,尤其是當 blob 檔案的數量很大時。
  • DisableManualCompaction() 不必等待計劃的手動壓縮線上程池中執行以取消作業。

行為改變

  • 禁止 DBOptions.use_direct_io_for_flush_and_compaction == true  DBOptions.writable_file_max_buffer_size == 0 的組合,這種組合會導致 WritableFileWriter::Append() 永遠迴圈,在直接 IO 中沒有多大意義。
  • ReadOptions::total_order_seek不再影響 DB::Get(),這種互動已經過時,因為 RocksDB 已經能夠檢測當前的字首提取器是否與用於生成表檔案的字首提取器相容。

新特性

  • 引入了BlockBasedTableOptions::detect_filter_construct_corruption在 Bloom Filter (format_version >= 5) 和 Ribbon Filter 構建期間檢測損壞的選項。
  • 改進了 SstDumpTool 以從表屬性中讀取比較器,並使用它來讀取 SST 檔案。
  • 擴充套件了資訊紀錄檔中的列族統計資訊,還會記錄 blob 檔案中的垃圾總量和 blob 檔案空間放大係數,還通過rocksdb.blob-stats DB 屬性公開了 blob 檔案空間放大器。
  • 在 ch 中引入 APIrocksdb_create_dir_if_missing,呼叫底層檔案系統的 CreateDirIfMissing API 來建立目錄。
  • 新增了最後一級和非最後一級讀取統計資訊:LAST_LEVEL_READ_*  NON_LAST_LEVEL_READ_*
  • 實驗性:在 FSRandomAccessFile 中新增對新 API ReadAsync 的支援,以非同步讀取資料,並在 FileSystem 中新增 Poll API 以檢查請求的讀取請求是否已完成。ReadAsync 採用回撥函數。輪詢 API 檢查讀取 IO 請求的完成情況,並應呼叫回撥函數來指示讀取請求的完成。

RocksDB 7.0.1

  • 修復使用 DisableManualCompaction 取消手動壓縮時的競爭條件,DB close 也可以取消手動壓縮執行緒。
  • 修復了 DBImpl::ResumeImpl() 和等待恢復完成的執行緒之間的 versions_ 資料競爭
  • 修復了由重新整理、傳入寫入和拍攝快照之間的競爭導致的錯誤,對使用這些競爭條件建立的快照查詢可能會返回不正確的結果,例如重新顯示已刪除的資料。

7.0.0 版本還有海量公共 API 更改,詳情檢視更新公告:

展開閱讀全文