OceanBase的存儲架構與傳統LSM-Tree架構的異同|OceanBase數據轉儲合并技術解讀(二)

前篇博文將OceanBase的存儲架構巧妙地與自然界中的“水生態”進行了類比,今日我們轉變視角,聚焦在與擁有相同LSM-Tree架構的其他產品的比較,深入探討OceanBase相較于它們所展現出的獨特性能。

?眾所周知,OceanBase數據庫的存儲引擎是以LSM-Tree架構為基礎的。相較之下,傳統的LSM-Tree結構在層次化存儲方面往往表現得更為明顯,而OceanBase的LSM-Tree實現則在此基礎上有其獨特之處

我們以業界經典的LSM-Tree實現案例為例--單機存儲引擎LevelDB:其數據流向和OceanBase數據庫是類似的,數據會從可寫的Activate Memtable->只讀的Immutable Memtable->L0?->L1?->...->Ln?。磁盤數據被從上到下分成了多個層次,越下層的數據越舊。同時,在寫入內存前,數據會先追加寫入寫前日志(WAL)中。

?LevelDB中只讀的內存數據通過Flush過程被下刷到磁盤,并按照鍵的順序以SSTable文件的形式存儲。L0層的SSTable文件間存在數據范圍的重疊,每個SSTable文件可以被認為是一個sorted run(一個有序的集合,集合內每個元素唯一)。而L0層以下的每一層SSTable文件是有序不重疊的,也就是說,每一層的多個SSTable文件共同構成了一個sorted run。每層的SSTable文件會通過compact過程向下一層移動,每一次compact過程會涉及到相鄰兩層多個數據范圍重疊的SSTable文件。這些SSTable文件的數據會重新進行排序與合并,形成一個新的SSTable文件。隨著從上到下層數的增加,每層的可容納SSTable文件總數據量會成倍數增長。

?對于這樣的分層結構,我們很容易注意到其中存在的幾個問題:

  • 讀放大
    • LSM-Tree的讀操作需要從新到舊層層查找,這個過程可能需要多次I/O,放大了讀盤次數。
  • 空間放大
    • 磁盤數據都是只讀的,大量冗余和無效數據會占用額外的存儲,放大了磁盤空間。
  • 寫放大
    • 磁盤數據的有序整理不可避免的帶來了額外的寫入。

所謂的compact過程通過將層級之間的數據進行合并、清理無效的數據、減少上下層級有范圍重疊的SSTable文件數量,改善了讀放大與空間放大的問題,但由于增加了額外的磁盤寫操作,引入了額外的寫放大問題。

?為了權衡這三者,不同的實現者通常會采用不同的compact策略:

  • size-tiered compaction
    • 每層有多個大小相近的sorted runs,當某一層的數據總量達到限制后將整層合并,刷寫到下一層成為一個更大的sorted run,直到最大的一層維護一個sorted run。這種方式對全局有序的要求最小,可以最大程度的減少寫放大。但由于數據冗余度可能較大,讀放大和空間放大問題較為嚴重。
  • leveled compaction
    • 每層一個sorted run,層級之間維持相同的數據倍數比,層級越高數據量越多。每層的數據量達到限制后與下一層進行合并。通常每個sorted run被劃分為多個SSTable文件,以提供了更精細化的合并任務的拆分與控制。這種compact方式將相鄰層級的多個SSTable降為一個,減小了讀放大和空間放大。但由于compact時最差情況可能涉及下一層級的所有SSTable文件,寫放大相對更大。
  • tiered+leveled compaction
    • 結合了size-tiered和leveled的compact方式,某些層包含多個sorted runs,某些層只有一個sorted run。

不難看出,LevelDB采用的是tiered+leveled的compact方式,其中L0層包含了多個sorted runs,其余層只有一個sorted run,但從compact的流程來說,L0層的多個sorted runs在合并到下一層的過程里會選擇L1層有數據范圍重疊的SSTable文件,更接近于leveled compaction的形式。

?在了解完傳統LSM-Tree架構的實現與相關知識后,我們通過下圖簡單回憶一下上篇博客講到的OceanBase的存儲架構。可以看到,OceanBase和LevelDB單機存儲引擎的數據流轉方向是近乎一致的,這也是同為LSM-Tree架構的顯著相同點:數據都是先追加寫到日志,再寫入內存;內存都分為可寫的與只讀的兩部分,通過凍結可寫部分來生成只讀部分,通過將只讀部分下刷到磁盤形成持久化只讀數據。

?而兩者的不同點主要集中在為了權衡讀放大、寫放大和空間放大所做的磁盤只讀數據的組織和管理上。

