# 思维导图
# 介绍
# 数据模型
- BigTable 是一个稀疏的、分布式的、持久化存储的多维度排序 Map
- 索引是行关键字、列关键字和时间戳
- (row:string, column:string, time:int64) -> string
- 行
- 最大 64kb 的任意字符串
- 可以动态分区,每个分区叫 Tablet
- 对同一个行数据的读写是原子性的
- Tablet
- 列
- 列必须属于某个列簇,一个列只属于一个列簇,一个列簇包含多个列
- 一个表有无限多个列
- 列簇
- 列关键字组成的集合
- 访问控制的最小单位
- 一个表中列簇最多几百个
- 时间戳
- 表的数据项有多个版本,用时间戳来表示
- 可以指定保留最后 n 个版本
# API
# 构件
- 建立在其他几个 Google 基础构件上
- 数据存储文件是 Google SSTable—— 持久化的、排序的、不可更改的 Map 结构
- 依赖 Chubby—— 高可用的、序列化的分布式锁服务组件
# 整体介绍
- Client
- 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
# 优化
- 局部性群组
- 压缩
- 缓存
- 一级缓存 —— 扫描缓存
- 二级缓存 ——Block 缓存
- Bloom 过滤器
- Commit 日志
- Tablet 恢复提速
- 利用不变性