6.1.8 垃圾回收
Compaction后生成新的SSTable,原有的SSTable成为垃圾需要被回收掉。每个子表正在引用的SSTable文件保存在元数据中。Master定期执行垃圾回收任务,这是一个标记删除(mark-and-sweep)过程。首先扫描GFS获取所有的SSTable文件,接着扫描根表和元数据表获取所有正在使用的SSTable文件,如果GFS中的SSTable没被任何一个子表使用,说明可以被回收掉。这里需要注意,由于Tablet Server执行Compaction操作生成一个全新的SSTable与修改元数据这两个操作不是原子的,垃圾回收需要避免删除刚刚生成但还没有记录到元数据中的SSTable文件。一种比较简单的做法是垃圾回收只删除至少一段时间,比如1小时没有被使用的SSTable文件。