# 思维导图

# 介绍

  • 实用性广泛
  • 可扩展
  • 高性能
  • 高可用性

# 数据模型

  • BigTable 是一个稀疏的、分布式的、持久化存储的多维度排序 Map
  • 索引是行关键字、列关键字和时间戳
    • (row:string, column:string, time:int64) -> string
    • 最大 64kb 的任意字符串
    • 可以动态分区,每个分区叫 Tablet
    • 对同一个行数据的读写是原子性的
  • Tablet
    • 数据分布和负载均衡调整的最小单位
    • 列必须属于某个列簇,一个列只属于一个列簇,一个列簇包含多个列
    • 一个表有无限多个列
  • 列簇
    • 列关键字组成的集合
    • 访问控制的最小单位
    • 一个表中列簇最多几百个
  • 时间戳
    • 表的数据项有多个版本,用时间戳来表示
    • 可以指定保留最后 n 个版本

# API

# 构件

  • 建立在其他几个 Google 基础构件上
  • 数据存储文件是 Google SSTable—— 持久化的、排序的、不可更改的 Map 结构
  • 依赖 Chubby—— 高可用的、序列化的分布式锁服务组件

# 整体介绍

  • Client
    • 直接和 Tablet 服务器通信进行读写操作
  • Master 服务器
    • 为 Tablet 服务器分配 Tablets
    • 检测新加入的或者失效的 Tablet 服务器
    • 对 Tablet 服务器进行负载均衡
    • 对保存在 GFS 上的文件进行垃圾收集
    • 处理对模式的相关修改操作
    • 使用 Chubby 跟踪记录 Tablet 服务器的状态
    • Chubby 记录唯一 Master 锁
  • 多个 Tablet 服务器
    • 管理一个 Tablet 的集合
    • 处理它所加载的 Tablet 的读写操作
    • 在 Tablets 过大时,进行分割
  • Tablet
    • Tablet 的位置存储是一个三层的、类似 B+ 树的结构
    • 一个 Tablet 只能分配给一个 Tablet 服务器
    • 持久化信息保存在 GFS 上
    • 更新操作保存到 REDO 日志,先写入 memtable
    • Tablet = SSTables + memtable
  • 空间收缩
    • Minor Compaction
      • memtable 达到一样大小时,被转换成 SSTable
    • Merging Compaction
      • 合并多个小的 SSTable,以及 memtable 生成一个大的 SSTable
    • Major Compaction
      • 合并所有的 SSTable,不包含已删除数据

# 优化

  • 局部性群组
    • 多个列簇
    • 对应一个 SSTable
  • 压缩
    • 每个 SSTable 局部压缩
  • 缓存
    • 一级缓存 —— 扫描缓存
    • 二级缓存 ——Block 缓存
  • Bloom 过滤器
    • SSTable 级别
  • Commit 日志
    • 一个 Tablet 服务器一个日志文件
    • 分段排序
  • Tablet 恢复提速
    • 两次 Minor Compaction
  • 利用不变性
    • COW
    • 标记删除
    • 快速分割 Tablet