2008TOCS-Bigtable: A Distributed Storage System for Structured Data

标题:Bigtable:结构化数据的分布式存储系统

今天来学习下大名鼎鼎的Google Bigtable的原论文,在当年称之为Google的三驾马车之一,是后面Hbase, Cassendra等等KV-store的开山之作。

Abstract

Bigtable有下面一些能力:

  • 扩展能力:PB级别数据,数千台服务器
  • 灵活性:可服务于各种数据类型,各种延迟需求(批处理到线上服务)

1. INTRODUCTION

  • Bigtable像是一个数据库,但是不提供完整关系模型,只提供一个简单的数据模型,具体的数据属性要靠用户来推理。Bigtable只把数据当成无法解释的字符串。
  • 用户可以通过scheme设计控制数据的局部性,也可以动态控制数据在内存还是在磁盘。

2. DATA MODEL

行、列、时间戳决定一个Cell,一个cell存一个值。

  • 行:行按照Row key的字典序存储,row key是任意字符串。
    • 行是事务一致性的基本单元,一个事务只能读写一行,对行的更新都是可串行化的。
    • 连续的多行构成一个tablet,tablet是负载均衡的基本单元。因此行键的设计可以决定数据局部性。每个tablet大约1GB。
  • 列:列会聚集成列族,列族是预先定义好的。列族一般很少,列的数量则不作限制。
    • 列族是访问控制(权限之类的)和审计的基本单位;
    • 正因为列族数量十分有限,所以也限制了meta data不会很大。
  • 时间戳:每个cell数据的版本。

3. API

Bigtable的API主要是对表中行的更新和其它操作,以及对整个列族的Scan。

4. BUILDING BLOCKS

Bigtable用GFS作文件存储。文件格式是SSTable。锁服务用一个叫Chubby的软件,也是Paxos的一种实现【编者:在Hbase中,Chubby的任务应该由zookeeper来完成】。

  • SSTable:不可变的key-value文件格式
    • SSTable统一按照key排序;
    • 由一系列blocks组成(每个默认64MB),每个block有index在内存中,指明key的范围;
    • 查询时首先在内存定位block,然后顺序读取块即可。

5. IMPLEMENTATION

Bigtable是主从架构,一个库可以用于连接每个客户端,一个master,许多tablet servers。

  • master负责保持和tablet servers的联系,把tablets分配给tablet server,做负载均衡,回收掉过期数据,处理scheme change。
    • 由于tablet位置不在master上,所以很多client的数据大部分不经过master,直接和tablet server沟通。这样master的负载是非常轻的。
  • tablet server一般负责几十到几百个tablets,处理其上的读写请求,当tablet过大时会对其进行分裂。

5.1 Tablet Location

Tablet位置不在master,那在哪里呢?请看下图:

  • METADATA tablet一行管一个用户表中的tablet位置。也会有一些其它的log信息.各个tablet的breakpoint(文中称redo point)也存在这里。
  • METADATA的Row key就是表名+某个tablet末尾的row key的一种编码。METADATA tablets全都在内存,只有MB级别,非常小。
  • 客户端库会对tablet位置做缓存,如果缓存空的话,就要3次网络调用了,但由于在内存中就不涉及磁盘读取。除此之外,客户端库还会做预测读。都是为了减少寻址开销。
image.png

5.2 Tablet Assignment

【编者:这部分更多是容错、分布式协议的部分,编者能力有限,略述之】
tablet分配是master来做,它发现哪个server有空间,就把这个tablet塞给他,除非那个服务器挂了,否则必须接受干活。

  • 每个tablet server在Chubby上有一个文件,只有这个Server有这个文件的互斥锁;master通过周期性的问tablet server其锁状态来跟踪这些服务器。
  • master一旦发现谁失联了,会确认它是不是死了(Chubby上的文件是不是丢了),文件如果都没了的话,master就把它的tablets重新分配。

tablets发生变动的情况有4种:建新表,删表,小tablets合并,大tablets分裂。
前三个都是由master来初始化的,但是分裂是由tablet server初始化的。所以这里涉及一个通知master的问题。

5.3 Tablet Serving

