天天看點

撸論文系列之——Bigtable

特征:分布式,結構化,海量資料,PB級叢集

使用案例:web索引、Google Earth、Google Finance等

優勢:适用性廣、可擴充、靈活、高性能和高可用

目的:可靠處理PB級資料,分布式部署

劣勢:不支援完整關系資料模型

資料模型:

定義——Bigtable是一個稀疏的、分布式的、持久化存儲的多元度排序Map。Map的索引是行關鍵字、列關鍵字以及時間戳;Map中的每個value都是一個未經解析的byte數組。

撸論文系列之——Bigtable

其中com.cnn.www存放在行族,contents列族存放網頁内容,anchor列族存放引用該網頁的錨連結文本,每個錨連結隻有一個版本(對應t8,t9時間戳),contents列族有三個版本(對應t3,t5,t6時間戳)。

最大支援64KB,讀寫操作均是原子操作。字典順序組織資料,分區Tablet使得讀取少量列時效率很高。通路充分利用位置相關性相同域連續存儲。

列族

同一列族可壓縮,先建立再使用,列族最多幾百個,列可以無限多個。命名文法:列族:限定詞。可進行通路控制、磁盤記憶體統計的管理。

時間戳

64位整型,可以Bigtable生成也可使用者程式生成。資料按時間戳倒序排序。根據設定的參數對廢棄版本進行自動GC。

API

寫:

// Open the table
Table *T = OpenOrDie(“/bigtable/web/webtable”); 
// Write a new anchor and delete an old anchor RowMutation 
r1(T, “com.cnn.www”); 
r1.Set(“anchor:www.c-span.org”, “CNN”);
r1.Delete(“anchor:www.abc.com”);
Operation op;
Apply(&op, &r1);
           

讀:

Scanner scanner(T);
ScanStream *stream;
stream = scanner.FetchColumnFamily(“anchor”); 
stream->SetReturnAllVersions(); 
scanner.Lookup(“com.cnn.www”);
for (; !stream->Done(); stream->Next()) {
    printf(“%s %s %lld %s\n”, 
    scanner.RowName(),
    stream->ColumnName(), 
    stream->MicroTimestamp(), 
    stream->Value());
}
           

可跨行批量寫入,不支援跨行事務處理。可以同MapReduce一起使用(下一篇部落格将主要介紹MR)

BigTable構件

使用GFS存儲日志和資料檔案(GFS相關介紹可以參見我的上一篇部落格),内部存儲檔案格式Google SSTable(一個持久化、排序、不可更改的Map)格式,SSTablee使用塊索引定位資料塊,索引存儲在記憶體中,查詢複雜度O(1)。使用分布式鎖Chubby(Zookeeper的鼻祖)。Chubby使用Paxos算法保證副本一緻性。目錄或檔案為一個鎖,讀寫原子。用戶端和Chubby使用會話維持連接配接,租約到期會話失效。通過回調函數實作通知。

Master職責:

1 配置設定,檢測Tablet以及對Tablet進行負載均衡;

2 對GFS檔案進行GC;

3 建立表和列族。

客戶程式直接和Tablet通信,Master伺服器負載很輕。

經驗:很多Single-Master類型的分布式存儲系統都是這樣設計的,用戶端讀取的資料都不經過Master。

撸論文系列之——Bigtable

我們使用三層、類似B+樹的結構存儲Tablet的位置資訊。RootTablet永遠不可被分割。

一般通過預取Tablet位址進一步減少通路開銷。另外還存放事件日志。

一個Tablet隻能配置設定給一個Tablet伺服器。Master記錄Tablet的配置設定情況,Chubby跟蹤記錄Tablet伺服器的狀态。通過獨占鎖對Tablet伺服器進行監控。

撸論文系列之——Bigtable

Tablet持久化資訊儲存在GFS上。更新操作送出到Redo日志中。最近送出的更新存放在排序的緩存即memtable;較早的存放在SSTable(冷熱分離)。SSTable的索引放在記憶體裡,通過重複Redo Point之後送出的變更重建memtable。

寫操作先通過Chubby中讀取出來的具有寫權限的操作者清單進行驗證,然後修改,最終記錄在送出日志中。可采用批量送出實作吞吐量的提升。寫内容插入到memtable裡。

合并和分割Tablet時,讀寫操作不受影響。

每一次Minor Comapaction都會建立一個新的SSTable。合并所有的SSTable并生成新的SSTable的Merging Compaction稱作Major Compaction。不包含已經删除的資訊或資料。

最後要講的是Bigtable的性能評估。

撸論文系列之——Bigtable

在序列寫的基準測試中,使用的列關鍵字的範圍是0到R-1。這個範圍又被劃分為10N個大小相同的區間。随機寫入基準測試采用類似方法,除了行關鍵字寫入前先做Hash,采用按R取模的方式,保證了寫入的工作負載均勻分布在列存儲空間内。随機讀和随機寫類似。

提升:由于Tablet伺服器數量由一台增加到500台,吞吐量有了極大的正增長,倍率超過了100。可以得出結論,基準測試的瓶頸是單台Tablet伺服器的CPU。但有一個問題就是基準測試程式産生的負載會有波動。随機讀性能随Tablet伺服器數量增加的幅度也是有一定限制的。當增加過多伺服器時,每1Kbyte的讀操作都會導緻一個64KB大的Block在網絡上傳輸,消耗了共享的1GB的鍊路導緻。

經驗教訓:

1 很多類型的錯誤都會導緻大型分布式系統受損。設計系統的部分功能時,不對其他部分功能做任何的假設;

2 徹底了解一個新特性之後才能決定是否要添加;

3 系統級監控非常重要;

4 簡單設計的價值。

繼續閱讀