GFS主要是为了追加(Append)而不是改写(Overwrite)而设计的。一方面是因为是改写的需求比较少,或者可以通过追加来实现;另一方面是因为追加的一致性模型相比改写要更加简单有效。若出现某些副本追加成功而某些副本没有成功的情况,失败的副本可能会出现一些可识别的填充(padding)记录。GFS客户端追加失败将重试,只要返回用户追加成功,说明在所有副本中都至少追加成功了一次。当然,可能出现记录在某些chunk副本中被追加了多次,即重复记录;也可能出现一些可识别的填充记录,应用层需要能够处理这些问题。
另外,由于GFS支持多个客户端并发追加,那么多个客户端之间的顺序是无法保证的,同一个客户端连续追加成功的多个记录也可能被打断,比如客户端先后追加成功记录R1和R2,由于追加R1和R2这两条记录的过程不是原子的,中途可能被其它客户端打断,那么GFS的chunk中记录的R1和R2可能不连续,中间夹杂着其它客户端追加的数据。
GFS的这种一致性模型是追求性能导致的,这也增加了应用程序开发的难度。对于MapReduce应用,由于其批处理特性,可以先将数据追加到一个临时文件,在临时文件中维护索引记录每个追加成功的记录的偏移,等到文件关闭时一次性将临时文件改名为最终文件。
系统交互:
2. Master节点将主Chunk的标识符以及其它副本的位置返回给客户机。客户机缓存这些数据以便后续的操作。只有在主Chunk不可用,或者主Chunk回复信息表明它已不再持有租约的时候,客户机才需要重新跟Master节点联系。
3. 客户机可以以任意的顺序推送数据到所有的副本上。 Chunk服务器接收到数据并保存在它的内部LRU缓存中。通过分离数据流和控制流,GFS基于网络拓扑情况对数据流的网络传输负载进行规划,提高系统性能。
5. 主Chunk把写请求传递到所有的二级副本。每个二级副本依照主Chunk分配的序列号以相同的顺序执行这些操作。
6. 所有的二级副本回复主Chunk,它们已经完成了操作。
容错和诊断机制
Master服务器的复制
回应,以及收集不同机器上的RPC日志记录,重演所有的消息交互来诊断问题。RPC日志还用来跟踪负载测试和性能分析。
负载均衡
Master节点管理整个系统里所有Chunk副本,在制定Chunk副本的分布策略时需要考虑多种因素,如网络的拓扑,机架的分布,磁盘的利用率等等。
Chunk的副本有三个用途: Chunk创建,重新复制和重新负载均衡。
当Master创建了一个chunk,它会根据如下因素来选择chunk副本的初始位置:(1) 新副本所在的Chunk Server的磁盘利用率低于平均水平;(2) 限制每个Chunk Server”最近”创建的数量。(3)每个chunk的所有副本不能在同一个机架。第二点容易忽略但却很重要,因为创建完chunk以后通常需要马上写入数据,如果不限制”最近”创建的数量,当一台空的Chunk Server上线时,由于磁盘利用率低,可能导致大量的chunk瞬间迁移到这台机器从而将它压垮。
当Chunk的有效副本数量少于用户指定的复制因数的时候, Master节点会尝试重新复制一个chunk副本。这可能是由几个原因引起的:一个Chunk服务器不可用了, Chunk服务器报告它所存储的一个副本损坏了, Chunk服务器的一个磁盘因为错误不可用了,或者Chunk副本的复制因数提高了。每一个chunk复制任务都有一个优先级,按照优先级从高到低在Master排队等待执行,例如GFS提高会阻塞客户机程序处理流程的Chunk的优先级。
最后,Master会定期扫描当前副本的分布情况,如果发现磁盘使用量或者机器负载不均衡,将执行重新负载均衡操作。无论是chunk创建,chunk重新复制,还是重新平衡,它们选择chunk副本位置的策略都是相同的,并且需要限制重新复制和重新平衡任务的拷贝速度,否则可能影响系统正常的读写服务。
当文件被删除后,GFS不会马上回收其物理存储,而是立刻把删除操作以日志的方式记录下来。把文件名改为一个包含删除时间戳的、隐藏的名字。Master定时检查,如果发现文件删除超过一段时间(默认为3天,可配置),那么它会把文件从内存元数据中删除,回收物理存储资源。在文件被真正删除之前,它仍能够被Master以特殊的方式访问。为了减轻Master服务器的负担,回收文件物理资源的工作交由Chunk服务器完成:在Chunk 和Master的心跳消息中,Master会回复在Master元数据中已经不存在的chunk信息,Chunk服务器才会释放这些Chunk副本的资源。
另外,Chunk副本可能会因为Chunk服务器失效期间丢失了对Chunk的修改操作而导致过期。系统对每个Chunk都维护了版本号,过期的Chunk可以通过版本号检测出来。Master仍然通过正常的垃圾回收机制来删除过期的副本。
快照
快照(Snapshot)操作是对源文件/目录进行一个”快照”操作,生成该时刻源文件/目录的一个瞬间状态存放与目标文件/目录中。GFS中使用标准的copy-on-write机制生成快照,也就是说,”快照”只是增加GFS中chunk的引用计数,表示这个chunk被快照文件引用了,等到客户端修改这个chunk时,才需要在Chunk服务器中拷贝chunk的数据生成新的chunk,后续的修改操作落到新生成的chunk上。
为了对某个文件做Snapshot,首先需要停止这个文件的写服务,接着增加这个文件的所有chunk的引用计数,以后修改这些chunk时会拷贝生成新的chunk。对某个文件执行Snapshot的大致步骤如下:
1, 通过Lease机制收回对文件每一个chunk写权限,停止对文件的写服务;
2, Master拷贝文件名等元数据生成一个新的Snapshot文件;
3, 对执行Snapshot的文件的所有chunk增加引用计数;
例如,对文件foo执行快照操作生成foo_backup,foo在GFS中有三个chunk C1,C2和C3。Master首先需要收回C1,C2和C3的写Lease,从而保证文件foo处于一致的状态,接着Master复制foo文件的元数据生成foo_backup,foo_backup同样指向C1,C2和C3。快照前,C1,C2和C3只被一个文件foo引用,因此引用计数为1;执行快照操作后,这些chunk的引用计数增加为2。以后客户端再次往C3追加数据时,Master发现C3的引用计数大于1,通知C3所在的Chunk Server本次拷贝C3生成C3′,客户端的追加操作也相应地转向C3′。
ChunkServer
ChunkServer管理大小均为64MB的chunk,存储的时候需要保证chunk尽可能均匀地分布在不同的磁盘之中,可能考虑的因素包括磁盘空间,最近新建chunk数,等。另外,Linux文件系统删除64MB大文件消耗的时间太长,且没有必要,删除Chunk可以只将对应的chunk文件移动到每个磁盘中的回收站,以后新建chunk的时候可以重用。
小结:
GFS采用中心服务器的模式,该模式的最大优点是便于管理,因为中心服务器可以获知所有子服务器的状态,因而可以很方便的得知各个子服务器的负载状况等。但是这一模式也有一个比较致命的缺点,那就是单点故障。当单点故障发生在中心服务器时,将导致整个系统的不可用。不过,按照上述描述,GFS的中心服务器只是逻辑上是一个,可以知道,其实GFS的Manster还是有后备机制—shadow Master的,Master通过后备机制来应对中心服务器故障并且缩短其灾后恢复时间。
相关推荐
Google GFS 架构分析 Google File System(GFS)是 Google 早期研发的分布式文件系统,主要目标是高可用、可靠、性能和可扩展。GFS 对外提供文件创建、删除、打开、关闭、读、写、快照等接口。系统架构只有文件...
1. **主从架构**:GFS采用了主从架构,其中主节点负责管理文件系统的元数据,包括文件名、文件位置以及块信息等。从节点则负责存储实际的数据块。 2. **大块大小**:GFS中的文件块大小被设计为64MB,这是基于Google...
通过分析这个Python实现的GFS项目,你可以深入理解分布式文件系统的运作机制,包括数据的分片、复制、故障恢复等核心概念,这对于理解大规模分布式系统的设计原则和挑战非常有价值。同时,这也为开发自己的分布式...
分布式文件系统简要对比与分析 分布式文件系统是指通过高速互联的网络将不同物理节点有组织地关联起来,提供非结构化数据的永久存储。近年来,随着大规模数据分析的驱动,分布式文件系统的需求急剧增长。本文将对比...
### GFS——谷歌文件系统关键技术解析 #### 一、引言 随着互联网技术的迅猛发展,数据处理的需求急剧增加,特别是在大规模数据集中进行高效处理的需求日益显著。为此,谷歌设计并实现了Google File System (GFS),...
GFS是Google设计的一种大规模分布式文件系统,它为海量数据的存储和处理提供了高效、可扩展的解决方案。然而,如同任何复杂系统一样,GFS在其发展过程中也遇到了一致性问题,这直接影响到了系统的稳定性和可用性。...
GFS是一种分布式文件系统,专为大规模数据处理而设计,通常与大型邮件系统相结合,以提供高效、稳定和可扩展的服务。 在建设邮件系统时,我们需要明确以下几个关键点: 1. **建设目标**:通常,邮件系统的目标包括...
在分析标题为“分布式文件系统KFS的架构与性能分析.pdf”的文档时,我们可以从提供的信息中提炼出关于分布式文件系统KFS的关键知识点,及其在架构与性能方面的深入分析。文档中提及的概念和术语涵盖了分布式系统的...
### Google分布式文件系统(GFS):关键技术与设计原则 #### 概述 Google分布式文件系统(GFS),由Sanjay Ghemawat、Howard Gobioff和Shun-Tak Leung共同设计并实现,旨在为大规模数据密集型应用提供可扩展、高...
HDFS的设计理念源于Google的文件系统(Google File System, GFS),它是Google云计算基础设施的基础组成部分,为诸如MapReduce分布式计算模型和Bigtable分布式数据库等其他关键技术提供了底层支持。随着Hadoop项目的...
分布式文件系统架构通常包括以下几个关键组件: 1. **客户端(Client)**:客户端是用户与分布式文件系统交互的接口,它提供了用户友好的API,允许用户读取、写入和操作文件。客户端会将操作请求转化为适合分布式...
【谷歌文件系统(GFS)】是谷歌设计和实现的一种分布式文件系统,旨在处理大规模的数据存储和处理需求。GFS的出现,对于大数据处理和云计算领域具有里程碑式的意义,它为海量数据的高效存储和访问提供了强大的解决...
面向搜索引擎的分布式文件系统性能分析是一项专门针对搜索引擎应用场景下分布式文件系统性能的研究,其核心在于评估和优化搜索引擎底层文件系统的性能,以提升搜索引擎整体的处理能力。以下是对本文档提供的内容中...
《Google文件系统(GFS)》是一篇由Google公司的Jeff Dean和Sanjay Ghemawat共同撰写的经典论文,首次发表于2003年的ACM操作系统原理研讨会(SOSP)。这篇论文详细介绍了Google为处理大规模数据而设计的分布式文件...
Google File System(GFS)是Google开发的一个分布式文件系统,它是许多Google大规模数据处理和分析服务的核心组件。GFS的设计目标是为了解决超大规模数据存储和处理的需求,特别是在互联网搜索和其他大数据密集型...
GFS的设计与传统分布式文件系统相比,有着诸多不同之处,主要基于谷歌自身应用负载和环境的深入分析。设计者们重新审视了传统文件系统的设计折衷选择,并以此衍生出完全不同的设计思路。 GFS的一个重要设计预期是其...