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