现在的位置: 首页 > 综合 > 正文

云存储 – Bigtable

2013年12月03日 ⁄ 综合 ⁄ 共 1801字 ⁄ 字号 评论关闭

本文是对Bigtable: A Distributed Storage System for Structured Data这篇论文的学习总结。 

什么是Bigtable

Bigtable是一个在大规模的Commodity机器上存储海量结构化数据的分布式存储系统。Google很多不同类型的产品都使用了Bigtable存储数据,包括了从离线的批量数据处理到实时为用户提供数据的产品。

Bigtable的Data Model

一个Bigtable是离散的、分布式的,持久化的、多纬度的、有序的Map: (row:String, column:String, timestamp:int64) -> String

Bigtable中每行有一个row key, 上图中为com.cnn.www。Bigtable所有的行根据词典顺序被排序,并且把整个表根据不同的key range进行切分成不同的更小的tablet。Tablet是进行distribution和load balancing的单元。

Bigtable中每个column key以"column family:qualifier"的形式定义。比如anchor:cnnsi.com这个column key中,anchor是column family, cnnsi.com是qualifier。Bigtable中的每个cell可以由统一数据的不同版本,并且不同的版本由时间戳标识。

在Bigtable中,access control是在column family这个层次做的。

Bigtable的实现

Bigtable的数据和日志文件是存在Google File System中的,而Bigtable的Master和Tablet服务器的实现则依赖于Google Chubby。Bigtable依赖于Chubby实现了:1)在任何时候只有一个Master节点;2)存储Bigtable数据的引导位置(bootstrap location);3)发现Tablet服务器以及任一时刻Tablet服务器是否正常工作;4)存储Bigtable的schema信息;5)存储access control列表。

Tablet的位置是通过一个三层的类似B+树这样的数据结构来存储的,如下图所示。Root Tablet实际上是Metadata Tablets列表中的第一个Metadata Tablet。

Master节点会维护一个健康Tablet服务器的列表,哪些Tablet服务器被使用了,以及哪些Tablet被分配到了哪些Tablet服务器。当一个未被占用的Tablet服务器有足够的资源时,Master就会把Tablet分配给该Tablet服务器。

当Bigtable接到读写请求时,首先会验证请求的合法性,然后验证是否有读写权限,然后Tablet服务器执行读写请求。

Bigtable的实现优化

为了使Bigtable获得很好的性能、可用性以及可靠性,Bigtable的实现还进行了一些其它的优化:

1)Locality Group:通过将经常一起被读些的数据放在一个Locality Group里面,可以有效减少读写Tablet的次数,从而优化读写速度。

2)Compression:用户可以指定是否要压缩数据,以及用什么方法进行压缩。

3)Caching:Bigtable用了两级缓存分别用来缓存用户读出来的key-value键值对以及GFS的blocks,从而优化了数据的读取速度。

4)Bloom Filters:用于指定哪些Tablets里面是否存在key-value键值对,从而减少磁盘的访问次数。

还有一些其它的优化这里就不多说了,可以看看论文原文。

Bigtable的性能

通过上面的图表,以500个节点的集群为例,我们基本可以得到以下几个基本的性能数据:

1)每个节点每秒可以从GFS随机读241个1000-byte的值,从Tablet服务器的内存中随机读6250个值,随机写2000个值,顺序读2469个值,顺序写1905个值,通过Bigtable API扫描(从而减少RPC次数)7843个值。

2)集群每秒可以从GFS随机读0.1M个值,从Tablet服务器内存中随机读3M个值,随机写1M个值,顺序读1.2 M个值,顺序写1M个值,扫描4M个值。

从而可以看到一个有趣的现象:Bigtable中随机写和顺序写的速度差不多,但是顺序读要比随机读快10 - 30倍。

抱歉!评论已关闭.