轉自:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html
有時間再好好看下整個文章!
說起LevelDb也許您不清楚,但是如果作為IT工程師,不知道下面兩位大神級別的工程師,那您的領導估計會Hold不住了:Jeff Dean和Sanjay Ghemawat。這兩位是Google公司重量級的工程師,為數甚少的Google Fellow之二。
Jeff Dean其人:http://research.google.com/people/jeff/index.html,Google大規模分布式平台Bigtable和MapReduce主要設計和實現者。
Sanjay Ghemawat其人:http://research.google.com/people/sanjay/index.html,Google大規模分布式平台GFS,Bigtable和MapReduce主要設計和實現工程師。
LevelDb就是這兩位大神級別的工程師發起的開源項目,簡而言之,LevelDb是能夠處理十億級別規模Key-Value型數據持久性存儲的C++ 程序庫。正像上面介紹的,這二位是Bigtable的設計和實現者,如果了解Bigtable的話,應該知道在這個影響深遠的分布式存儲系統中有兩個核心的部分:Master Server和Tablet 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本質上是一套存儲系統以及在這套存儲系統上提供的一些操作接口。為了便於理解整個系統及其處理流程,我們可以從兩個不同的角度來看待LevleDb:靜態角度和動態角度。從靜態角度,可以假想整個系統正在運行過程中(不斷插入刪除讀取數據),此時我們給LevelDb照相,從照片可以看到之前系統的數據在內存和磁盤中是如何分布的,處於什么狀態等;從動態的角度,主要是了解系統是如何寫入一條記錄,讀出一條記錄,刪除一條記錄的,同時也包括除了這些接口操作外的內部操作比如compaction,系統運行時崩潰后如何恢復系統等等方面。
本節所講的整體架構主要從靜態角度來描述,之后接下來的幾節內容會詳述靜態結構涉及到的文件或者內存數據結構,LevelDb日知錄后半部分主要介紹動態視角下的LevelDb,就是說整個系統是怎么運轉起來的。
LevelDb作為存儲系統,數據記錄的存儲介質包括內存以及磁盤文件,如果像上面說的,當LevelDb運行了一段時間,此時我們給LevelDb進行透視拍照,那么您會看到如下一番景象:
圖1.1:LevelDb結構
從圖中可以看出,構成leveldb靜態結構的包括六個部分,內存中的 memtable以及Immutable memtable,磁盤上的current文件,log文件,Manifest文 件,SSTable文件。存儲流程如下所示:
- 當插入一條key-value數據時,leveldb先將數據插入到log文件(追加)中,成功后 寫入memtable中,既保證了高效寫入,也保證了數據的穩定性
- 當memtable插入的數據到了一個界限之后,會轉為Immutable memtable, 由新的memtable支持寫入操作.同時,leveldb在后台會通過調度程序將 Immutable memtable dump到磁盤上的sstable文件中。
- sstable內部的數據是key有序的。由Immutable memtable不斷dump出來的 sstable文件越來越多,會進行compact操作,形成新的level的sstable文件。
參考:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html

