Google BigTable阅读笔记(一)

Google Big Table阅读笔记(一)

摘要
Google BigTable是一个分布式的结构化数据存储系统,用来存储海量的数据,这些数据分布在以千计数的普通PC集群上(GFS,MapReduce都是分布在这样的集群上)。
Google有很多项目都使用BigTable存储数据,如Web索引、Google地图、Google金融等。这些应用对存储量、响应速度、吞吐量需求各异,但BigTable还是成功成为一个灵活且高性能的解决方案。

1.概要
BigTable是一个分布式的结过婚数据存储系统,它存储着PB级别的数据。
BigTable的设计目标是:
(1)适用性广;
(2)扩展方便;
(3)高性能;
(4)高可用;

BigTable和数据库比较类似,它的实现参照了很多数据库的实现策略(并行数据库,内存数据库),但它提供了一套完全不同的接口;
BigTable不支持关系型模型,即不支持schema,它提供的模型允许用户动态控制数据的分布和格式;
BigTable视一切数据为字符串,用户可以把结构化或半结构化的数据串行化到字符串里,进行存储;

2.数据模型
BigTable是一个稀疏的、分布式的、持久化存储的多维排序map,map的索引是行名称、列名称、时间戳,value是只有用户能理解含义的二进制串。
(row:string + column:string + time:int64) => (string)
为什么设计成这样的数据模型呢?首先考虑一种常见的应用,存储网页(webtable):
URL为关键字,URL含有各种属性,每种属性有一定的历史,如下图

图一:网页存储片段

行(rows)
(1)表中的行是任意的字符串(64k上限),对每一行的读写都是原子的;
(2)BigTable通过行关键字组织数据,每个行都能动态分区,每个分区叫一个子表(tablet),子表是数据分布与负载均衡的最小单位;
(3)第二点保证了读取行中少数几列的数据时效率很高,应用层还能利用位置相关特性,将一些需要的数据放置在一起。
仍以存储网页为例:
能够以URL主域反转作为key,进行网页的存储,这样同一个主域下的网页都存在一起,能够提高查询效率。
com.google.maps/site1.html
com.google.maps/site2.html

列族(column families)
(1)列关键字组成的集合叫列族,列族是访问控制的基本单位;
(2)同一个列族下的数据通常类型相同;
(3)列族必须先创建才能使用,创建后,任何一个列关键字下都能存放数据。
(4)一张表可以有无限多个列;
一般来说,一张表中列族不能太多(几百个足以),并且列族在运行期间很少改变。
列族名称由 族名称(family)+限定符(qualifier)组成,其中:
(1)族名称必须是可打印字符;
(2)限定符可以是任意字符;
访问控制、磁盘以及内存的使用统计都是在列族层面进行的。仍以存储网页为例,权限控制能允许某些应用添加新的基本数据、某些应用读取基本数据并创建继承的列族、一些应用则只能浏览。

时间戳(timestamps)
(1)时间戳类型为int64,精度为毫秒;
(2)一份数据可以有多个时间戳版本,以避免版本冲突;
(3)不同时间戳版本的数据按时间戳降序排列,即最新的数据在最前面;
一般来说,只会保存某个数据的最近n个版本,可以设置参数定期进行垃圾收集。
以存储网页为例,存储的网页的时间戳是网页的抓取时间,垃圾收集机制能保证只存储最近3个版本的网页数据。

评论关闭。