BigTable 是搭建在 GFS 之上的结构化数据的存储系统,其作用主要是作为分布式的 NoSQL。
在 GFS 和 Chubby 的基础上在工程中实现了 LSM-Tree。
数据结构
实际上就是 KV
Key:row+column+timestamp value:blob
因为需要支持不同的使用场景,所以将列作为查询的 key 的组成之一,以将较大的数据拆成多个小数据
table = tablets tablet = SSTables SSTable = sorted KVs
LSM-Tree 的主要思想是保存一系列在后台自动合并的多层 SSTables 和基于内存的 MemTable。 SSTables 会生成一些比较稀疏的索引,可以依此进行范围查找, 在查找之前想用 Bloom 过滤器过滤请求,防止不存在的键影响 LSM-Tree 的查找效率。 并且还能有不同的策略来确定 SSTables 被压缩和合并的顺序和时间,LevelDB 采用的是平坦压缩,HBase 使用的则是大小分层。 并且因为磁盘写入是连续的,所以 LSM-Tree 可以支持较高的写入吞吐量;读取方面因为有索引,并且 SSTable 内部是有序的,所以也不会很慢; 而更新和删除不太一样,因为落盘的 SSTable 是不能更新的,这个时候就可以在 MemTable 上进行更新和删除(标记),当 SSTables 要 Merge 的时候再实际落盘。
BigTable 细节
Bigtable 由三个组件组成:
- 客户端连接库
- one master server
- many tablet servers
table servers 可以自动被添加或删除;master 需要分配 tablets 到 tablet servers,保持负载均衡和 gfs 的 GC,并且维护行列新增的键。
每个 tablet server 管理 10 到 1000 个 tablets。
与大部分 single-master 类似,client 的数据传输不会通过 master,而是与 tablet servers 直接交流。
Bigtable cluster 包含很多 tables,每个 table 包含很多 tablets,每个 tablet 包括某行的所有数据。每个 table 最初只有一个 tablet,当其增长的时候,自动分裂成多个 multiple tablets,每个 tablet 大概 100-200MB。
tablets 的位置信息由一个 Chubby file 延伸到一个 Root Tablet,再到 MetaData Tablets,最后再指向 UserTables。