Rocksdb原理簡介

来源:https://www.cnblogs.com/developer-tianyiyun/archive/2023/05/25/17431343.html
-Advertisement-
Play Games

Rocksdb作為當下nosql中性能的代表被各個存儲組件(mysql、tikv、pmdk、bluestore)作為存儲引擎底座,其基於LSM tree的核心存儲結構(將隨機寫通過數據結構轉化為順序寫)來提供高性能的寫吞吐時保證了讀性能。同時大量的併發性配置來降低compaction的影響。 ...


本文分享自天翼雲開發者社區《Rocksdb原理簡介》,作者:l****n

Rocksdb作為當下nosql中性能的代表被各個存儲組件(mysql、tikv、pmdk、bluestore)作為存儲引擎底座,其基於LSM tree的核心存儲結構(將隨機寫通過數據結構轉化為順序寫)來提供高性能的寫吞吐時保證了讀性能。同時大量的併發性配置來降低compaction的影響。

涉及到的幾個核心文件:

WAL

WriteAheadLog,rocksdb的日誌,保存memtable中的信息。當memtable轉化為immutable memtable並且Flush到L0層之後,之前WAL的會被清理,即於刪除DB目錄下的log文件。

RocksDB中每一次數據的更新都會涉及到兩個結構,一個是記憶體中的memtable(後續會刷新到磁碟成為SST),第二個是WAL。

WAL主要的功能是當RocksDB異常退出後,能夠恢復出錯前的記憶體中(memtable)數據,因此RocksDB預設是每次用戶寫都會刷新數據到WAL。每次噹噹前WAL對應的記憶體數據(memtable)刷新到磁碟之後,都會新建一個WAL。

所有的WAL文件都是保存在WAL目錄(options.wal_dir),為了保證數據的狀態,所有的WAL文件的名字都是按照順序的(log_number)。

MANIFEST

RocksDB中MANIFEST保存了存儲引擎的內部的一些狀態元數據,簡單來說當系統異常重啟,或者程式異常被退出之後,RocksDB需要有一種機制能夠恢復到一個一致性的狀態, 而這個一致性的狀態就是靠MANIFEST來保證的.

MANIFEST在RocksDB中是一個單獨的文件,而這個文件所保存的數據基本是來自於VersionEdit這個結構.

MANIFEST包含了兩個文件,一個log文件一個包含最新MANIFEST文件名的文件,Manifest的log文件名是這樣 MANIFEST-(seq number),這個seq會一直增長.只有當 超過了指定的大小之後,MANIFEST會刷新一個新的文件,當新的文件刷新到磁碟(並且文件名更新)之後,老的文件會被刪除掉。這裡可以認為每一次MANIFEST的更新都代表一次snapshot。

CURRENT

記錄當前最新的MANIFEST文件編號

Memtable

常駐於記憶體中,在WAL寫之後,記錄具體的key-value數據。在RocksDB中,每個ColumnFamily都有自己的Memtable,Column Family之間互不影響。而在RocksDB中Memtable有多種實現,SkipList/HashSkipList/HashLinkList/Vector,預設的實現為SkipList(只有skiplist可以併發插入)。memtable大小以及個數可以由指定的參數進行控制:

write_buffer_size表示memtable的大小

max_write_buffer_number表示記憶體中最多可以同時存在多少個memtable的個數

Immutable memtable

memtable被寫滿之後會生成一個新的memtable繼續接受IO,舊的memtable就會變成immutable memtable,為只讀的狀態,且開始由後臺線程Flush到磁碟的L0層sst。

SST

核心key-value的存儲文件,比如DB目錄下的000023.sst文件。預設分為L0~L7層,當滿足一定條件時(本層sst總大小超過配置大小、WAL文件超過一定值)後臺開啟compaction任務,從當前層和下一層選取若幹sst,做合併,並寫入新的sst文件。

