1、Master容错
具体来说,Master上保存了GFS文件系统的三种元数据:
- 命名空间(Name Space),也就是整个文件系统的目录结构。
- Chunk与文件名的映射表
- Chunk副本的位置信息,每一个Chunk默认有三个副本
首先就单个Master来说,对于前两种元数据,GFS通过操作日志来提供容错功能。第三种元数据信息则直接保存在各个ChunkServer上,当Master启动或ChunkServer向Master注册时自动生成。因此当Master发生故障时,在磁盘数据保存完好的情况下,可以迅速恢复以上元数据。为了防止Master彻底死机的情况,GFS还提供了Master远程的实现备份,这样在当前的GFS Master出现故障无法工作的时候,另外一台GFS Master可以迅速接替其工作。
2、Chunk Server容错
GFS采用副本的方式实现Chunk Server的容错。每一个Chunk有多个存储副本(默认为3个),分别存储在不同的Chunk Server 上。副本的分布策略需要考虑多种因素,如网络的拓扑、机架的分布和磁盘的利用率等。对于每一个Chunk,必须将所有的副本全部写入成功,才视为成功写入。在其后的过程中,如果相关的副本出现丢失或不可恢复等状况,Master 会自动将该副本复制到其他Chunk Server,从而确保副本保持一定的个数。尽管一份数据需要存储三份,好像磁盘空间的利用率不高,但综合比较多种因素,加之磁盘的成本不断下降,采用副本无疑是最简单、最可靠和最有效,而且实现的难度也最小的一种方法。
GFS 中的每一个文件被划分成多个Chunk,Chunk的默认大小是 64MB,这是因为Google应用中处理的文件都比较大,以64MB为单位进行划分,是一个较为合理的选择。Chunk Server存储的是Chunk的副本,副本以文件的形式进行存储。每一个Chunk 以 Block为单位进行划分,大小为64KB,每一个Block对应一个32bit 的校验和。当读取一个 Chunk副本时,Chunk Server 会将读取的数据和校验和进行比较,如果不匹配,就会返回错误,从而使Client选择其他Chunk Server上的副本。