设计预期每每针对系统的应用场景,是系统在不一样选择间作balance的重要依据,对于理解GFS在系统设计时为什么作出现有的决策相当重要。因此咱们应重点关注:缓存
GFS主要由如下三个系统模块组成:服务器
因为GFS主要面向大文件存储和大规模读写操做,因此其选择了远大于通常文件系统的64MB的Chunk尺寸。网络
好处:架构
坏处:并发
可能的解决方案:负载均衡
Master存储的元数据包括:命名空间、文件和Chunk的对应关系、Chunk位置信息。分布式
命名空间、文件和Chunk的对应关系的存储方式:优化
Chunk位置信息的存储方式:设计
系统启动和新Chunk服务器加入时从Chunk服务器获取。避免了Master与ChunkServer之间的数据同步,只有Chunk服务器才能最终肯定Chunk是否在它的硬盘上。3d
命名空间修改:原子性和正确性
文件数据修改(以后详细解释):
最小化全部操做与Master的交互。
最小化读取操做与Master的交互:
客户端访问Chunk前从Master获取元数据的过程当中,会预取和缓存部分Chunk的元数据,从而减小与Master的交互。
最小化变动操做与Master的交互:
Master收到变动操做请求后
数据推送与控制操做同时进行。
数据流:管道方式按最优化的Chunk服务器链推送,以最大化带宽,最小化延时(全双工交换网络,每台机器进出带宽最大化);
控制流:
一次写入数据过大,可能被客户端分为多个写操做,这些写操做序号可能不连续,被其余并发写操做打断或覆盖,出现数据一致但未定义的状态。
追加写时GFS推荐的写入方式,应重点研究。
a. 原子记录追加:客户端指定写入数据,GFS返回真实写入偏移量。
b. 追加写的过程:
c. 追加结果:失败的追加操做可能致使Chunk间字节级别不一致,但当最终追加成功后,全部副本在返回的偏移位置一致已定义,以后的追加操做不受影响。以下图所示:
d. 冗余数据处理:对于追加写产生的冗余数据
可在插入数据时附带记录级别的Checksum或惟一标识符,在客户端读取数据时进行校验过滤。
使用COW技术,瞬间完成。快照实现的过程:
多操做并行,名称空间锁保证执行顺序,文件操做需得到父目录读锁和目标文件/目录写锁。
Chunk跨机架分布:
好处 -
坏处 - 写操做需跨机架通讯。
a. 建立操做,主要考虑:
b. 重复制,即有效副本不足时,经过复制增长副本数。优先考虑:
Chunk进行重复制。策略与建立相似。
c. 重负载均衡,经过调整副本位置,平衡格机负载。策略与建立相似。新ChunkServer将被逐渐填满。
惰性回收空间:删除操做仅在文件名后添加隐藏标记,Master在常规扫描中删除超时隐藏文件的元数据,并通知对应ChunkServer删除Chunk。
好处 -
坏处 - 不便于用户进行存储空间调优。
解决方案 - 再次删除加速回收,不一样命名空间不一样复制回收策略。
过时检测:Master维护Chunk级别版本号,新租约增长Chunk版本号,并通知全部副本更新版本号,过时Chunk会因版本号过旧被检测。
主要的提升可用性的机制:
ChunkServer独立维护CheckSum检验副本完整性。缘由:
Chunk读取和Chunk服务器空闲时,进行CheckSum校验,发现损坏Chunk上报Master,进行重复制。
Checksum校验的开销:
但总体开销能够接受,特别是对追加写操做。
覆盖写与追加写的Checksum计算开销比较。二者的关键区别在于不完整块的CheckSum计算:
本文是我在阅读论文《The Google File System》时记下的笔记,对论文的各部份内容进行了梳理。
系统设计过程每每就是在各类因素间根据目标需求权衡利弊的过程。分布式系统设计须要权衡的问题存在许多共性,GFS在设计过程当中基于分布式环境的特色,作的许多重要决策对于其余分布式系统开发具备指导性的意义。
因此,我尽力把以为有趣的设计要点进行了提炼,并对重要细节进行了重点分析,特别是各类权衡带来的好处和坏处,以及针对最终选择带来的坏处的弥补方案。
若是这篇文章在梳理本身思路的同时,能为感兴趣的朋友们提供一点点帮助,那也算作了件有意义的事情了!