本文将深入分析BigTable的数据模型,并介绍它是如何被调用的。
数据模型
就像向我之前所说的那样,其实BigTable顾名思义,是一个非常大的表,而且是一个能存储几十亿行(Row)和几千列(Column)的非常巨大的表。什么表会怎么大呢?接下来,举一些简单的例子,比如:用于中国所有公民的个人信息和Internet上所有网站内容的表,这些表的总体规模可以达到PB以上级别,而且这些表的规模都会与日增长,所以很显然需要使用分布式的方法,而不是使用一台机器来承载这个巨大且不断增长的Table。首先,会介绍一下BigTable最基本的数据模型,也就是table。
Table
图1. Table
这就是Table(表格),虽然上面截图只有三个Row和五个Column,但由于这个表会存储中国所有公民的个人信息,所以会有十三亿多Row和几百多Column,接下来,将介绍为了提高访问效率和伸缩性的两个特性:Colunm Family(列组)和Tablet(片)。
Column Family
图2. Column Family
Tablet
图3 Tablet
这个非常容易理解,就是BigTable系统会自动根据Row Name的范围,来将数据复制到不同的服务器上。
Timestamp
为了帮助数据的同步和备份,可以为每个Cell(单元格)设置相应的Timestamp,而且系统可以根据Timestamp来做GC(Garbage Collection)。
调用接口
Google的BigTable的调用接口主要以API为主,下面是一些示例代码,主要参考自BigTable的Paper。
//打开Table
Table *T = OpenOrDie(“/peopletable”);
//找到相应的Row,并做相应的更新
RowMutation r1(T,”310101”);
//执行更新
Operation op;
Apply(&op, &r1);
//创建用于查询的Scanner
Scanner scanner(T);
ScanStream *stream;
stream->SetReturnAllVersion();
scanner.Lookup(“310101”);
//打印
for(;!stream->Done();stream->Next()){
printf(“%s %s %lld %s\n”,Scanner.RowName(), stream->ColumnName,
stream->TimeStamp, stream->Value);
}
下篇开发日记将关注BigTable的存储模型。