?LevelDB的每個SSTable是一個獨立的文件,通過以多個SSTable文件組成一個sorted run的形式來細分每次compact操作;而為了能夠有效減小寫放大和空間放大,OceanBase希望沒有修改過的數據不要進行重寫,因此OceanBase將所有數據統一存儲在一個文件(data_file)上,以定長塊(宏塊)的形式來分配和使用data_file的空間,每個SSTable由多個不連續的宏塊組成,沒有修改過的宏塊能夠在compact時直接重用。這種組織方式上的差異性進一步讓OceanBase和LevelDB有了一些區別:

  • Level的磁盤數據通常具有比較明顯的層級劃分,每層數據量的上限從上到下逐級增大,L0層由多個SSTable文件組成,每個SSTable文件是一個sorted run,L0層以下的每層都是一個sorted run,由一個或多個SSTable文件組成;如果以層級來劃分OceanBase的磁盤數據的話,可以被認為有三層,由于有宏塊這一細粒度有序集的存在,OceanBase中的L1層與L2層并不需要細分為多個SSTable,而是直接通過一個SSTable來組成sorted run。

?從compact的角度來說,OceanBase也和LevelDB不一樣。為了更好的控制寫放大,OceanBase既可以通過tiered類型的compact過程將若干個Mini SSTable合成一個Mini SSTable,也可以通過leveled類型的compact過程將若干個Mini SSTable和一個Minor SSTable合成一個新的Minor SSTable。同時,為了最大程度的減小讀放大與空間放大,OceanBase會定期進行full compact過程,將所有SSTable合成一個新的Major SSTable。由于該過程通常被放在業務低峰期,資源的大量占用被認為是可接受的。

?另一方面,從具體的一些實現上來說,LevelDB的MemTable通常采用跳表的結構,而OceanBase的MemTable則采用了BTree+HashTable的混合結構。

?從下一章開始,我們將展開講講OceanBase是如何整理SSTable的。當然,感興趣的同學不妨先預習一下,在OceanBase的Github倉庫里查看ob_compaction_util.h文件,我們將逐一揭秘其中“M系列”的compact過程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15307.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15307.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15307.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

element-ui 前端ui框架用法開發指南(2024-05-22)

Element,一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫 1、npm安裝 // npm安裝:npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在線引入 訪問最新版本的資源地址 - element-uiThe CDN for element-u…

RedHat9 | DNS剖析-配置主DNS服務器實例

一、實驗環境 1、BIND軟件包介紹 BIND軟件是一款開放源碼的DNS服務器軟件,由美國加州大學Berkeley分校開發和維護,全稱為Berkeley Internet Name Domain。該軟件在DNS(域名系統)領域具有重要地位,是目前世界上使用最…

使用OpenCV dnn c++加載YOLOv8生成的onnx文件進行目標檢測

在網上下載了60多幅包含西瓜和冬瓜的圖像組成melon數據集,使用 LabelMe 工具進行標注,然后使用 labelme2yolov8 腳本將json文件轉換成YOLOv8支持的.txt文件,并自動生成YOLOv8支持的目錄結構,包括melon.yaml文件,其內容…

信息系統管理工程師問答題

信息系統管理工程師問答題 系統管理安全兩方面 安全測試 入侵檢測系統的功能 用戶標識與驗證常用的3種方法 (1) 要求用戶輸入一些保密信息,例如用戶名稱和密碼; (2) 采用物理識別設備,例如訪問卡、鑰匙或令牌; (3) 采用生物統計學…

Python怎樣定位并刪除Sql語句中不確定的查詢條件

1.問題場景描述: 在sql語句中經常會有查詢條件是:查找多個訂單簽訂日期范圍的數據,但具體的日期范圍是不確定,我們如何來查找定位 例如:查詢條件語句的部分如下圖: 目標是: 1)定位字符串:t_contract_order.sign_date 2)最終得到結果: 解決問題思路: 1)定位要找的字符串起始位置…

【學習心得】PyTorch的知識要點復習(持續更新)

PyTorch知識要點復習,目的是為了鞏固PyTorch基礎、快速回顧、深化理解PyTorch框架。這篇文章會持續更新。 一、本文的一些說明 知識點梳理:我將PyTorch的核心概念和高級技巧進行了系統化的整理,從基礎的張量操作到復雜的模型構建與訓練。這樣…

【Linux】進程終止與進程等待

目錄 進程終止 errno exit和_exit 進程等待 wait和waitpid 宏:WIFEXITED 非阻塞等待 進程終止 下面要談的一個話題就是進程終止,就是說一個進程退出了,可能有三種情況 1.進程代碼執行完,結果是正確的 2.進程代碼執行完&…

