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
  • 前言 JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用 JWT 在用戶和伺服器之間傳遞安全可靠的信息。一個 JWT 實際上就是一個字元串,它由三部分組成,頭部、載荷與簽名。前兩部分需要經過 Base64 編碼,後一部分通過前兩部分 Base64 編碼後再加密而成。針對 ...
  • 一:背景 1. 講故事 今天本來想寫一篇 非托管泄露 的生產事故分析,但想著昨天就上了一篇非托管文章,連著寫也沒什麼意思,換個口味吧,剛好前些天有位朋友也找到我,說他們的拍攝監控軟體卡死了,讓我幫忙分析下為什麼會卡死,聽到這種軟體,讓我不禁想起了前些天 在程式員桌子上安裝監控 的新聞,參考如下: 我 ...
  • 文章目錄 介紹 ABP的依賴註入系統是基於Microsoft的依賴註入擴展庫(Microsoft.Extensions.DependencyInjection nuget包)開發的。所以我們採用dotnet自帶的註入方式也是支持的。 由於ABP是一個模塊化框架,因此每個模塊都定義它自己的服務併在它自 ...
  • 前言 外觀模式,英文名稱是:Facade Pattern。我們先從名字上來理解一下“外觀模式”。我看到了“外觀”這個詞語,就想到了“外表”這個詞語,兩者有著很相近的意思。就拿談戀愛來說,“外表”很重要,如果第一眼看著很舒服、有眼緣,那就有交往下去的可能。如果長的“三寸釘、枯樹皮”,估計就夠嗆了。在這 ...
  • 模擬.NET實際應用場景,綜合應用三個主要知識點:一是使用dnSpy反編譯第三庫及調試,二是使用Lib.Harmony庫實現第三庫攔截、偽造,三是實現同一個庫支持多版本同時引用。 ...
  • 通過strimzi部署的kafka集群,如何部署prometheus+grafana去監控呢?官方文檔信息量太大,即便照著做也可能失敗,這裡有一份詳細的保姆級操作指南,助您成功部署監控服務 ...
  • 在工具類中封裝getBean,使用哪個介面來實現 實事上,在工具類中,實現BeanFactoryPostProcessor和ApplicationContextAware介面後,使用它們構造方法里的對象ConfigurableListableBeanFactory和ApplicationContex ...
  • 1章:系統基礎信息模塊詳解 通過第三方模塊獲取伺服器的基本性能、塊設備、網卡介面、網路地址庫等信息。 1.1 系統性能模塊psutil:獲取系統性能信息、記憶體信息、磁碟信息、網路信息、用戶信息等。 1.2 IP地址處理模塊IPy: 處理IP地址,網段等。 1.3 DNS處理模塊dnspython: ...
  • EasyExcel動態表頭導出(支持多級表頭) 在很多業務場景中,都會應用到動態表頭的導出,也會涉及到多級表頭的導出,如下圖所示 通過EasyExcel,我們可以快速實現這一需求,具體代碼如下 DynamicHeader import java.util.List; /** *@Author: <a ...
  • 基於java線上婚紗定製系統設計與實現,可適用於線上婚紗攝影預定系統,基於web的婚紗影樓管理系統設計,基於web的婚紗影樓管理系統設計,婚紗攝影網系統,婚紗攝影網站系統,婚紗攝影網站系統,婚紗系統,婚紗管理系統等等; ...