Google BigTable阅读笔记(三)

5.实现
BigTable包括三个主要组件:可链入客户端程序的库、一个Master服务器和多个子表(tablet)服务器;针对系统的负载情况,能够很容易的向集群中添加和删除子表服务器。
Master服务器主要负责以下工作:
(1)为子表服务器分配子表;
(2)检测加入或者失效的子表服务器;
(3)均衡子表服务器负载;
(4)对GFS上的文件进行垃圾回收;
(5)相关schema的修改与维护;
Tablet服务器主要负责的工作:
(1)管理子表集合;
(2)子表的读写处理;
(3)子表过大时,自动分隔;

和大部分的单Master分布式系统类似,数据流均不经过Master服务器,客户端直接和Tablet服务器通信,进行数据的读写。
BigTable的客户端程序不必通过Master服务器来获取子表的位置信息,大多数客户端程序甚至完全不用和Master交互。
一个BigTable集群存储了很多表,每个表包含一个子表集合,而每个子表包含某个范围内行的所有数据。初始状态下,每个表只有一个子表,随着数据量的增长,子表会自动分割为100M级别的多个子表。

5.1子表的位置
使用一个三层、类似B+数的结构存储子表的位置信息。

Google BigTable子表位置信息

图二:子表位置信息存储
(1)第一层是一个存储在Chubby中的文件,包含根子表(Root Tablet)的位置信息。
根子表包含了一个特殊的元数据(metadata)表里所有的子表位置信息。元数据表的每个子表包含一个用户子表的集合。
跟子表实际上是元数据表的第一个子表,它被特殊处理过–它永远不会被分割;
(2)第二层是其它各个元数据表,每个子表的位置信息都放在一个行关键字下面,这个关键字由子表所在表的标示符和子表的最后一行编码而成;
(3)第三册是用户子表表的位置信息;
客户端会在树状的存储结构查询子表的位置信息,并缓存这些信息。

5.2子表分配
任何时刻,一个子表只能分配给一个子表服务器。Master中记录了哪些可用的子表服务器,哪些子表分配给了哪些子表服务器等元信息。
当一个子表没有被分配,且某个子表服务器有足够的空间来装载子表,Master会发送装载控制指令给该子表服务器,完成子表的分配。
BigTable使用Chubby跟踪子表服务器的状态,当一个子表服务器启动时,在Chubby的指定目录下会创建一个唯一的文件,代表独占锁。
Master服务器实时监控这个目录,便能知道是否有新的子表服务器加入。如果丢失了独占锁,例如断网、会话丢失、子表服务器自然终止,就认为该子表服务器其停止了子表的服务。
此时Master服务器就会尽快的把子表分配给其他的子表服务器。
如果子表服务器挂掉之前来不及释放自己的独占锁也没有关系,Master会有定时心跳,尝试与子表服务器通信,若无回应,Master会主动解除Chubby上的文件锁。

Master启动时,必须要了解当前子表的分配状态,之后才能修改分配状态,启动步骤为:
(1)Master从Chubby获取唯一的Master锁,以防止集群进入其他的Master;
(2)Master扫描Chubby文件锁目录,获取正在运行的子表服务器列表;
(3)和所有子表服务器通信,获取所有子表分配信息;
(4)扫描元数据表获取所有子表的集合;

5.3子表服务

Google BigTable子表服务

图三:子表服务
如图所示,子表的持久化信息是保存在GFS上的。所有更新日志提交到重做(REDO)日志中。在这些更新操作中,最新提交的那些数据存放在一个排序的缓存中,我们称这个缓存为memtable;较早的更新存放在SSTable中。
为了恢复一个子表,子表服务器首先从元数据表中读取它的元数据,元数据包含组成这个子表的SSTable的列表,以及重做点(REDO point)的集合,这些重做点指向可能含有该子表数据的已提交日志。
子表服务器把SSTable的索引读进内存,通过再次执行重做点之后提交的更新再重建memtable。
(1)对子表服务器的写操作步骤:
检测操作格式,例如完整性;
检测发起者权限;
记录成功操作的日志;
写的内容插入到memtable里。
(2)对子表服务器的读操作步骤:
完整性与权限检查;
合并SSTable与memtable视图完成读数据的合并;

5.4数据压缩(compactions)
数据压缩分为三种:
(1)最小化压缩;
(2)合并压缩;
(3)最大化压缩;

随着写操作的执行,memtable的大小不断增加,当达到一个门限值时,就不再增长,而是转化为SSTable,写入GFS,这种压缩成为最小化压缩(Minor Compaction)
最小化压缩的目的:
(1)限制使用内存:memtable是在内存中的,必须限制大小;
(2)容灾恢复时,减少日志读取量:memtable中的数据是易失的,灾难恢复时,结合SSTABLE+最新的日志就能恢复所有数据;

每次最小化压缩会创建一个SSTable,如果一直实施最小化更新,创建更多的SSTable,则可能导致读操作来临时要读取多个SSTable上的更新数据以获取最新的结果;
解决该问题的方法是:定期后台合并SSTable和memtable的内容,组成的新有序SSTable,这个过程叫合并压缩(Merging Compaction),合并压缩完成后,合并之前的SSTable和memtable就能够被删除了。

合并所有SSTable的合并压缩称为最大化压缩(Major Compaction);最大化压缩是为了解决合并压缩中可能存在被删除数据。
BigTable定期循环扫描所有子表,执行最大化压缩。这种机制允许BigTable按时回收被删除的资源。

评论关闭。