Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说【分布式系统】GFS(Google File System )详解[亲测有效],希望能够帮助你!!!。
GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务。
大量数据的存储会面临很多的难点:
大数据下需要良好的表现就需要分片和容错。在具体操作过程中,涉及到容错一般使用副本来解决,然而副本的使用会面临不一致问题。如果有一致性的要求,就会导致表现降低。
所谓的一致性,就是在集群中表现的像与一台机器或一个副本进行交互那样
因为GFS不但是一个理论成熟的框架结构,更是一种通过长期实际使用证明了其优秀性能的分布式架构。GFS是一种松散一致性模型,这是其具有优越的性能主要原因之一。
松散一致性模型关键:
一个GFS集群通常由1个Master,多个ChunkServer组成,并同时接受多个Client的访问。
流程介绍:
client发送请求给Master,寻找存储了对应副本的chunkserver。
Master通过遍历本地记录获取chunkserver的信息,包括处理信息和地址信息
Master不但会在启动时获取集群中所有chunkserver的信息,还会在后续的周期性的获取chunkserver信息。所有的信息都是存在Master的RAM里
Master将信息返回给client
client之后直接通过地址信息与chunkserver交互
要点:
Master通过lease(租约)和Primary Replica(主副本)本来构建交互的流程。
Master是做出决策、创建新的块和赋值,并协调各种系统范围的活动,以保证块完全复制,平衡所有chunkserver的负载,同时还负责垃圾回收。
Master的操作通过锁来保证命名空间范围内的序列化
主副本是从众多chunkserver中选出的唯一特殊副本,该副本的特殊性在于其维护了一个定时的租约列表。
租约指的是一组由用户发来的有顺序的指令集合
主副本之外的副本都需要通过主副本中的这个列表来执行指令,以保证每个副本执行的最终结果相同。
有副本master,拥有master状态的完整副本;GFS论文中设计需要人工干预才能切换到其中一种主故障后的副本。
使用原子记录至少追加一次的方法。
为什么不使用完全追加?
如果在其中一个写入失败时客户端重新尝试写入,这将导致数据在未失败的副本上多次附加。不同的设计可能会检测到重复的客户端请求,例如,原始故障之间的主要故障请求和客户端的重试。
为了检测填充,应用程序可以放置一个可预测的幻数在有效记录的开头,或包含一个校验和,该校验和可能仅当记录有效时才有效。该应用程序可以检测通过在记录中包含唯一 ID 来复制。然后,如果它读取与先前记录具有相同 ID 的记录,它知道它们是彼此的重复。GFS 为应用程序提供了一个库处理这些情况。
校验和算法将一个字节块作为输入并返回一个单个数字,它是所有输入字节的函数。例如,一个简单校验和可能是输入中所有字节的总和(mod一些大数字)。GFS 存储每个块的校验和以及块。当一个chunkserver在它的磁盘上写一chunk时,它首先计算新块的校验和,并将校验和保存在磁盘上以及块。当一个chunkserver从磁盘读取一个chunk时,它还读取先前保存的校验和,从磁盘读取的块,并检查两个校验和是否匹配。如果数据已被磁盘损坏,校验和不匹配,并且chunkserver 会知道返回错误。另外,一些 GFS应用程序存储自己的校验和,而不是应用程序定义的记录,在 GFS 文件中,以区分正确的记录和填充。
这是分布式系统中反复出现的主题。强一致性通常出现在需要复杂且需要交互的协议机器之间。经过利用特定应用程序类可以容忍的放松方式一致性,可以设计出具有良好性能和足够的一致性。例如,GFS 针对 MapReduce 进行了优化对大文件需要高读取性能的应用程序可以在文件中有漏洞,记录显示多次,并且不一致的读取。
有传言说 GFS 已经被一个叫做Colossus,总体目标相同,但在 master 方面有所改进性能和容错性。