什么是Bigtable
相比于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫麻车,bigtable 提供了分布式的非結(jié)構(gòu)化的數(shù)據(jù)存儲爷肝,但沒有提供sql的語義宇智,所以是數(shù)據(jù)NoSQL的數(shù)據(jù)庫汽纤。
事實上它還是一個分布式的多層map的存儲的結(jié)構(gòu)。
Building Blocks
在bigtable 用了其他的很多的Google的組件何缓。
????使用Google分布式文件系統(tǒng)(GFS)存儲日志和數(shù)據(jù)文件肢础。
????BigTable還依賴一個高可用的、持久化的分布式鎖服務(wù)組件碌廓,叫做Chubby传轰。用于選舉????????????????master
????一般會運行在共享的集群中,依賴于共享集群的任務(wù)調(diào)度谷婆。
Data model
在bigtable 中路召,還是提供了類似于表的的數(shù)據(jù)結(jié)構(gòu),會有數(shù)據(jù)的row 和colum波材, 和一般的不同的是,每一個行的列是可以不同的身隐,列的數(shù)量也是可以不一致的廷区。對于數(shù)據(jù)的查找,需要先找到對應(yīng)的一行贾铝,然后再去找這一行中的某一列隙轻。同時數(shù)據(jù)還會有不同版本的相關(guān)的信息埠帕。
(row:string, column:string, time:int64) →? string
如下面的例子,可以通過
(com.cnn.www玖绿,anchor:cnnsi.com敛瓷,t9)來找到CNN。t9是版本斑匪,是根據(jù)timestamp來構(gòu)造的呐籽。
SSTable
BigTable數(shù)據(jù)在內(nèi)部使用google? SSTable文件格式存儲。SSTable提供一個從鍵(key)到值(value)的持久化的蚀瘸、已排序狡蝶、不可更改的映射(Map),這里的key和value 的都是任意的字節(jié)(Byte)串贮勃。
對SSTable提供了如下操作:查詢與一個指定key值相關(guān)的value贪惹,或者遍歷指定key值范圍內(nèi)的所有鍵值對。從內(nèi)部看寂嘉,SSTable是一連串的數(shù)據(jù)塊(通常每個塊的大小是64KB奏瞬,但是這個大小是可以配置的)。SSTable 會使用索引來加速查找泉孩,索引一般存儲在數(shù)據(jù)的末尾位置硼端。如圖:
Tablet
Tablet 是包含了一個表中多行,一個tablet事實上是存儲在一個機器上的一塊信息棵譬。
其次显蝌,對于一個table來說,可能會分為多個tablet订咸,而tablet又是由不同的sstable組成的曼尊,多個tablet可以共享一個sstable
對于tablet 的查找,使用的是類似于文件系統(tǒng)的多級的索引結(jié)構(gòu):
使用一個三層的脏嚷、類似于B+樹[10]的結(jié)構(gòu)存儲tablet的位置信息骆撇。
其中第一層是存儲在chubby file的中,也就是分布式鎖的系統(tǒng)父叙∩窠迹客戶程序庫會緩存tablet的位置信息。如果客戶程序不知道一個tablet的位置信息趾唱,或者發(fā)現(xiàn)它緩存的地址信息不正確涌乳,那么客戶程序就遞歸移動到tablet位置層次;如果客戶端緩存是空的甜癞,那么尋址算法需要通過三次網(wǎng)絡(luò)來回通信尋址夕晓,這其中包括了一次Chubby讀操作。如果客戶端緩存的地址信息過期了悠咱,那么尋址算法可能進行多達6次(alex注:其中的三次通信發(fā)現(xiàn)緩存過期蒸辆,另外三次更新緩存數(shù)據(jù))網(wǎng)絡(luò)來回通信征炼,因為過期緩存條目只有在沒有查到數(shù)據(jù)(upon misses)的時候才能發(fā)現(xiàn) (假設(shè)元數(shù)據(jù)tablet沒有被頻繁的移動)。躬贡。
為了減少開銷谆奥,會于讀取多個的tablet 一次
基本的服務(wù)
Bigtable集群包括三個主要部分:一個供客戶端使用的庫,一個主服務(wù)器(master server)拂玻,許多片服務(wù)器(tablet server)酸些。
每個tablet一次分配給一個tablet服務(wù)器。master服務(wù)器記錄活躍的tablet服務(wù)器纺讲、當前tablet到tablet服務(wù)器的分配擂仍、包括哪些tablet還沒有被分配。一個tablet 服務(wù)器管理著多個tablet熬甚。
客戶端的操作都是bypass master的
讀寫操作
當片服務(wù)器收到一個寫請求逢渔,片服務(wù)器首先檢查請求是否合法。如果合法乡括,先將寫請求提交到日志去肃廓,然后將數(shù)據(jù)寫入內(nèi)存中的memtable。memtable相當于SSTable的緩存诲泌,當memtable成長到一定規(guī)模會被凍結(jié)盲赊,Bigtable隨之創(chuàng)建一個新的memtable,并且將凍結(jié)的memtable轉(zhuǎn)換為SSTable格式寫入GFS敷扫,這個操作稱為minor compaction哀蘑。
當片服務(wù)器收到一個讀請求,同樣要檢查請求是否合法葵第。如果合法绘迁,這個讀操作會查看所有SSTable文件和memtable的合并視圖,因為SSTable和memtable本身都是已排序的卒密,所以合并相當快缀台。