1. 程式人生 > >[轉]資料分析與處理之二:Leveldb 實現原理

[轉]資料分析與處理之二:Leveldb 實現原理

鄭重宣告:本篇部落格是自己學習 Leveldb 實現原理時參考了郎格科技系列部落格整理的,原文地址

LevelDb日知錄之一LevelDb 101

  說起LevelDb也許您不清楚但是如果作為IT工程師不知道下面兩位大神級別的工程師那您的領導估計會Hold不住了Jeff DeanSanjay Ghemawat。這兩位是Google公司重量級的工程師為數甚少的Google Fellow之二

  LevelDb就是這兩位大神級別的工程師發起的開源專案簡而言之LevelDb是能夠處理十億級別規模Key-Value型資料永續性儲存的C++ 程式庫正像上面介紹的這二位是Bigtable的設計和實現者

如果瞭解Bigtable的話應該知道在這個影響深遠的分散式儲存系統中有兩個核心的部分Master ServerTablet Server。其中Master Server做一些管理資料的儲存以及分散式排程工作實際的分散式資料儲存以及讀寫操作是由Tablet Server完成的LevelDb則可以理解為一個簡化版的Tablet Server。

  LevelDb有如下一些特點

    首先LevelDb是一個持久化儲存的KV系統Redis這種記憶體型的KV系統不同LevelDb不會像Redis一樣狂吃記憶體而是將大部分資料儲存到磁碟上

    其次LevleDb在儲存資料時

是根據記錄的key值有序儲存的就是說相鄰的key值在儲存檔案中是依次順序儲存的而應用可以自定義key大小比較函式LevleDb會按照使用者定義的比較函式依序儲存這些記錄

    再次像大多數KV系統一樣LevelDb的操作介面很簡單基本操作包括寫記錄讀記錄以及刪除記錄也支援針對多條操作的原子批量操作

    另外LevelDb支援資料快照snapshot)功能使得讀取操作不受寫操作影響可以在讀操作過程中始終看到一致的資料

  除此外LevelDb還支援資料壓縮等操作這對於減小儲存空間以及增快IO效率都有直接的幫助

  LevelDb效能非常突出官方網站報道其隨機寫效能達到40

萬條記錄每秒而隨機讀效能達到6萬條記錄每秒總體來說LevelDb的寫操作要大大快於讀操作而順序讀寫操作則大大快於隨機讀寫操作至於為何是這樣看了我們後續推出的LevelDb日知錄估計您會了解其內在原因

LevelDb日知錄之二:整體架構

      LevelDb本質上是一套儲存系統以及在這套儲存系統上提供的一些操作介面為了便於理解整個系統及其處理流程我們可以從兩個不同的角度來看待LevleDb:靜態角度和動態角度從靜態角度可以假想整個系統正在執行過程中不斷插入刪除讀取資料),此時我們給LevelDb照相從照片可以看到之前系統的資料在記憶體和磁碟中是如何分佈的處於什麼狀態等從動態的角度主要是瞭解系統是如何寫入一條記錄讀出一條記錄刪除一條記錄的同時也包括除了這些介面操作外的內部操作比如compaction,系統執行時崩潰後如何恢復系統等等方面

     本節所講的整體架構主要從靜態角度來描述之後接下來的幾節內容會詳述靜態結構涉及到的檔案或者記憶體資料結構LevelDb日知錄後半部分主要介紹動態視角下的LevelDb,就是說整個系統是怎麼運轉起來的

     LevelDb作為儲存系統資料記錄的儲存介質包括記憶體以及磁碟檔案如果像上面說的LevelDb運行了一段時間此時我們給LevelDb進行透視拍照那麼您會看到如下一番景象

1.1:LevelDb結構

    從圖中可以看出構成LevelDb靜態結構的包括六個主要部分記憶體中的MemTableImmutable MemTable以及磁碟上的幾種主要檔案Current檔案Manifest檔案log檔案以及SSTable檔案當然LevelDb除了這六個主要部分還有一些輔助的檔案但是以上六個檔案和資料結構是LevelDb的主體構成元素

LevelDbLog檔案和MemtableBigtable論文中介紹的是一致的當應用寫入一條Key:Value記錄的時候LevelDb會先往log檔案裡寫入成功後將記錄插進Memtable這樣基本就算完成了寫入操作因為一次寫入操作只涉及一次磁碟順序寫和一次記憶體寫入所以這是為何說LevelDb寫入速度極快的主要原因

