谷歌经典论文《BigTable》笔记和理解

138 阅读3分钟

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中的根子表,根子表是元数据表的第一个子表
    • 根子表包含了所有元数据子表的位置信息
    • 元数据子表包含一组用户子表的位置信息