唯有前进值得敬仰

---等得越久,相聚时越幸福
posts - 28, comments - 27, trackbacks - 0, articles - 0
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

BigTable小结

Posted on 2011-08-31 23:16  绿豆芽33  阅读(...)  评论(...编辑  收藏

读完Bigtable论文小结一下。


对于Bigtable的整体理解 

BigTable将数据存储分为两部分:最近的更新存储在内存(memtable)中,较老的更新则以SSTable的格式存储在GFS,后者是主体部分,不可变的数据结构。写操作的内容插入到memtable中,当memtable的大小达到一个阈值时就冻结,然后创建一个新的memtable,旧的就转换成一个SSTable写入GFS

读操作时还要综合考虑memtableSSTable,如果写操作时产生的SSTable越来越多,就会影响读性能。于是采用merging compaction——读取一些SSTablememtable的内容,合并成一个新的SSTable,之后删除被合并的SSTablememtable的内容。还不够的话就合并所有的SSTable到一个新的SSTable,即major compaction

1.功能性描述

Bigtable不支持关系数据模型,它提供的数据模型允许客户控制数据的分布和格式,数据没有模式(schema),由用户自己定义。用户可以推测底层存储数据的位置相关性,在读取数据的时候可以一次预取出来。

Bigtable将存储的数据都视为字符串,由行和列关键字索引数据。通过Bigtable的模式参数可以控制数据是存放在内存中、还是硬盘上。

2.数据模型

Bigtable是一个多维度的有序的map。由行列关键字和时间戳索引。行关键字可以是任意字符串,对一行的读写操作是原子的,不管该行有多少列。按行划分table,产生一些tablets,一般是连续的几行有一定的相关性,这样可以获得局部好的特性。列关键字可以分组归类,列族。一个列族内的数据一般具有相同的类型,可以进行压缩。列关键字命名使用“列族:标识”的形式。时间戳用来标识数据的不同版本。

3.底层

Bigtable内部存储数据的文件是SSTable格式的,SSTable是一个有序的不可更改的map结构。从内部看,SSTable包含是一系列数据块,使用存储在SSTable最后的块索引来定位数据块。

Bigtable还依赖一种分布式锁服务Chubby。BigTable怎样使用Chubby的锁服务的?

4.tablet位置信息

为了管理巨大的table,把table按行分割,这些分割后的数据统称为tablets。tablets分布存储到计算平台中的任意机器上。对tablet位置的索引是怎样完成的呢?采用三级层次建立对tablet的索引:

第一层是存储在chubby中的一个文件,包含了root tablet的位置,root tablet是METADATA表的第一个tablet,它包含了METADATA表的所有其他tablets的位置。每一个METADATA tablet包含了一组user tablets的位置。

METADATA表的每个tablet的位置位于行关键字的下面,这个行关键字由tablet所在的表的标识符和tablet 的最后一行编码而成。

client library caches tablet locations问题:client怎么得到的tablet locations。

5.tablet分配

master服务器记录当前有哪些活跃的tablet服务器,哪些tablet分配给了哪些tablet服务器,哪些tablet还没分配。当一个tablet还没被分配并且刚好有一个tablet服务器有足够的空闲空间装载该tablet时,master服务器就会向这个tablet服务器发一个load请求,把tablet分配给它。

大体过程:

master服务器从chubby抢占一个唯一的master锁(阻止创建其他的master服务器实例);

master扫描chubby的服务器目录(当一个tablet服务器启动时,在chubby的一个指定目录下创建一个名字唯一的文件,并获得该文件的独占锁),获取当前正在运行的服务器列表;

master服务器和列表中的所有tablet服务器通信,获取每个tablet服务器上的tablet分配情况,如果发现root tablet还没分配,master将其加入未分配的tablet集合;

master服务器扫描METADATA table获取tablet集合,扫描过程中如果发现某个tablet尚未分配,master就将其加入到未分配的tablet集合中。

master服务器负责检查tablet服务器是否还能为它的tablet提供服务,并尽快重分配它加载的tablet。master通过周期地询问tablet服务器它的文件锁状态,如果一个tablet服务器报告它丢失了文件锁,或者master经过几次尝试不能与它通信,那么master就尝试获取该tablet服务器文件的独占锁。获取成功则删除tablet服务器在chubby上的服务器文件以确保不再提供服务,一旦删除,master就将原来tablet服务器上的tablets放入未分配的tablet集合中。

6.

Tablet的更新操作事件提交到一个commit log that stores redo records(恢复tablet时使用),最近提交的内容则存放到memtable中,较早提交的更新则存放到一系列SSTable中。

写操作:写操作请求到达tablet服务器时,tablet服务器首先检查操作格式、操作权限。有效的修改操作记录到commit log中,写的内容则插入到memtable中。

读操作:也要先检查,有效的读操作在一系列SSTable和memtable的合并视图中执行。

minor compaction:

随着写操作的执行,memtable的大小不断增加,当达到一个阈值时就冻结,然后创建一个新的memtable,旧的就转换成一个SSTable写入GFS。

每一次minor compaction都会产生一个新的SSTable,持续下去的话读操作可能要合并相当多的SSTable,解决的办法是定期地在后台执行merging compaction——读取一些SSTable和memtable的内容,合并成一个新的SSTable,之后删除被合并的SSTable和memtable的内容。

major compaction:

合并所有的SSTable到一个新的SSTable的megingcompaction过程叫major compaction。BigTable循环扫描它所有的tablets,定期执行major compaction。

7.优化

划分局部性群组

压缩——SSTable分块压缩,读一部分数据时无须解压缩整个文件;两遍压缩

缓存提高读性能——两级缓存,扫描缓存和块缓存

bloom filters——读操作时要读组成一个tablet状态的所有SSTable,利用bloom 

filter过滤SSTable是否包含特定的行列信息。

commit log——每个tablet服务器一个commit log,两个线程写。

加速tablet恢复:

master把一个tablet从一个tablet server移到另一个server时,源server先对tablet做一次minor compaction,之后源server停止对该tablet的服务,但在卸载该tablet之前还要再做一次minor compaction以消除上次执行minor compaction时残余的未压缩的记录。

利用不变性——memtable是唯一一个能被读和写操作同时访问的可变数据结构,为了减少读操作的竞争,采用写时复制技术允许读写并行执行。