理解 BigTable

2020-06-23 00:00:00 数据 文件 服务器 的是 位置

BigTable 其实就是 Google 设计的分布式结构化数据表.

Bigtable 的设计动机:

  1. 需要存储的数据种类繁多,包括URL、网页内容、用户的个性化设置在内的数据都是Google需要经常处理的
  2. 需要存储的数据种类繁多海量的服务请求,Google运行着目前世界上繁忙的系统,它每时每刻处理的客户服务请求数量是普通的系统根本无法承受的.
  3. 商用数据库无法满足需求,一方面现有商用数据库的设计着眼点在于其通用性。另一方面对于底层系统的完全掌控会给后期的系统维护、升级带来极大的便利

为了解决上述的问题, Google 才提出了 BigTable 的概念.

Bigtable 应达到的基本目标

  1. 广泛的适用性, Bigtable是为了满足一系列 Google 产品而并非特定产品的存储要求。
  2. 很强的可扩展性, 根据需要随时可以加入或撤销服务器.
  3. 高可用性, 确保几乎所有的情况下系统都可用.
  4. 简单性, 底层系统的简单性既可以减少系统出错的概率,也为上层应用的开发带来便利

Bigtable 数据的存储格式

Bigtable is a sparse, distributed, persistent multidimensional sorted map.

Bigtable 是一个分布式, 多维, 映射表. 表中的数据通过一个行关键字(Row Key)、一个列关键字(Column Key)以及一个时间戳(Time Stamp)进行索引. 在Bigtable中一共有三级索引. 行关键字为级索引,列关键字为第二级索引,时间戳为第三级索引。

Bigtable的存储逻辑可以表示为:

(row:string, column:string, time:int64)→string

row 的特点

  • Bigtable 的行关键字可以是任意的字符串,但是大小不能够超过 64KB
  • 表中数据都是根据行关键字进行排序的,排序使用的是词典序
  • 同一地址域的网页会被存储在表中的连续位置
  • 倒排便于数据压缩,可以大幅提高压缩率

需要特别注意的是对于一个网站 www.cnn.com 存储在 Bigtable 中的格式是 com.cnn.www

这样倒排的好处是,对于同一域名下的内容,我们可以进行更加快速的索引.

column 的特点

  • 将其组织成列族(Column Family)
  • 族名必须有意义,限定词则可以任意选定, 比如 “contents”, “title” 等等.
  • 组织的数据结构清晰明了,含义也很清楚
  • 族同时也是 Bigtable 中访问控制(Access Control)的基本单元

我们从 Bigtable 中读取数据先找到哪一行 然后再去选择读取那个一个 column.

time 的特点

  • Google的很多服务比如网页检索和用户的个性化设置等都需要保存不同时间的数据,这些不同的数据版本必须通过时间戳来区分。
  • Bigtable中的时间戳是64位整型数,具体的赋值方式可以用户自行定义

选定了 row 和 column 之后,我们就会选择读取哪一个版本的,不同的时间戳代表着不同的数据版本.

典型的 bigtable 存储结构



上图是 Bigtable 论文里给出的例子,Webtable 表存储了大量的网页和相关信息。
在 Webtable 中每一行存储一个网页,其反转的 url 作为行键,比如 maps.google.com/index.h 的数据存储在键为com.google.maps/index.html 的行里,反转的原因是为了让同一个域名下的子域名网页能聚集在一起。

上图中的列族 “anchor” 保存了该网页的引用站点(比如引用了CNN主页的站点),qualifier 是引用站点的名称,而数据是链接文本;

列族”contents”保存的是网页的内容,这个列族只有一个空列”contents:”。

“contents”列下保存了网页的三个版本,我们可以用 (“com.cnn.www”, “contents:”, t5) 来找到CNN主页在t5时刻的内容。

以下一个比较典型的 bigtable 存储结构,有点 json 格式的感觉.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

相关文章