CcolumnFamily
RocksDB 3.0中加入了Column Family特性,加入這個特性之後,每一個KV對都會關聯一個Column Family,其中預設的Column Family是 "default"。Column Family主要是提供給RocksDB一個邏輯的分區。從實現上來看不同的Column Family共用WAL,而都有自己的memtable和SST,同時擁有自己的配置。這就意味著我們可以快速方便的設置不同的屬性的Column Family以及快速刪除對應的Column Family。但是因為Column Family共用WAL,可能會咬住WAL,讓WAL快速增長從而觸發memtable的強制Flush。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JVM(Java虛擬機)是Java程式的運行環境,它可以通過一些系統參數進行配置和優化。以下是一些常用的JVM系統參數: 1. -Xmx: 用於設置JVM堆的最大記憶體大小。例如,-Xmx1g表示將堆的最大大小設置為1GB。 2. -Xms: 用於設置JVM堆的初始記憶體大小。例如,-Xms512m表示 ...
  • 基本數據類型和字元串類型的自動轉換<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ page contentType="text/html;charset=UTF-8" language="j ...
  • [toc] 你好!我是[@馬哥python說](https://www.zhihu.com/people/13273183132),一名10年程式猿,正在試錯用pyecharts開發可視化大屏的非常規排版。 以下,我用8種ThemeType展示的同一個可視化數據大屏,可視化主題是分析**“淄博燒烤” ...
  • 來源:https://www.duidaima.com/Group/Topic/JAVA/11942 ## **1、什麼是狀態機** ### 1.1 什麼是狀態 先來解釋什麼是“狀態”( State )。現實事物是有不同狀態的,例如一個自動門,就有 open 和 closed 兩種狀態。我們通常所說 ...
  • [toc] # 高階函數 高階函數是將函數用作參數或返回值的函數,還可以把函數賦值給一個變數。 所有函數類型都有一個圓括弧括起來的參數類型列表以及一個返回類型:(A, B) -> C 表示接受類型分別為 A 與 B 兩個參數並返回一個 C 類型值的函數類型。 參數類型列表可以為空,如 () -> A ...
  • 本文將為大家詳細講解Java中的Map集合,這是我們進行開發時經常用到的知識點,也是大家在學習Java中很重要的一個知識點,更是我們在面試時有可能會問到的問題。文章較長,乾貨滿滿,建議大家收藏慢慢學習。文末有本文重點總結,主頁有全系列文章分享。技術類問題,歡迎大家和我們一起交流討論! ...
  • # 0.相關確定 本教程使用的版本號為專業版PyCharm 2022.3.2,如果您是初學者,為了更好的學習本教程,避免不必要的麻煩,請您下載使用與本教程一致的版本號。 # 1.PyCharm的下載 官網下載:https://www.jetbrains.com/pycharm/download/ot ...
  • Servlet是web體系裡面最重要的部分,下麵羅列幾道常見的面試題,小伙伴們一定要好好記住哈。 1.Servlet是單例的嗎,如何證明? Servlet一般都是單例的,並且是多線程的。如何證明Servlet是單例模式呢?很簡單,重寫Servlet的init方法,或者添加一個構造方法。然後,在web ...
一周排行
    -Advertisement-
    Play Games
  • 在一些複雜的業務表中間查詢數據,有時候操作會比較複雜一些,不過基於SqlSugar的相關操作,處理的代碼會比較簡單一些,以前我在隨筆《基於SqlSugar的開發框架循序漸進介紹(2)-- 基於中間表的查詢處理》介紹過基於主表和中間表的聯合查詢,而往往實際會比這個會複雜一些。本篇隨筆介紹聯合多個表進行... ...
  • 從按鈕、文本框到下拉框、列表框,WPF提供了一系列常用控制項,每個控制項都有自己獨特的特性和用途。通過靈活的佈局容器,如網格、堆棧面板和換行面板,我們可以將這些控制項組合在一起,實現複雜的界面佈局。而通過樣式和模板,我們可以輕鬆地定製控制項的外觀和行為,以符合我們的設計需求。本篇記錄WPF入門需要瞭解的樣式... ...
  • 以MySQL資料庫為例 # 一. 安裝 NuGet搜索Dapper.Lite並安裝最新版本。 ![](https://img2023.cnblogs.com/blog/174862/202306/174862-20230602155913303-757935399.jpg) NuGet搜索MySql ...
  • # 圖片介面JWT鑒權實現 # 前言 之前做了個返回圖片鏈接的介面,然後沒做授權,然後今天鍵盤到了,也是用JWT來做介面的許可權控制。 然後JTW網上已經有很多文章來說怎麼用了,這裡就不做多的解釋了,如果不懂的可以參考下列鏈接的 文章。 圖片介面文章:[還在愁個人博客沒有圖片放?](https://w ...
  • ![線程各屬性縱覽](https://img2023.cnblogs.com/blog/1220983/202306/1220983-20230603114109107-477345835.png) 如上圖所示,線程有四個屬性: - 線程ID - 線程名稱 - 守護線程 - 線程優先順序 ### 1. ...
  • 本次主要介紹golang中的標準庫`bytes`,基本上參考了 [位元組 | bytes](https://cloud.tencent.com/developer/section/1140520) 、[Golang標準庫——bytes](https://www.jianshu.com/p/e6f7f2 ...
  • 歡迎來到本篇文章!通過上一篇什麼是 Spring?為什麼學它?的學習,我們知道了 Spring 的基本概念,知道什麼是 Spring,以及為什麼學習 Spring。今天,這篇就來說說 Spring 中的核心概念之一 IoC。 ...
  • # 2022版本IDEA+Maven+Tomcat的第一個程式(傻瓜教學) ​ 作為學習Javaweb的一個重要環節,如何實現在IDEA中利用Maven工具創建一個Javaweb程式模版並連接Tomcat發佈是非常重要的。我比較愚鈍(小白),而且自身電腦先前運行過spring或maven的程式,系統 ...
  • 本篇專門扯一下有關 QCheckBox 組件的一個問題。老周不水字數,直接上程式,你看了就明白。 #include <QApplication> #include <QWidget> #include <QPushButton> #include <QCheckBox> #include <QVBo ...
  • # 1.列表數據元素排序 在創建的列表中,數據元素的排列順序常常是無法預測的。這雖然在大多數情況下都是不可避免的,但經常需要以特定的順序呈現信息。有時候希望保留列表數據元素最初的排列順序,而有時候又需要調整排列順序。python提供了很多列表數據元素排序的方式,可根據情況選用。 ## 1.永久性排序 ...