在GFS(Google文件系统)中,数据完整性至关重要。每个Chunk服务器都采用Checksum机制来检测数据是否损坏。由于GFS集群通常包含数百台机器和数千块硬盘,磁盘故障导致数据读写过程中损坏或丢失的情况十分常见。虽然可以通过其他Chunk副本来弥补数据损坏,但跨服务器比较副本以检查数据完整性并不现实。此外,GFS允许存在歧义副本,因为修改操作(尤其是原子记录追加)的语义并不保证副本完全一致。 因此,每个Chunk服务器必须独立维护Checksum以验证自身副本的完整性。

GFS将每个Chunk划分为64KB的块,每个块对应一个32位的Checksum。Checksum与其他元数据分开存储,保存在内存和硬盘上,并记录在操作日志中。在读取数据时,Chunk服务器会在将数据返回给客户端或其他Chunk服务器之前校验相关块的Checksum,防止错误数据传播。如果Checksum校验失败,Chunk服务器会向请求者返回错误信息,并通知Master服务器。Master服务器会从其他副本克隆数据进行恢复,并在新的副本就绪后通知出错的Chunk服务器删除错误副本。

Checksum对读取操作性能的影响很小,这得益于以下几个因素:大多数读取操作涉及多个块,只需读取少量额外数据进行校验;GFS客户端代码将读取操作与Checksum块边界对齐,减少了额外读取操作;Checksum的查找和比较不需要I/O操作,Checksum计算可以与I/O操作同时进行。

针对追加写入操作(相对于覆盖现有数据的写入操作),Checksum计算进行了高度优化,因为这类操作在GFS中占很大比例。GFS只增量更新最后一个不完整块的Checksum,并使用所有追加的新Checksum块计算新的Checksum。即使最后一个不完整Checksum块已损坏且无法立即检测到,由于新写入的块具有有效的Checksum,因此损坏的影响被限制在最后一个不完整块内。