BigTable论文学习笔记
1,Data model
BigTable是一个稀疏的、分布式的、持久化存储的多维度排序Map。Map以row key、column key和timestamp为索引,值一个byte数组。
Row key是任意字符串(最大64K),对于一个row key下的数据读写都是原子的。
Row key是以字典顺序排序的。表的Row range是被动态划分的。每一个row range都叫一个tablet,tablet是分布存储和负载均衡的最小单位。
有一定关联的Column key组成一个集合叫column family。在存储数据到表之前必须先定义column family。一个表中column family数量要尽可能的少,而且一旦建好就尽量不改动。一个column key用如下的语法声明:
Column family:qualifier
Column family必须是可打印的字符串,而qualifier可以是任意字符串。
Timestamps。相当于版本号,是一个64位的整数。Bigtable中的每一个值都有一个版本号,当新值覆盖旧值时,旧值不会删除,新值将有一个更新的时间戳。Bigtable每次读取时间戳最新的值。旧值是可以被bigtable垃圾回收的。
Hbase的结构与bigtable相同,在hbase里定义表时要指定表的column family,例如定义一个test表,它有一个column family叫“cf”,则用如下形式:
Create 'test','cf'
Google用SSTable文件格式存储BigTable数据,它是键值对的集合。一个SSTable内部由一些block(一般是64K,可配置)组成,SSTable的最末端存有一个block index,是前面所有block的索引,当一个SSTable被打开时,这个索引就被加载到内存中。这样一个查询就可以由一次磁盘读操作完成,首先根据block index定位block,从磁盘中读出block后就可以遍便block中的键值对了。
Chubby
BigTable依赖于一个高可用性的、分布式的锁系统Chubby。Chubby 相当于HBase中的zookeeper。Chubby服务由5个活动的冗余服务组成,其中有一个叫master。多数服务器处于活动状态且能相互通信,那么chubby服务就是有效的。一旦有服务器失败,那么chubby用Paxos算法保持各服务之间的一致性(zookeeper用的另外的算法)。Chubby中一个文件或目录就是一个锁,读写这些文件时都是原子操作。
每个Chubby客户端维持一个与服务器的会话。如果在规定时间内客户端不能重建与服务器的连接则Chubby客户端和服务器的会话失效。当会话失效时,客户端失去锁和句柄。客户端可以注册回调函数,当Chubby文件或目录有变动时可以通知客户端。
BigTable使用Chubby:1)保证任何时刻只有一个有效master。2)存储BigTable data引导程序的位置。3)发现tablet server,并判断tablet server是否有效。4)存储BigTable的模式信息(每一个table的column family信息)。5)存储访问控制列表。
BigTable 实现
BigTable有三个组成部分:1)与每一个客户端连接的库(client library) 。2)一个master server。3)多个tablet server。Tablet server可以动态添加到机群中。
Tablet 定位
Tablet是存储在三层B+树中的,第一层是root tablet,第二层是METADATA table,第三层是用户表。实际上第一层的root tablet就是METADATA table的第一个tablet,处在第二层的是METADATA表的其余的tablet。Root tablet存储METADATA表中tablet的位置,METADATA的tablet则存储用户tablet的位置。
Tablet分配
Master是如何分配tablet 给一个tablet server的。BigTable用Chubby来追踪tablet servers.Tablet server启动时会在Chubby上创建一个不重名的目录并且申请得到目录的互斥锁,master通过监控这些目录来发现活动的tablet server.当tablet server失去锁时,它停止为tablet服务.只要tablet server在chubby上的文件存在,它就试图重新获得锁,如果文件不存在,就杀死自己并且master会分配它管理的tablet到其它的tablet server上.master会定期查看tablet server的状态,如果tablet server回复锁丢失或者master不能连通tablet server,master会试图得到tablet server在chubby上的文件的锁.master一旦获得了锁就意味着tablet server已经挂掉,master会重新分配它的tablet.当master失去与chubby的联系,所有的tablet分布不会改变.
Master启动过程
master启动时先检查所有tablet的分布情况,然后才能修改它们.检查时将执行如下步骤:
1)获得chubby上的唯一的master lock
2)master扫描chubby上的server directory 来发现运行的server
3)master与每一个运行中的tablet server通信来获得所有已经分配给他们的tablet
4)master扫描METADATA table获得tablet集合的情况.一旦遇到未被分配的tablet,就把它加入到未分配tablet集合中,等待被分配.
以上都是读BigTable的笔记。