1 什么是Bigtable?
Bigtable是一个稀疏的、分布式的、持久化存储的多维有序映射(Map)。
- 稀疏:不同的行可以有不同的列,比如row1行拥有city这个列,但是row2行可以没有city这个属性,此时相当于row2这行对应的city列没有存储任何信息。从整个表来看,有很多这样没有存储任何信息的列,这样的表就是稀疏的。稀疏的另外一个含义是行键之间是可以有间隔的。
- 分布式:一个大的Map需要多个分区实现分布式。
- 持久化存储:持久化存储在硬盘上。
- 多维:物理存储表中的每个key都有行、列、时间戳三个维度。
- 有序:表格按照row key进行排序
- 映射(Map):数据采用key-value结构的物理存储方式。虽然Bigtable名字中含有table,但是实际上是map结构的存储。
2 Bigtable是为了解决什么问题而设计的
为了可靠地处理PB级别的海量数据。
-
支撑百万级别随机读写
-
广泛的适用性
-
可伸缩性(特指横向)
-
高性能
-
高可用
3 Bigtable有什么特点
- 不支持完整的关系数据模型、只为用户提供简单的数据模型。
- 模型支持动态的控制数据的分布和格式,用户可以自定义数据的scheme
- 数据模型简单:每个键值对的key为row key + column key + timestamp的结构,value是字符串。行名和列名可以是任何字符串,
bigtable对这些字符串不解析,只是存储。
4 Bigtable中的专有名词
- Row :行关键字,可以是任意字符串。Bigtable按照row key的字典序对数据排序。
- Tablet:row key相同的数据非常多 ,需要对bigtable进行横向分区,每个行区间称为一个Tablet。 Tablet 是 Bigtable 数据分布和负载均衡的基本单位。
- Column Key:列关键字,表示一种数据类型。 在Bigtable中,Column Key不需要提前定义,它们可以在需要时动态添加。
- Column Family:column family表示Column Key的集合。存储在同一个family的数据具有相同的数据类型,同一个family下的数据被压缩在一起保存。column family是访问控制、磁盘和内存计算的基本单元。数据存储之前必须确定其column family然后才能确定具体的column key。
- Timestamp:用于标识同一数据的不同版本。表项的不同版本按照时间戳倒序排列。
5 Bigtable所依赖的组件
- Chubby:主要提供锁服务。
-
- 确保任意时间至多存在一个活跃的主服务器副本
- 存储Bigtable中数据的bootstrap localtion
- 发现Table(子表)服务器,并在子表服务器失效后进行善后
- 存储bigtable的scheme信息
- 存储access control list
- 主服务器:系统管家的作用,持有活跃的子表服务器信息、子表的分配信息和未分配子表的信息。
-
- 为子表服务器分配子表
- 检测子表服务器的加入或过期
- 进行子表服务器的负载均衡
- 子表服务器:管理一组子表,读写数据时,客户端直接和子表服务器通信。
-
- 负责其磁盘上的子表的读写请求
- 子表过大时进行分割
- 客户端程序库:客户端用来访问Bigtable
-
- 客户端访问Bigtable时,会缓存子表的位置信息。
- 当客户端访问Bigtable时,首先要调用open()函数获取文件目录(可能存在于缓存中,也可能通过与主服务器通信得到)。最后再与子表服务器通信。
- 元数据信息
- 三层类B+树结构存储元数据信息。
- 第一层存储在Chubby中的根子表,根子表是元数据表的第一个子表
- 根子表包含了所有元数据子表的位置信息
- 元数据子表包含一组用户子表的位置信息