跳到主要内容

Bigtable: A Distributed Storage System for Structured Data

TL;DR

Motivation

為了解決 petabyte等級的資料,設計出來的side applicability, scability, high performancehigh availiability的distributed storage system。

Data Model

bigtable只要是一個由row key, column keytimestampkey組成的sorted map。

(row:string, column:string, time:int64) -> string

Rows

Rows根據row key被partitioned,而且row是lexicographic ordered。

Column Families

最小的access單位,access control做在這個level。

Building Blocks

GFS

Logdata被存在GFS上。

Chubby

Chubby是google的distributed lock service,用來決定mastertablet server是否還在使用某個tablet

Chubby底層用的是Paxos演算法。

SSTable & Memtable

Bigtable本身的資料結構主要使用SSTableMemtable。如果有一筆操作來就寫入MemtableMemtable到一定size就輸出成一個SSTable檔案,SSTableimmutable,所以不用擔心lock問題,因為是read only。

Implementation

Tablet Location

image info 每個bitable都是3層的B+B^+ TreeTree的結構,第一層在Chubby存著root tabletroot table裡面存的是所有metadata tabletsMetadata存的是哪個row key存在哪個tablet的資訊。

Tablet Assignment

每個tablet會被assign給一個tablet servertablet server會在Chubbycreate一個file,代表自己own這個tablet

Master會定期檢查這些file,如果tablet server掛了或是因為網路原因導致無法繼續lock tablet,master就會把這個檔案刪掉,代表釋放tablet server不在負責這個tablet,而tablet server檢查到檔案被刪以後,也會知道自己不在負責,會釋出tablet

如果tablet成長的太大,master會負責sharding,但不管怎樣一定會保持3層的B+B^+ TreeTree

Tablet Serving

image info 如圖所示,當write request到tablet server,會把操作寫到log,並且把結果寫到Memtabletablet server並且會做snapshot,在failover的時候,才不需要replay太多操作。

而read request就Memtable或是SSTable來處理。

Compactions

Memtable超過Threshold,就會create一個新的Memtable,並且把舊的output成SSTable,此過程稱為minor compaction

為了減少SSTable的數目,tablet server會定時的做merging compactionMemtable和幾個SSTable合在一起,減少total的SSTable數目。

Minor compactionmerging compaction產出的SSTable都含有deletion(thumbstone)的log,因此還會執行major compactionmajor compactionSSTable不包含deletion (thumbstone)的log,會釋放出更多資源。

Refinement

Locality Groups

Bigtable允許把column families定義在同一個locality group,因此這些資料可以被一起存取,改善performance。

Compression

Client可以指定SSTable block要不要被加密。Bigtable做2-pass的加密,first pass是Bentley and McIlory's scheme,second pass是一個fast compress algorithm,經過2-pass的compression,可以達到10-1的reduction。

Caching

為了改善讀取效能,tablet server有兩層的cache:scan cacheblock cacheScan cache cache SSTable回傳的key-value pair,block cache cache SSTable的block。

Bloom Filters

Tablet server會先用Bloom Filter檢查 key是否存在SSTable,存在才嘗試在SSTable中找尋。

Commit-log

為了減少所有commit log的檔案數目,commit log不是以tablet為單位,而是以tablet server為單位,每個tablet server保存一份commit log file。

但是這樣會造成recover的時候的複雜度,為了改善recovery的速度,這些commit log被根據<table, row name, sequence number>的排序方式group在一起,在recover的時候,就可以快速的redo某個tabletcommit log