Log檔案在系統中的作用主要是用於系統崩潰恢復而不丟失資料假如沒有Log檔案因為寫入的記錄剛開始是儲存在記憶體中的此時如果系統崩潰記憶體中的資料還沒有來得及Dump到磁碟所以會丟失資料Redis就存在這個問題)。為了避免這種情況LevelDb在寫入記憶體前先將操作記錄到Log檔案中然後再記入記憶體中這樣即使系統崩潰也可以從Log檔案中恢復記憶體中的Memtable,不會造成資料的丟失

Memtable插入的資料佔用記憶體到了一個界限後需要將記憶體的記錄匯出到外存檔案中LevleDb會生成新的Log檔案和Memtable,原先的Memtable就成為Immutable Memtable,顧名思義就是說這個Memtable的內容是不可更改的只能讀不能寫入或者刪除新到來的資料被記入新的Log檔案和Memtable,LevelDb後臺排程會將Immutable Memtable的資料匯出到磁碟形成一個新的SSTable檔案SSTable就是由記憶體中的資料不斷匯出並進行Compaction操作後形成的而且SSTable的所有檔案是一種層級結構第一層為Level 0,第二層為Level 1,依次類推層級逐漸增高這也是為何稱之為LevelDb的原因

    SSTable中的檔案是Key有序的就是說在檔案中小key記錄排在大Key記錄之前各個LevelSSTable都是如此但是這裡需要注意的一點是Level 0SSTable檔案字尾為.sst)和其它Level的檔案相比有特殊性這個層級內的.sst檔案兩個檔案可能存在key重疊比如有兩個level 0sst檔案檔案A和檔案B,檔案Akey範圍是:{bar, car},檔案BKey範圍是{blue,samecity},那麼很可能兩個檔案都存在key=”blood”的記錄對於其它LevelSSTable檔案來說則不會出現同一層級內.sst檔案的key重疊現象就是說Level L中任意兩個.sst檔案那麼可以保證它們的key值是不會重疊的這點需要特別注意後面您會看到很多操作的差異都是由於這個原因造成的

    SSTable中的某個檔案屬於特定層級而且其儲存的記錄是key有序的那麼必然有檔案中的最小key和最大key,這是非常重要的資訊LevelDb應該記下這些資訊Manifest就是幹這個的它記載了SSTable各個檔案的管理資訊比如屬於哪個Level,檔名稱叫啥最小key和最大key各自是多少下圖是Manifest所儲存內容的示意

2.1:Manifest儲存示意圖

圖中只顯示了兩個檔案manifest會記載所有SSTable檔案的這些資訊),Level 0test.sst1test.sst2檔案同時記載了這些檔案各自對應的key範圍比如test.sstt1key範圍是an” “banana”,而檔案test.sst2key範圍是baby”samecity”,可以看出兩者的key範圍是有重疊的

Current檔案是幹什麼的呢這個檔案的內容只有一個資訊就是記載當前的manifest檔名因為在LevleDb的執行過程中隨著Compaction的進行SSTable檔案會發生變化會有新的檔案產生老的檔案被廢棄Manifest也會跟著反映這種變化此時往往會新生成Manifest檔案來記載這種變化Current則用來指出哪個Manifest檔案才是我們關心的那個Manifest檔案

以上介紹的內容就構成了LevelDb的整體靜態結構LevelDb日知錄接下來的內容中我們會首先介紹重要檔案或者記憶體資料的具體資料佈局與結構

LevelDb日知錄之三:log檔案

     上節內容講到log檔案在LevelDb中的主要作用是系統故障恢復時能夠保證不會丟失資料因為在將記錄寫入記憶體的Memtable之前會先寫入Log檔案這樣即使系統發生故障Memtable中的資料沒有來得及Dump到磁碟的SSTable檔案LevelDB也可以根據log檔案恢復記憶體的Memtable資料結構內容不會造成系統丟失資料在這點上LevelDbBigtable是一致的

     下面我們帶大家看看log檔案的具體物理和邏輯佈局是怎樣的LevelDb對於一個log檔案會把它切割成以32K為單位的物理Block,每次讀取的單位以一個Block作為基本讀取單位下圖展示的log檔案由3Block構成所以從物理佈局來講一個log檔案就是由連續的32K大小Block構成的

3.1 log檔案佈局

        在應用的視野裡是看不到這些Block應用看到的是一系列的Key:ValueLevelDb內部會將一個Key:Value對看做一條記錄的資料另外在這個資料前增加一個記錄頭用來記載一些管理資訊以方便內部處理3.2顯示了一個記錄在LevelDb內部是如何表示的

