天天看點

Google三駕馬車-Bigtable-論文筆記

什麼是Bigtable

相比于傳統的關系型資料庫,bigtable 提供了分布式的非結構化的數 據存儲,但沒有提供sql的語義,是以是資料NoSQL的資料庫。

事實上它還是一個分布式的多層map的存儲的結構

Building Blocks

在bigtable 用了其他的很多的Google的元件。

  • 使用Google分布式檔案系統(GFS)存儲日志和資料檔案。
  • BigTable還依賴一個高可用的、持久化的分布式鎖服務元件,叫做Chubby。用于選舉master
  • 一般會運作在共享的叢集中,依賴于共享叢集的任務排程。

Data model

在bigtable 中,還是提供了類似于表的的資料結構,會有資料的row 和colum, 和一般的不同的是,每一個行的列是可以不同的,列的數量也是可以不一緻的。對于資料的查找,需要先找到對應的一行,然後再去找這一行中的某一列。同時資料還會有不同版本的相關的資訊。

(row:string, column:string, time:int64) → string

如下面的例子,可以通過(com.cnn.www,anchor:cnnsi.com,t9)來找到CNN。t9是版本,是根據timestamp來構造的。

Google三駕馬車-Bigtable-論文筆記

SSTable

BigTable資料在内部使用google SSTable檔案格式存儲。SSTable提供一個從鍵(key)到值(value)的持久化的、已排序、不可更改的映射(Map),這裡的key和value 的都是任意的位元組(Byte)串。對SSTable提供了如下操作:查詢與一個指定key值相關的value,或者周遊指定key值範圍内的所有鍵值對。從内部看,SSTable是一連串的資料塊(通常每個塊的大小是64KB,但是這個大小是可以配置的)。SSTable 會使用索引來加速查找,索引一般存儲在資料的末尾位置。如圖:

Google三駕馬車-Bigtable-論文筆記

Tablet

Tablet 是包含了一個表中多行,一個tablet事實上是存儲在一個機器上的一塊資訊。

Google三駕馬車-Bigtable-論文筆記

其次,對于一個table來說,可能會分為多個tablet,而tablet又是由不同的sstable組成的,多個tablet可以共享一個sstable

對于tablet 的查找,使用的是類似于檔案系統的多級的索引結構:

Google三駕馬車-Bigtable-論文筆記

使用一個三層的、類似于B+樹[10]的結構存儲tablet的位置資訊。其中第一層是存儲在chubby file的中,也就是分布式鎖的系統。客戶程式庫會緩存tablet的位置資訊。如果客戶程式不知道一個tablet的位置資訊,或者發現它緩存的位址資訊不正确,那麼客戶程式就遞歸移動到tablet位置層次;如果用戶端緩存是空的,那麼尋址算法需要通過三次網絡來回通信尋址,這其中包括了一次Chubby讀操作。如果用戶端緩存的位址資訊過期了,那麼尋址算法可能進行多達6次(alex注:其中的三次通信發現緩存過期,另外三次更新緩存資料)網絡來回通信,因為過期緩存條目隻有在沒有查到資料(upon misses)的時候才能發現 (假設中繼資料tablet沒有被頻繁的移動)。。為了減少開銷,會于讀取多個的tablet 一次

基本的服務

Bigtable叢集包括三個主要部分:一個供用戶端使用的庫,一個主伺服器(master server),許多片伺服器(tablet server)。

每個tablet一次配置設定給一個tablet伺服器。master伺服器記錄活躍的tablet伺服器、目前tablet到tablet伺服器的配置設定、包括哪些tablet還沒有被配置設定。一個tablet 伺服器管理着多個tablet。

用戶端的操作都是bypass master的

讀寫操作

當片伺服器收到一個寫請求,片伺服器首先檢查請求是否合法。如果合法,先将寫請求送出到日志去,然後将資料寫入記憶體中的memtable。memtable相當于SSTable的緩存,當memtable成長到一定規模會被當機,Bigtable随之建立一個新的memtable,并且将當機的memtable轉換為SSTable格式寫入GFS,這個操作稱為minor compaction。

Google三駕馬車-Bigtable-論文筆記

當片伺服器收到一個讀請求,同樣要檢查請求是否合法。如果合法,這個讀操作會檢視所有SSTable檔案和memtable的合并視圖,因為SSTable和memtable本身都是已排序的,是以合并相當快。

繼續閱讀