6.1.4 容错

Bigtable中Master对Tablet Server的监控是通过Chubby完成的,Tablet Server在初始化时都会从Chubby中获取一个独占锁。通过这种方式所有的Tablet Server基本信息被保存在Chubby中一个称为服务器目录(Server Directory)的特殊目录之中。Master通过检测这个目录以随时获取最新的Tablet Server信息,包括目前活跃的Tablet Server,以及每个Tablet Server上现已分配的子表。对于每个Tablet Server,Master会定期询问其独占锁的状态。如果Tablet Server的锁丢失或者没有回应,则此时可能有两种情况,要么是Chubby出现了问题,要么是Tablet Server出现了问题。对此Master首先自己尝试获取这个独占锁,如果失败说明是Chubby服务出现问题,否则说明是Tablet Server出现了问题。Master将中止这个Tablet Server并将其上的子表全部迁移到其他Tablet Server。

每个子表持久化的数据包含两个部分:操作日志以及SSTable。Tablet Server发生故障时某些子表的一些更新操作还在内存中,需要通过回放操作日志来恢复。为了提高性能,Tablet Server没有为它服务的每个子表写一个操作日志文件,而是把所有它服务的子表的操作日志混在一起写入GFS,每条日志通过<表格编号,行主键,日志序列号>来唯一标识。当某个Tablet Server宕机后,Master将该Tablet Server服务的子表分配给其他Tablet Server。为了减少Tablet Server从GFS读取的日志数据量,Master将选择一些Tablet Server对日志进行分段排序。排好序后,同一个子表的操作日志连续存放,Tablet Server恢复某个子表时只需要读取该子表对应的操作日志即可。Master需要尽可能选择负载低的Tablet Server执行排序,并且需要处理排序任务失败的情况。

Bigtable Master启动时需要从Chubby中获取一个独占锁,如果Master发生故障,Master的独占锁将过期,管理程序会自动指定一个新的Master服务器,它从Chubby成功获取独占锁后可以继续提供服务。