BigTable学习
记录阅读BigTable论文时思考的一些问题。
问题
- GFS可能出现重复记录或者padding,Bigtable如何处理这种情况使得对外提供强一致性模型? BigTable需要往GFS记录的文件有两种,一种是commit-log,另一种是SSTable。对于commit-log,有日志号用来区分重复的日志,所以有重复没有问题。对于SSTable,通过记录在GFS中的偏移量作为索引实现去重。
- 为什么Bigtable设计成Root、Meta、User三级结构,而不是两级或者四级结构? 主要考虑到保存的数据量大小,通过计算可以得出三级结构支持PB级别的数据。
- 读取某一行用户数据,最多需要几次请求?分别是什么? 6次。主要考虑缓存不命中的情况下,对于三级结构,会进行递归查询。
- 如何保证同一个tablet不会被多台机器同时服务? 由master保证。master读取chubby对应目录下的文件发现tablet server,并负责将tablet分发给tablet server,记录在表格中。
- Tablet在内存中的数据结构如何设计? 使用LSM实现,参考leveldb中memtable使用跳表实现。
- 如何设计SSTable的存储格式? 主要包含数据区和索引区,参考leveldb的实现。
- minor、merging、major这三种compaction有什么区别? minor负责将内存中的memtable转换成sstable,merging负责合并部分sstable,major负责合并所有的sstable。
- Tablet Server的缓存如何实现? 主要有两种缓存,一种缓存从GFS中读取的数据。另一种缓存用户读取的kv数据。
- 如果tablet出现故障,需要将服务迁移到其它机器,这个过程需要排序操作日志。如何实现? 一个tablet server只有一个commit-log,这个时候需要使用类似于mapreduce的方式先切分日志,然后发送到不同的tablet server进行排序找到对应tablet的操作日志。
- 如何使得tablet迁移过程停服务时间尽量短? 进行两次minor freeze。第一次将内存中的数据保存到sstable中,第二次转换第一次过程中新写入内存的数据。
- tablet分裂的流程是怎样的? tablet的分裂是单机事务,包括了memtable和sstable的分裂。
- tablet合并的流程是怎样的? 合并相对于分裂要复杂,为多机事务,需要先将两个tablet放到一个tablet server上,然后再执行合并。v