分布式表格系统Google Bigtable详解
分布式表格系統(tǒng)Google Bigtable詳解
- 概述
- Bigtable架構(gòu)
- 數(shù)據(jù)分布
- 保證
- 副本位置與負(fù)載均衡
- 存儲
- 表的分裂與合并
- 存儲引擎
- 垃圾回收
- 總結(jié)
概述
bigtable系統(tǒng)由表格組成,每行有一個主鍵(Row Key),每行又包含很多列(Column),某一行的某一列構(gòu)成一個單元(Cell),每個單元包含多個版本的數(shù)據(jù)。整體上看,Bigtable是一個分布式多維映射表:
(row:string,column:string,timestamp:int64)?>string(row:string, column:string, timestamp:int64) -> string (row:string,column:string,timestamp:int64)?>string
另外,Bigtable引入了列族(column family)的概念。多個列形成一個列族。其由兩部分組成:(columnh family qualifier)
Bigtable支持時間戳是谷歌上層業(yè)務(wù)的需求。為了簡化不同版本的數(shù)據(jù)管理,Bigtable提供了兩種設(shè)置:
Bigtable架構(gòu)
Bigtable主要由以下幾種服務(wù)組成:
Bigtable主要提供了三種類型的表:
數(shù)據(jù)分布
bigtable底層分為100M-200M的子表,通過一個根表和兩級元數(shù)據(jù)表建立索引。我們假設(shè)平均一個子表為128M,每個子表的元數(shù)據(jù)信息為1KB,那么兩級元數(shù)據(jù)表能支持的數(shù)據(jù)量為128M?(128M/1K)?(128M/1K)=2048PB128M*(128M/1K)*(128M/1K)=2048PB128M?(128M/1K)?(128M/1K)=2048PB
保證
副本位置與負(fù)載均衡
Table Server會定期向Master匯報負(fù)載狀態(tài),如果Master發(fā)現(xiàn)某個Table Server負(fù)載過重,會自動對其進(jìn)行負(fù)載均衡。負(fù)載由很多指標(biāo)構(gòu)成,也考慮了很多現(xiàn)實中遇到的問題(可以在論文中行收balanc了解)。負(fù)載均衡就是將該Table Server中的某些子表遷移到其他Table Server上。
首先Bigtable是構(gòu)建在GFS之上的,所以子表自己不存在replication。子表的遷移實質(zhì)上是當(dāng)前Table Server將所有的mutable數(shù)據(jù)持久化到GFS中,然后掛載到另一個Table Server中(有點像Shared Disk中的備升主)。理所應(yīng)當(dāng)?shù)?#xff0c;遷移的過程中會有短暫的IO停頓。子表遷移前原有的Table Server會對其執(zhí)行Minor Compaction操作(為了縮短停止服務(wù)的時間,可能會有兩次Minor Compaction),然后遷移。當(dāng)然了,發(fā)生遷移最頻繁的場景我認(rèn)為還是recovery,因為文中提到了,遷移子表的這種負(fù)載均衡策略并不是Silver Bullet,在工程上經(jīng)常遇到以下問題:
存儲
表的分裂與合并
一個table只存在于一個Tablet Server上。但是table太大或太小時需要分裂或合并。
存儲引擎
垃圾回收
compaction完成之后,原來的SSTable需要被回收掉。Master會定期執(zhí)行垃圾回收任務(wù)。需要注意的是,對sstable執(zhí)行compaction和修改sstable對應(yīng)的元數(shù)據(jù)這兩個操作不是原子的。需要注意這里面可能造成的數(shù)據(jù)不一致問題。
總結(jié)
Bigtable構(gòu)造在GFS之上,其操作不用考慮底層數(shù)據(jù)的可用性等問題,并且GFS也大大增強了Bigtable的擴(kuò)展性,讓Bigtable的設(shè)計者可以不用考慮底層,更專注于上層的優(yōu)化。但是也存在一些問題:
總結(jié)
以上是生活随笔為你收集整理的分布式表格系统Google Bigtable详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式键值系统Amazon Dynamo
- 下一篇: Windows Azure Storag