Data Model
Bigtable从本质上来讲应该类似于一种NoSQL数据库,同时又提供了普通的数据库所没有的接口。它的数据模型如下:
(row:string, column:string, time:int64) -> string
- Row:可以看作每条数据是一行,对一行数据的读写操作是原子的。Bigtable会对row key进行字典序排列,尽管每张表的行范围分区随机,但设计良好的row key就能使相关数据相邻连续排列。读取时也只需要访问少数几台机器。
- Column:column key会被组织成column family,语法是column:qualifier。column family中几个key的取值类型一般相同,设计希望column family是预先设计好的,比较固定,且数量不多(但column的数量不限)。column family是访问控制的最小单位。
- Timestamp:时间戳最重要的功能是记录同一个值的不同版本。同时也能针对column family定义管理机制:只保留多久版本的记录,或保留最近几个版本。
API
Bigtable提供了一系列API供用户进行数据操作。有几个要点:
- 允许使用正则匹配列名,对匹配结果加以限制。
- 支持单行的事务。不支持跨行事务。
- Integer数据可用作计数器。
- 支持在服务器地址空间执行客户端提供的脚本。
Bigtable的一大特点就是支持配合MapReduce使用。
Building Blocks
Bigtable作为比较上层的应用,依赖于一系列Google产品。
首先它的数据和日志文件是存储在GFS上的。
其次,它存储数据的数据结构是Google SSTable,这种数据结构将数据分为小块(64KB),并作索引。方便查找和映射到内存空间。
Bigtable还依赖于分布式锁服务:Chubby。Chubby具有较高的可用性,通常会维持5个分片并选举一个master。使用Paxos算法来保证分片一致性。Chubby提供一个由目录和文件组成的命名空间(namespace),每个目录或文件都可以作为锁,保证读写一个文件是原子操作。使用Chubby,Bigtable可以:
- 保证只有一个master节点(Bigtabled的master节点,可继续看下一章);
- 存储Bigtable数据的bootstrap位置;
- 存储Bigtable的Schema信息;
- 存储Bigtable的access control列表。
Implementation
Bigtable系统由三大部分组成:
- 一个所有客户端连接的library。
- master服务器负责分配分片到分片服务器,探测新加入和过期的分片服务器,均衡分片服务器负载,做GFS文件的垃圾回收,以