所有更新操作首先写log,然后进入memtable,memtable也是按照row-key排序的。

  • 恢复:tablet server一旦宕机,恢复时首先从METADATA tablet中读到自己负责哪些tablets,breakpoint在哪里,然后根据本地的log恢复memtable。
  • 插入流程:首先是鉴权(鉴权信息各个tablet servers都会缓存的),然后写log,提交好之后写入memtable。
  • 读取流程:首先是鉴权,然后以统一的视角看待memtable。因为row-key是排好序的,所以读取时候可以迅速定位读取。
  • 读写在tablets分割和合并过程中均可以持续,在compaction过程也可以持续。

5.4 Compactions

  • minor compaction: 当Memtable写满之后,立即冻结,然后启用一个新的memtable继续服务。老的要刷写到SStable中,即写回文件系统。每次刷写都要创建一个新的SStable。
  • merging compaction:如果只有minor compaction的话,那么做一次读,要从任意多个SSTable中的数据做整合。解决方法是限制SSTable的数量,做merging compaction。一次merging compaction将读取几张SStables和memtable,写入一个新的SStable。
  • major compaction:如果读取了全部SStables然后写入一个新的SStable,则称之为major compaction。major compaction会消除所有的更新和删除,变成最干净的数据。major Compaction由Bigtable定期轮询所有tablets执行。

因为数据写入时总之要写进GFS里,GFS会优先在writer服务器上写一份,所以tablet server上肯定会有自己负责的tablet上的数据,这为读取时提供了方便,省去了网络通信和网络带宽。

6. REFINEMENTS

本节讲调优。

6.1 本地组

本地组其实指的就是一个列族,其目的是不同列族之间往往不需要一起查询,设置本地组就可以在概念上隔离开不同的列族。这样很多参数就可以针对本地组来设置。

  • 一个例子,METADATA table中的tablet-location列族,就被单独设置为在内存中,但是tablet-breakpoint就没有这样的设置。

6.2 压缩

压缩选项也针对于每个本地组。压缩对象是SStable的每个block。压缩算法暂时略过。

6.3 缓存

tablet-server的数据缓存分两个层级,Scan Cache是缓存返回的数据,Block Cache缓存从GFS里读上来的块。

6.4 布隆过滤器

如果SSTable比较多的话,那么每次读总是要读所有SStable才能得到数据确切的信息,这会造成许多磁盘访问。优化方法是引入布隆过滤器。用户可以为列族使用布隆过滤器,用于检验row/column对是否存在于指定列族。效果显著。

6.5 日志

如果为每一个tablet用单独的log file,那么log file就会太多,从GFS的层面来看,会有很多并发地写。解决方案就是一个tablet server用一个大的log file,所有tablet的修改全混在这个log file里面。

  • 恢复问题:这种方法对于CRUD是方便了,但是恢复就麻烦了。当一个tablet server挂掉,它负责的tablets就会分散到很多其它tablet servers上。新服务器要像恢复tablet的状态,只能通读一遍原先的大log file,然后找出有用的执行。这太费时了。
  • 新的回复算法:一个聪明的办法就是先把log file排序,按照〈table,row name,log sequence number〉的顺序,这样一个tablet负责的log record一定在连续的范围内,就不用重复读了。排序由master协调,作分布式的归并排序。
  • 为了避免GFS写出现一些拥塞问题,实际上每个tablet server有两个写日志的线程,也有两个log file,一个慢的话就换另一个。

6.6 无恢复迁移

tablet迁移到不同的服务器上是常事,如果能避免tablet在新服务器上加载时要先执行恢复的话,能节省很多时间和流量。
具体方法是要卸载一个tablets时:

  1. 做一次minor compaction
  2. 停止这个tablet的服务
  3. 做第二次minor compaction
  4. 无恢复迁移

6.7 SStable不可变性的好处

  • 读写分离:SStable只会有读,不会有写,那就完全不用管事务方面的隔离性,天生就可以同步读。
  • 删除变成了文件整合:SStable通过major compaction实际执行删除操作。由于tablets对应的SStable在METADATA table中也有信息,这部分用标记清除法删,由master来处理。
  • 分裂方便:两个孩子共享父亲的SStables,而非创建一组新的SSTables。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容