【九十二】【算法分析與設計】875. 愛吃香蕉的珂珂,410. 分割數組的最大值,機器人跳躍問題,二分答案法

875. 愛吃香蕉的珂珂 - 力扣(LeetCode) 珂珂喜歡吃香蕉。這里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 h 小時后回來。 珂珂可以決定她吃香蕉的速度 k (單位:根/小時)。每…

【活動】開源與閉源大模型:探索未來趨勢的雙軌道路

🌈個人主頁: 鑫寶Code 🔥熱門專欄: 閑話雜談| 炫酷HTML | JavaScript基礎 ?💫個人格言: "如無必要,勿增實體" 文章目錄 開源與閉源大模型:探索未來趨勢的雙軌道路引言一、開源大模型&#…

翻譯《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 標志的重要性 簡要 文章討論了使用FormatMes…

評估企業的業務是否存在高風險的六個步驟

風險的幽靈使得組織別無選擇,只能改善各種網絡風險的總體管理。以下是一個基于信息安全論壇的IRAM2方法論的分步過程,網絡安全和風險從業者可以利用它來評估和管理信息風險。 第1步:范圍界定練習 范圍界定練習的目標是提供一個以業務為中心…

基于springboot+vue的招聘信息管理系統

開發語言:Java框架:springbootJDK版本:JDK1.8服務器:tomcat7數據庫:mysql 5.7(一定要5.7版本)數據庫工具:Navicat11開發軟件:eclipse/myeclipse/ideaMaven包:…

K8s的常用命令以及yaml文件的創建

目錄 一、聲明式管理方法:YAML文件 1、yaml文件簡介 2、yaml和json的主要區別: 3、YAML的語法格式 4、yaml文件組成部分 ①控制器定義 5、查看api資源版本標簽 6、編寫nginx-deployment.yaml資源配置清單 6.1創建資源對象 6.2查看創建的pod資源…

使用python將一段文本寫入一個txt文件中且先格式化文件名

有一段文本內容&#xff0c;有“標題”和“內容”組成。 任務&#xff1a;要將這段文本&#xff0c;存放到一個txt文件中&#xff0c;文件名為當天的日期加上“標題”內容。因為“標題”內可能有/<>之類的&#xff0c;還需要格式化一下。 已經將上述功能都寫成了函數&a…

安卓手機APP開發__近距離無線通信(NFC)概述

安卓手機&#xff21;&#xff30;&#xff30;開發&#xff3f;&#xff3f;近距離無線通信(NFC)概述 概述 近距離無線通信 (NFC) 是一組近距離無線技術&#xff0c;距離通常不超過 4 厘米才能 發起連接。通過 NFC&#xff0c;您可以在 NFC 標簽和 Android 設備之間&#xf…

【Redis】 String類型的內部編碼與使用環境

文章目錄 &#x1f343;前言&#x1f334;內部編碼&#x1f384;典型使用場景&#x1f6a9;緩存功能&#x1f6a9;計數&#xff08;Counter&#xff09;功能&#x1f6a9;共享會話&#xff08;Session&#xff09;&#x1f6a9;驗證碼功能 ?總結 &#x1f343;前言 本篇文章重…

Unity-Sprite Atlas+UGUI系統的運行原理

每日一句&#xff1a;別聽世俗耳語&#xff0c;看自己的風景就好 目錄 SA的原理&#xff1a; SA的優點&#xff1a; SA的缺點&#xff1a; DrawCall是什么&#xff1f; 批處理是什么&#xff1f; 我們先了解一下UGUI系統的運行原理吧&#xff01; 提到圖集優化&#xff0…

cocosCreator動態生成二維碼

cocosCreator 版本&#xff1a;3.7.2 開發語言&#xff1a;typeScript 我們在游戲開發中&#xff0c;經常會生成一個專屬于玩家個人的二維碼&#xff0c;比如說推廣、充值等功能。 接到這個任務&#xff0c;在網上找了下&#xff0c;還是有很多教程的。但是這些教程大部分都是用…

Ollydbg動態分析MessageBoxA輸出hellow world

一、目的 找到main函數找到調用的MessageBoxA函數 測試源碼 #include <iostream> #include <windows.h>int main() {MessageBoxA(NULL, "Hellow World", "Title", MB_OK);return 1; }二、快捷鍵 指令快捷鍵說明RestartCtrlF2重新開始調試S…

buu[HCTF 2018]WarmUp(代碼審計)

buu[HCTF 2018]WarmUp&#xff08;代碼審計&#xff09; 題目 訪問source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…