3.2 記錄結構

       記錄頭包含三個欄位ChechSum是對型別資料欄位的校驗碼為了避免處理不完整或者是被破壞的資料LevelDb讀取記錄資料時候會對資料進行校驗如果發現和儲存的CheckSum相同說明資料完整無破壞可以繼續後續流程。“記錄長度記載了資料的大小,“資料則是上面講的Key:Value數值對,“型別欄位則指出了每條記錄的邏輯結構和log檔案物理分塊結構之間的關係具體而言主要有以下四種類型FULL/FIRST/MIDDLE/LAST。

        如果記錄型別是FULL,代表了當前記錄內容完整地儲存在一個物理Block沒有被不同的物理Block切割開如果記錄被相鄰的物理Block切割開則型別會是其他三種類型中的一種我們以圖3.1所示的例子來具體說明

       假設目前存在三條記錄Record A,Record BRecord C,其中Record A大小為10K,Record B 大小為80K,Record C大小為12K,那麼其在log檔案中的邏輯佈局會如圖3.1所示Record A是圖中藍色區域所示因為大小為10K<32K,能夠放在一個物理Block所以其型別為FULL;Record B 大小為80K,Block 1因為放入了Record A,所以還剩下22K,不足以放下Record B,所以在Block 1的剩餘部分放入Record B的開頭一部分型別標識為FIRST,代表了是一個記錄的起始部分Record B還有58K沒有儲存這些只能依次放在後續的物理Block裡面因為Block 2大小隻有32K,仍然放不下Record B的剩餘部分所以Block 2全部用來放Record B,且標識型別為MIDDLE,意思是這是Record B中間一段資料Record B剩下的部分可以完全放在Block 3型別標識為LAST,代表了這是Record B的末尾資料圖中黃色的Record C因為大小為12K,Block 3剩下的空間足以全部放下它所以其型別標識為FULL。

     從這個小例子可以看出邏輯記錄和物理Block之間的關係LevelDb一次物理讀取為一個Block,然後根據型別情況拼接出邏輯記錄供後續流程處理

LevelDb日知錄之四:SSTable檔案

   SSTableBigtable中至關重要的一塊對於LevelDb來說也是如此LevelDbSSTable實現細節的瞭解也有助於瞭解Bigtable中一些實現細節

本節內容主要講述SSTable的靜態佈局結構我們曾在LevelDb日知錄之二整體架構中說過SSTable檔案形成了不同Level的層級結構至於這個層級結構是如何形成的我們放在後面Compaction一節細說本節主要介紹SSTable某個檔案的物理佈局和邏輯佈局結構這對了解LevelDb的執行過程很有幫助

  LevelDb

相關推薦

[]資料分析處理Leveldb 實現原理

鄭重宣告:本篇部落格是自己學習 Leveldb 實現原理時參考了郎格科技系列部落格整理的,原文地址:LevelDb日知錄之一:LevelDb 101  說起LevelDb也許您不清楚,但是如果作為IT工程師,不知道下面兩位大神級別的工程師,那您的領導估計會Hold不住了:Je

資料系列資料分析處理

經過了資料採集和同步之後,就可以在阿里雲上進行資料分析和處理,來玩轉您的資料了。本文向您介紹在阿里雲大資料各產品中,以及各產品之間怎樣來完成您的資料處理和資料分析。 MaxCompute 基於MaxCompute的大資料計算(MaxCompute + RDS) 使用MaxCompute分析IP

