深入leveldb 初步認識leveldb

2021-12-30 05:12:47 字數 1927 閱讀 4411

1. leveldb簡介

leveldb是google兩位工程師實現的單機版k-v儲存系統,具有以下幾個特點

1. key和value都是任意的位元組陣列,支援記憶體和持久化儲存

2. 資料都是按照key排序

3. 使用者可以重寫排序函式

4. 包含基本的資料操作介面,put(key,value),get(key),delete(key)

5. 多操作可以當成一次原子操作

6. 使用者可以通過生成snapshot,使得讀取操作不受寫操作影響,讀取過程中看到最終資料一致性

7. 支援迭代器對資料的操作

8. 資料使用snappy自動壓縮

9. 外部操作(如檔案系統操作等)通過乙個虛擬介面使用,使用者可以對作業系統進行定製相應操作

2. leveldb侷限性

1. leveldb非關係型資料庫,不支援sql查詢也不支援索引

2. 同一時間只支援單程序(支援多執行緒)訪問db

3. 不支援客戶端-伺服器模型,使用者需要自己封裝

3. leveldb基本框架

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

leveldb做為儲存系統,在整個系統執行過程中,基本的框架如下所示

如圖所示,leveldb的儲存介質分為記憶體和磁碟兩種。記憶體中有memtable和immutable memtable;磁碟中有log檔案,manifest檔案,current檔案以及分level的sstable檔案;

1). 當使用者往db插入一條key-value資料的時候,會先寫log檔案,當寫log成功之後再把當前記錄寫到memtable中。為什麼寫資料的時候要先寫log檔案呢,主要是因為新插入的資料會儲存在記憶體中,為了防止系統崩潰導致新插入資料丟失,因此要先寫log檔案保證落地之後,再寫記憶體。這樣即使系統崩潰了,也能夠從log中恢復出來。

2). memtable中的資料是可讀可寫,當memtable的資料量達到乙個資料量之後。當前的memtable變成了immutable memtable,唯讀不可修改。重新生成新的memtable和log檔案,新來的資料寫到新的log和memtable中。

3). immutable memtable中的資料會被dump到磁碟中的sstable檔案,磁碟中的sstable檔案是有層級的,第一層level0到第n層leveln...,每個level都有很多sstable檔案,每個檔案都是按照key排好序。注意了level0和其它level不一樣,level0中的sstable檔案的key有可能重複,其它level的sstable檔案的key保證不會有重複。

4). 由於每個level中有許多sstable檔案,每個sstable檔案都有key range。所以需要乙個檔案來儲存當前所有level中sstabel的key range。manifest檔案主要就是用來儲存每個level中的sstable的資訊

5). 隨著系統不斷的執行,每個level中的sstable檔案可能會越來越多,這個時候db會自動把同乙個level或者不同level中的sstable檔案會進行merge。這個時候manifest就會發生變化,因此我們需要乙個current檔案來記錄當前最新的manifest檔案。

未完待續...

levelDB簡單認識

leveldb是乙個google實現的非常高效的kv資料庫。它是乙個c c 程式語言的庫,不包含網路服務封裝,無法像一般的儲存伺服器 如mysql 那樣用客戶端來連線它,使用者應該自己封裝自己的網路伺服器。leveldb是單程序的服務,能夠支援billion級別的資料量,而且具有非常高的效能。寫資料...

初步認識繼承

include stdafx.h include using namespace std 構造方式跟類內類物件是一樣的 父類 info 派生類 sci 派生類 sci 父類 info struct info 父類 void outputinfo info info private int numb ...

初步認識redis

1.什麼redis 2.為什麼使用redis 3.什麼場合使用redis 4.redis的好處 5.編譯安裝redis 6.redis資料結構 1.什麼是redis redis是remote dictionary server 遠端資料服務 的縮寫,是義大利人antirez開發的一款記憶體快取記憶體...