1 概述
GFS的出现虽然解决了海量数据的存储问题,但是还是存在一个问题就是如果需要存储的数据是结构化的,对结构化数据的使用往往是希望和关系型数据库一样,进行复杂的数据操作的。但是GFS并没有支持基于特定属性(如行键、列名、时间戳)的高效查询、更新、聚合等操作。自然就需要发数据版本的关系型数据库,这就是分布式数据库。
Bigtable作为一个管理大规模结构化数据而设计的分布式存储系统,可以扩展到PB级数据和上千台服务器。很多Google的项目使用Bigtable存储数据,这些应用对Bigtable提出了不同的挑战,比如数据规模的要求、延迟的要求。Bigtable能满足这些多变的要求,为这些产品成功地提供了灵活、高性能的存储解决方案。
Bigtable看起来像一个数据库,采用了很多数据库的实现策略。但是Bigtable并不支持完整的关系数据库模型,而是为客户端提供了一个简单的数据模型,客户端可以动态的控制数据的布局和格式,并且采用底层数据存储的局部性特征。Bigtable将数据统统看成无意义的字符串,客户端需要将结构化和非结构化数据串行化再存入Bigtable。
- Bigtable是基于GFS而来的,底层使用GFS进行数据存储,所以满足了海量数据的存取要求。
- 但是对数据进行灵活操作,需要在中间层里使用巧妙的数据组织逻辑进行数据管理。
总的来说,Bigtable依托于Google的GFS、Chubby及SSTable而生,用于解决Google内部不同产品在对数据存储的容量和响应时延需求的差异化,力求在确保能够容纳大量数据的同时减少数据的查询耗时。需要能够处理海量数据、提供灵活的、高性能的数据存储方案、使用类似于数据库的实现策略却不支持完整的数据库模型。
- SSTable的全称是Sorted Strings Table,是一种不可修改的有序的键值映射,提供了查询、遍历等工嗯呢。每个SSTable由一系列的块组成,Bigtable将块设置为64KB。在SSTable的尾部存储块索引。
- Chubby是一种高可用的分布式锁服务,Chubby有5个活跃副本,同时只有一个主副本提供服务,副本之间用Paxos算法维持一致性,Chubby提供了一个命名空间(包括一些目录和文件),每个目录和文件就是一个锁,Chubby的客户端必须和Chubby保持会话,客户端的会话若过期则会丢失所有的锁。
2 数据模型
Bigtable把数据存储在若干个table中,其数据特征是一个稀疏的、分布式的、持久化存储的多维度排序映射。
- 键有三维:
- 行键:字典序列组织,提供行级事务的支持,即程序在对某一行进行并发操作更新都是原子的,Tablet每一行都可以参与动态分区,一个分区称为一个Tablet,Tablet是Bigtable中数据分布和负载均衡的最小单位
- 列键:Bigtable列列关键字组成的集合称为列族,它是对表进行访问控制的基本单位,访问权限包括增加新的基本数据、读取基本数据并创建继承的列族和浏览数据等,除了访问控制之外,磁盘和内存的使用统计也是在列族层面进行的。
- 时间戳:区分数据的不同版本
- 访问一条记录可以表示为:
3 Bigtable集群
Bigtable集群包括三个主要部分:一个供客户端使用的库、一个主服务器(master)、许多片服务器