原文地址:http://blog.sina.com.cn/s/blog_3fc85e260100bon7.html

云计算的分布式表格系统依赖于下层的分布式文件系统(如Google的GFS)提供可靠和高效的数据存储,也是分布式文件系统的主要使用者。本文以Google的Bigtable为例来介绍云计算的分布式表格的基本结构,其数据模型是:

(row : string, column : string, time : int64) -> value : string

        行(row)

行(row)是二进制串,最大长度为64KB(实际应用中,大部分行字符串为10~100字节)。对统一行内的数据的读或写总是原子的。分布式表格系统总是把整个表格按行(row)排序(字典序),然后按整行动态切分,每个切分后的块称为一个子表(tablet,在Google的Bigtable中,每个子表一般不超过256MB),子表也是分布式表格系统的worker加载/卸载和负载平衡的基本单元。在网页库表格中,行(row)是网页的URL,但其中的域名部分被颠倒了,例如maps.google.com/index.html变成了com.google.maps/index.html,这样使得域名相似的网页聚集在一起,由于域名相似的网页在内容上往往有一定的相似性,因此可以产生更高的压缩倍率,并使得一些应用程序更加高效。

        列(column)

列按列族(column family)分组,同一列族内的单元格的内容常常相同,并用修饰词(qualifier)区分不同的单元格,即column = “family:qualifier”。一个表格内的列族个数是有限的(例如最多上百个)且一般由可打印字符组成,但修饰词(qualifier)的个数没有任何限制且可以是任意字符。例如,网页库表格中,content(网页内容)可以是一个列族,language(语言)可能是另外一个列族。出于进一步的性能优化的考虑,Bigtable还允许用户把内容相似或相关的列族组成局部群组(locality group),同一局部群组内的列族的数据常常存放在一起,这样可以加快它们的访问速度;用户还可以把某些局部群组设定为装入内存,这样访问这些群组时就不需要访问磁盘。

列族是权限控制的基本单元:有些用户可以添加新数据、修改已经存在的数据,有些用户只能读已经存在的数据,还有一些用户连已经存在的数据都不能读。

局部群组则是数据压缩的基本单元,用户可以对不同的局部群组指定不同的压缩算法或者同一压缩算法的不同参数,等等;

        时间戳

时间戳是64位整数,可以用来表示真正的时间(例如网页抓取的时间),这时它的单位是微秒,时间戳也可以是用户指定的任意值。Bigtable允许用户(针对列族)指定保存最新的多少个时间戳版本或者从现在起多长时间内的版本(如一周以内所有版本),例如,在网页库表格中设置为保留最新的3个版本,超出的版本则被垃圾回收;

 

Bigtable采用了3层B+树结构来存储表格数据,第三层为用户数据层(user data tablets),第二层为元数据索引层(metadata tablets),用来索引用户数据tablets,第一层为根索引层(root tablet),用来索引第二层数据。根索引层和元数据索引层的主要数据被设置为装入内存,应用程序需要访问用户数据时,Bigtable会根据需要依次访问root tablet和metadata tablets,这使得系统仅仅在访问用户数据时才访问磁盘。

 

云计算的分布式表格系统是其中相对比较复杂的部分,这里以Bigtable为例做了十分简单的描述,后续文章还会有比较详细的叙述。

 

作者:阳振坤 (yangzhenkun@gmail.com)

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