由于在Google的数据中心存储PB级以上的非关系型数据时候,比如网页和地理数据等,为了更好地存储和利用这些数据,Google开发了一套数据库系统,名为“BigTable”。
技术概览
从技术来讲,BigTable不是一个传统的关系型的数据库,也不支持类似关联(join)这样高级的SQL操作,取而代之的是多级映射的数据结构,并支持大规模数据处理、高容错性和自我管理等特性,提供PB级的存储能力,使用结构化的文件来存储数据,并整个集群每秒可处理数百万的读写操作。
什么是多级映射的数据结构呢?就是一个稀疏的、多维的和排序的Map,每个Cell(单元格)由行关键字、列关键字和时间戳来进行三维定位.Cell的内容本身就是一个字符串,比如,存储每个网页的内容。在下图中, 反向的URL “com.cnn.www”是这行的关键字,“contents”这列存储了多个版本的网页内容,每个版本都有一个时间戳。BigTable还提供一个用于将多个相似的列整合至一起的Column Family(列组)机制,比如,下面“anchor”这个Column Family就有“anchor: cnnsi.com”和“anchhor:my.look.ca”这个两个列。通过Column Family这个概念,使得表可以轻松地横向扩展。
图1. BigTable数据模型图
在结构上,BigTable基于GFS分布式文件系统和Chubby分布式锁服务。BigTable主要分为两部分:其一是Master节点,用来处理元数据相关的操作并支持负载均衡。其二是Tablet节点,主要用于存储数据库的分片tablet,并提供相应的数据访问,同时tablet是基于名为SSTable的格式,对压缩有很好的支持。下图为其具体的架构图:
图2. BigTable架构图
相关产品
和之前介绍的MapReduce和GFS一样,BigTable在开源界也有很多类似的产品,最著名的两个莫过于属于Hadoop系列的Hbase和来自于Facebook的Cassandra。Hbase的特色在于其完全继承了BigTable的设计,所以它在MapReduce和海量数据存储这两方面支持地非常好,而Cassandra的则更倾向于成为全功能型数据库。除了这两个产品之外,我个人也设计一款类BigTable的数据库,名为YunTable,意为“云时代的BigTable”,它的目标是做一个BigTable的精简版,并使其更适合云环境,现在已经发布其0.8版,本已基本实现BigTable的基本功能,官方站点是http://code.google.com/p/yuntable/,希望大家能多多关注。
实际用例
BigTable正在为Google六十多种产品和项目提供存储和获取结构化数据的支撑平台,其中包括有Google Print, Orkut,Google Maps,Google Earth和Blogger等,而且在Google内部至少运行着500个BigTable集群。
下一代的BigTable
随着Google内部服务对需求的不断提高和技术的不断地发展,导致原先的BigTable已经无法满足用户的需求,而Google也正在开发下一代BigTable,名为“Spanner(扳手)”,它主要有下面这些BigTable所无法支持的特性:
-
- 支持多种数据结构,比如table,familie,group和coprocessor等。
- 基于分层目录和行的细粒度的复制和权限管理。
- 支持跨数据中心的强一致性和弱一致性控制。
- 基于Paxos算法的强一致性副本同步,并支持分布式事务。
- 提供许多自动化操作。
- 强大的扩展能力,能支持百万台服务器级别的集群。
- 用户可以自定义诸如延迟和复制次数等重要参数以适应不同的需求。