GFS是什么?
1.1 简单介绍
这个问题说大也大,说小也小。GFS是Google File System的缩写,字面意义上就是Google的文件系统,技术层面上来讲,GFS是Google在2003年前后创建的可扩展分布式文件系统 ,用来满足 Google 不断扩展的数据处理需求。GFS 为大型网络和连接的节点提供容错、可靠性、可扩展性、可用性和性能。GFS 由多个由低成本商品硬件组件构建的存储系统组成。它经过优化以适应 Google 的不同数据使用和存储需求,例如其搜索引擎会生成大量必须存储的数据。在我看来这个系统最大的亮点有两个,一个是使用集群的概念,将硬件设施连接起来共同进行文件存储任务;另外一个是充分利用了现成服务器的优势,同时最大限度地减少了硬件弱点。
为什么要用GFS?
大量数据的存储会面临很多的难点:
大数据下需要良好的表现就需要分片和容错。在具体操作过程中,涉及到容错一般使用副本来解决,然而副本的使用会面临不一致问题。如果有一致性的要求,就会导致表现降低。
所谓的一致性,就是在集群中表现的像与一台机器或一个副本进行交互那样
因为GFS不但是一个理论成熟的框架结构,更是一种通过长期实际使用证明了其优秀性能的分布式架构。GFS是一种松散一致性模型,这是其具有优越的性能主要原因之一。
松散一致性模型关键:
依靠添加而不是重写
检查点
自我验证(校验和)
自我认证记录
GFS基本结构——GFS master、GFS chunkServer、client
GFS master(主服务器)、GFS chunkServer(数据块服务器)、client(客户端)三者可简单理解为图书馆关系。client相当于图书馆,GFS master相当于图书馆管理员,GFS chunkServer相当于图书馆中的书柜。我们通过图书馆client为了借到书chunk(书即是我们存储的一个个数据块chunk),首先要通过图书管理员GFS master获得目标书籍chunk的书柜chunkServer的地址,然后找到书柜chunkServer取得其中的一本书chunk。因此GFS master图书管理员不清楚书里的内容,只负责记录书的位置,借出和归还,因此只记录少量的位置数据。我们通过GFS master获得书chunk的位置,然后拿着这个位置就能找到目标chunk,chunk即是海量数据分割后的一个个小块,其中记录大量数据。
要点:
Master通过lease(租约)和Primary Replica(主副本)本来构建交互的流程。
Master是做出决策、创建新的块和赋值,并协调各种系统范围的活动,以保证块完全复制,平衡所有chunkserver的负载,同时还负责垃圾回收。
Master的操作通过锁来保证命名空间范围内的序列化
主副本是从众多chunkserver中选出的唯一特殊副本,该副本的特殊性在于其维护了一个定时的租约列表。
租约指的是一组由用户发来的有顺序的指令集合
主副本之外的副本都需要通过主副本中的这个列表来执行指令,以保证每个副本执行的最终结果相同。
Master失效怎么办
有副本master,拥有master状态的完整副本;GFS论文中设计需要人工干预才能切换到其中一种主故障后的副本。
如何保障副本记录的正确性
使用原子记录至少追加一次的方法。
为什么不使用完全追加?
如果在其中一个写入失败时客户端重新尝试写入,这将导致数据在未失败的副本上多次附加。不同的设计可能会检测到重复的客户端请求,例如,原始故障之间的主要故障请求和客户端的重试。
应用程序如何知道哪些部分组成填充,哪些是重复记录?
为了检测填充,应用程序可以放置一个可预测的幻数在有效记录的开头,或包含一个校验和,该校验和可能仅当记录有效时才有效。该应用程序可以检测通过在记录中包含唯一 ID 来复制。然后,如果它读取与先前记录具有相同 ID 的记录,它知道它们是彼此的重复。GFS 为应用程序提供了一个库处理这些情况。
什么是校验和?
校验和算法将一个字节块作为输入并返回一个单个数字,它是所有输入字节的函数。例如,一个简单校验和可能是输入中所有字节的总和(mod一些大数字)。GFS 存储每个块的校验和以及块。当一个chunkserver在它的磁盘上写一chunk时,它首先计算新块的校验和,并将校验和保存在磁盘上以及块。当一个chunkserver从磁盘读取一个chunk时,它还读取先前保存的校验和,从磁盘读取的块,并检查两个校验和是否匹配。如果数据已被磁盘损坏,校验和不匹配,并且chunkserver 会知道返回错误。另外,一些 GFS应用程序存储自己的校验和,而不是应用程序定义的记录,在 GFS 文件中,以区分正确的记录和填充。
GFS 以正确性换取性能在多大程度上可以接受
这是分布式系统中反复出现的主题。强一致性通常出现在需要复杂且需要交互的协议机器之间。经过利用特定应用程序类可以容忍的放松方式一致性,可以设计出具有良好性能和足够的一致性。例如,GFS 针对 MapReduce 进行了优化对大文件需要高读取性能的应用程序可以在文件中有漏洞,记录显示多次,并且不一致的读取。
Google 是否仍使用 GFS?
有传言说 GFS 已经被一个叫做Colossus,总体目标相同,但在 master 方面有所改进性能和容错性。