0. Abstract
Bigtable是一个存储pb量级结构化数据的分布式存储系统。google外部很多我的项目都在应用Bigtable,包含web indexing、Google Earth、Google Finance等,这些利用在数据大小、提早要求等方面对Bigtable的要求各不相同。Bigtable胜利的提供了一个灵便的、高性能的解决方案。本篇论文形容了Bigtable提供的数据模型,以及Bigtable的设计与实现。
1. Introduction
次要是一些概括性的内容,以及对前面各节次要内容的详情。
2. Data Model
Bigtable是一个稠密的、分布式的、长久化的多维度有序map。这个map被row key、column key和一个工夫戳索引,map的每个value是未解析的字节数组,即:
(row:string, column:string, time:int64) -> string
row key是任意的字符串(目前的下限是64KB,对于大部分使用者而言10-100 bytes够了)。单个row key下的单次读或者写是原子的(即便是不同的column),这样设计的起因是为了让客户分明并发更新雷同row时的零碎行为。
Bigtable依照row key的字典序保留数据。表的row range动静分区,每个row range被称为tablet,是散布和负载平衡的单位。因而,对short row range的读取很高效,个别仅须要和少部分机器进行通信。客户能够利用这个性质,通过抉择适合的row keys达到对数据拜访良好的局部性。
column keys被组织为column families,是管制的根本单位。保留在同一个column family的所有数据往往领有雷同的类型,一个表中反对较少的column families(最多几百个),并且很少扭转。相同的,一个表能够领有的column没有下限(从设计上来说)。
一个column key的名字应用如下语法:family:qualifier。column family的名字必须是可打印的,而qualifiers能够是任意字符串。
timestamps是一个64-bit的整数。Bigtable中能够保留一份数据的多个版本;这些版本通过timestamps索引。timestamps能够由Bigtable赋值(real time),也能够由客户利用显式指定。须要防止抵触的利用须要本人产生惟一的timestamps。不同版本的数据依照timestamp降序存储。
为了更轻松的治理多个版本的数据,Bigtable反对两种垃圾回收策略(在单个column-family外部)。基于工夫的和基于数量的,在此不赘述,见论文原文。
3. API
Bigtable提供了创立和删除table以及column families的函数,也提供了扭转集群、table和column family元数据的函数,比方访问控制权限。
Bigtable反对单行事务,可用来执行原子的读-批改-写操作,但不反对跨行事。本节其余局部略过,见原文。
4. Building Blocks
Bigtable建设在Google其余的基础设施上,比方应用GFS存储日志和数据文件。Bigtable也依赖于集群管理系统来调度工作、治理机器和资源、存储机器谬误、监控机器状态等。
Bigtable的数据应用Google SSTable文件格式存储。一个SSTable提供了长久的、有序的不可变kv map,并且key和value都是任意字符串。每个SSTable外部含有一系列block(每个block个别是64kb,当然这是可配置的)。SSTable的最初存储有block index,可用来定位block。
Bigtable依赖于一个高可用的、长久化的分布式锁服务Chubby(应该是一个相似于zk的零碎,这里不赘述),Bigtable应用它确保master的唯一性;存储数据的bootstrap location(见5.1);发现tablet服务和确定tablet服务death(见5.2);存储Bigtable的架构信息(每个表的column family信息);存储拜访权限列表。
5. Implementation
Bigtable分为三个组件:一个master服务、多个tablet服务、和一个连贯客户端的library。tablet服务能够被动静增加以适应工作负载的变动。接着简要介绍了master服务和tablet服务的工作,见原文。