这个论文是2006年发表的,当时我还在读高二吧。据论文中所说,BigTable是在03年左右开始的,花了两年多时间,不包含测试的代码在10w行(应该是C++)。

BigTable是什么?分布式存储系统,设计目标是能够处理大到PT级别的数据量,能够支持数千台服务器的集群。应用场景包括不同数据量(url到网页到卫星图片),吞吐型(批处理),低延迟型(实时查询)。BigTable在处理这些各种各样的场景时,表现出了灵活性和高性能。

BigTable

  1. 设计思路和特点
  2. 主要优势,怎么实现的
    • 怎么可靠可伸缩
    • 高性能
    • 多场景
    • 高可用
    • 一致性
  3. 启发

BigTabe特点:

  • 能够可靠地伸缩
  • 简单的数据模型
  • 非严格的关系型
  • 数据结构和格式能够动态变化
  • 客户端能够对数据底层存储的局部性作出合理推测
  • 客户端参数能够指定是否从内存而不是硬盘中读

数据模型

BigTable是稀疏的、分布式、持久化的、多维有序map(原文:A BigTable is a sparse, distributed, persistent multi-dimensional sorted map.)。map的key是row key、column key和timestamp,value是字节数组。

1
(row:string, column:string, time:int64) -> string

论文中说采用这种数据模型,是在研究了多种可能的使用场景后确定的。最典型的网页存储,用url作row key、相关信息作column,网页内容放在content这一列下,包含带有时间戳的不同时间采集的各个版本。

Rows

row key是字符串,最长支持到64kb。

在同一个row key下,对数据读写操作是原子的。

BigTable按照row key的字典序maintain data。

BigTable会按照row key的range来分区,一个range叫做一个table。tablet是负载均衡和分布式的最小单元。

Column Families

这里为了方便描述,要发明一些(自己的)术语。

列键标识一列,列族标识一组列键。列族是访问控制的基本单元。

列族中的数据通常是同一个类型,在BigTable中是压缩存储。

一个table下,列族最多支持数百个,列键数量则无限制。

列键的命名格式是:familiy:qualifier

列族的名字必须是printable的,qualifier则可以是任意的。

访问控制、磁盘和内存审计都在列族层面。

timestamp

BigTable用时间戳标识数据的多个版本,各个版本按时间戳倒序存储。

时间戳的格式是64 bit整数,精确到微秒。

时间戳可以由客户端自己生成。

BigTable支持两个列族粒度的参数,来用不同策略对比较老的数据版本作垃圾回收:一是保留最近n个版本,二是保留最近某段时间,比如最近7天。

API

BigTable提供了两种API,一是表和列族的操作,二是管理集群、表、列族的元数据,例如访问权限控制。

客户端支持,写/删除value,对单行查找value,遍历某个子集。

RowMutation对单行数据作更新。

Scanner支持遍历操作。

其他的复杂操作:

  1. 单行事务
  2. 允许单个cell作计数器
  3. 支持在服务器上只读脚本(Sawzall语言)
  4. 和MapReduce集成,作为MapReduce的输入输出

构件

BigTable使用GFS来存储日志和数据文件。

BigTable运行在Google的共享机器池中,依赖公共的集群管理系统(任务调度、资源分配、故障处理、监控)。

BigTable内部使用Google的SSTable结构来存储数据。SSTable是持久的、有序的immutable map,key和value都是任意字节串。
SSTable支持查找、特定key range的遍历。SSTable包含多个blocks,一个block包含64KB。SSTable包含一个block index来快速定位block。block index在SSTable打开时加载到内存中。一次查找只需要一次磁盘seek,首先在内存中找到block,然后读取该block。SSTable也可以配置成完全内存加载方式,避免磁盘操作。

BigTable结构

逻辑上是多维的有序map,维度包括:row, column family, timestamp。既然是map,维度就是key,value是字符串。其中column family可以有多个(最多数百个),每个column family可以不限数量。

论文中以一个存储网页数据的表WebTable为例,

  • row是倒序的hostname,例如com.yajunw.www
  • column family有两个
    1. 第一个是content:
    2. 第二个是anchor:,它下面有两个column: a.com, b.com
  • timestamp是在横向的,每个value都会有一个timestamp,可以标识数据的版本。
  • value是某个时刻的网页文档数据。

权限控制是到column family这个粒度。

BigTable没有支持完整的关系型数据模型。
BigTable只支持行级事务。
BigTable最多支持2^61(2048PB)的数据量(猜测这个级别可能是不够用的)。

BigTable提供两个配置:保留最后多少个版本,或者保留最近多少时间的版本。有垃圾回收机制,去做清理和释放空间。

BigTable解决特定问题而发明的,并不是闭门造车的结果。BigTable不能替代关系型数据库。

BigTable依赖Chubby,可用性因此也有一定程度依赖Chubby。

BigTable某些特点似乎是针对网页存储而设计的。