python進階資料分析展示(

資料分析之表示 NumPy庫入門 資料的維度 一維資料 一維資料由對等關係的有序或無序資料構成,採用線性方式組織。 例如:3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376。 對應列

資料分析挖掘資料處理

目錄 資料整合 簡單變換 資料整合 #資料整合 import numpy a=numpy.array([[1,5,6],[9,4,3]]) b=numpy.array([[6,36,7],[2,3,39]]) c=numpy.conca

PyQtsignal(訊號)slot(槽)新增自定義槽

上文中我們實現了一個非常簡單的功能:點選按鈕關閉應用。不過那種呼叫connect函式的寫法是在QT程式設計中常用的(用C++語言寫QT應用),顯得中規中矩,我們這裡是PyQt,自然要來一種PyQt的寫法,我們先看程式碼: import sys from P

分析診斷工具Explain結果解讀實踐

  MySQL的EXPLAIN命令用於SQL語句的查詢執行計劃(QEP)。這條命令的輸出結果能夠讓我們瞭解MySQL 優化器是如何執行SQL 語句的。這條命令並沒有提供任何調整建議,但它能夠提供重要的資訊幫助你做出調優決策。 語法 MySQL 的EXPLAIN 語法可以執行在SELECT 語句或者特定表上。

資料分析處理 -- Leveldb 實現原理

LevelDb日知錄之一:LevelDb 101   說起LevelDb也許您不清楚,但是如果作為IT工程師,不知道下面兩位大神級別的工程師,那您的領導估計會Hold不住了:Jeff Dean和Sanjay Ghemawat。這兩位是Google公司重量級的工程師,為數甚少的Google Fel

python資料分析挖掘資料清洗

        資料探索的目的是及早發現數據的一些簡單規律或特徵,資料清洗的目的是留下可靠的資料,避免髒資料的干擾。 這兩者沒有嚴格的先後順序,經常在一個階段進行。    &nb

[知乎]老狼:深入PCIPCIe軟體篇

  深入PCI與PCIe之二:軟體篇 https://zhuanlan.zhihu.com/p/26244141 我們前一篇文章( 深入PCI與PCIe之一:硬體篇 - 知乎專欄)介紹了PCI和PCIe的硬體部分。本篇主要介紹PCI和PCIe的軟體介面和UEFI對P

python資料分析挖掘聚類kmeans演算法

聚類不指定類別進行分類 (劃分(分裂)法,層次分析法、密度分析法)、網格法、模型法     Kmeans演算法屬於分裂法 隨機選擇k各點作為聚類中心 計算各個點到這K個點的距離   將對應的點聚到與它最近的這個聚類中心 重新

python資料分析挖掘貝葉斯演算法演算法實現

程式碼中有詳細的註釋 訓練檔案: Txt檔案中為0,1矩陣,將圖片轉換為0,1矩陣見上一篇部落格方法 import numpy import operator from os import listdir class Bayes: def __init__(self):

異常資料分析處理

一.分析 異常值分析是檢驗資料是否有錄入錯誤以及含有不合常理的資料。忽視異常值的存在是十分危險的,不加剔除地把異常值包括進資料的計算分析過程中,會給結果帶來不良影響;重視異常值的出現,分析其產生的原因,常常成為發現問題改進決策的契機。 異常值是指樣本中的個別值,其數值明顯偏移其餘的觀測值。異

資料結構演算法叉搜尋樹插入、查詢刪除

1 二叉搜尋樹(BSTree)的概念   二叉搜尋樹又被稱為二叉排序樹,那麼它本身也是一棵二叉樹,那麼滿足以下性質的二叉樹就是二叉搜尋樹,如圖: 若左子樹不為空,則左子樹上所有節點的值都小於根節點的值; 若它的右子樹不為空,則它的右子樹上所有節點的值都大於

資料結構演算法 排序

   視訊解析  https://edu.csdn.net/course/play/7813 假定,你要為你的生日聚會邀請你的朋友和親戚。對此,你需要給他們打電話。你正在擁有10,000條記錄的電話本中查詢名為Steve的電話號碼。然而,電話本中的

事件處理點選事件監聽器的五種寫法

首選方法二! 方法一:寫一個內部類,在類中實現點選事件 1、在父類中呼叫點選事件 bt_dail.setOnClickListener(new MyButtonListener()); 2、建立內部類 private class MyButtonListener

(c++)資料結構演算法鄰接矩陣、深度廣度遍歷、構造最小生成樹(prim、kruskal演算法)

//圖的鄰接矩陣實現 //廣度遍歷bfs和深度遍歷dfs //構造最小生成樹的prim、kruskal演算法 #include <iostream> #include<stack> #include<queue> #define WEI

資料結構演算法(棧常見案例)

棧是一種常用資料結構,其特性是FILO(first in last out),其基本概念這裡不做介紹,相信都學過了。直接食用java中已經封裝好Stack<>類。 棧的效率:入棧出棧複雜度為O(1),不需要比較和移動操作。 案例1:單詞逆序 比

c++實現檔案傳輸功能實現

在上一篇中,我們以經介紹了程式的流程和框架,在本篇將詳細討論各個功能的實現主要包括1.獲取磁碟資訊2.獲取目錄資訊3.獲取檔案資訊4.執行指定檔案5.刪除指定檔案6.刪除指定目錄7.建立指定目錄8.上傳下載檔案9.獲取遠端檔案圖示獲取磁碟資訊磁碟資訊可以用API GetDri

VO高階使用技巧程式設計實現基於Ref Cursor的VO

開發執行環境:JDevloper 11.1.2.4.0+ Oracle Database 11gR2 XE本文最後一次修改日期:2013-07-01在Fusion Order Demo的StandaloneExamples中的AdvancedViewObjectsExamp

資料結構算法系列課程複雜度分析(上)

資料結構和演算法,本身就是要解決 “快” 和 “省” 的問題。考量的指標分別就是 “時間複雜度” 和 “空間複雜度”。 時間複雜度表示程式碼執行時間隨著資料規模增長的變化趨勢,也叫漸進時間複雜度。 空間複雜度,全稱漸進空間複雜度,表示演算法的儲存空間和資料規模之間的增長關