一、设计概览
(1)设计想定:
GFS与过去的分布式文件系统有很多相同的目标,但GFS的设计受到了当前及预期的应用方面的工作量及技术环境的驱动,这反映了 它与早期的文件系统明显不同的设想。这就需要对传统的选择进行重新检验并进行完全不同的设计观点的探索。
GFS与以往的文件系统的不同的观点如下:
1、"部件"错误不再被当作异常,而是将其作为常见的情况加以处理。因为文件系统由成百上千个用于存储的机器构成,而这些机器是由廉价的普通部件组成并被大量的客户机访问。部件的数量和质量使得一些机器随时都有可能无法工作并且有一部分还可能无法恢复。所以实时地监控、错误检测、容错、自动恢复对系统来说必不可少。
2、按照传统的标准,文件都非常大。长度达几个GB的文件是很平常的。每个文件通常包含很多应用对象。当经常要处理快速增长的、包含数以万计的对象、长度达TB的数据集时,我们很难管理成千上万的KB规模的文件块,即使底层文件系统提供支持。因此,设计中操作的参数、块的大小必须要重新考虑。对大型的文件的管理一定要能做到高效,对小型的文件也必须支持,但不必优化。
3、大部分文件的更新是通过添加新数据完成的,而不是改变已存在的数据。在一个文件中随机的操作在实践中几乎不存在。一旦写完,文件就只可读,很多数据都有这些特性。一些数据可能组成一个大仓库以供数据分析程序扫描。有些是运行中的程序连续产生的数据流。有些是档案性质的数据,有些是在某个机器上产生、在另外一个机器上处理的中间数据。由于这些对大型文件的访问方式,添加操作成为性能优化和原子性保证的焦点。而在客户机中缓存数据块则失去了吸引力。
4、工作量主要由两种读操作构成:对大量数据的流方式的读操作和对少量数据的随机方式的读操作。在前一种读操作中,可能要读几百 KB,通常达1MB和更多。来自同一个客户的连续操作通常会读文件的一个连续的区域。随机的读操作通常在一个随机的偏移处读几个 KB。性能敏感的应用程序通常将对少量数据的读操作进行分类并进行批处理以使得读操作稳定地向前推进,而不要让它来来回回的读。
5、工作量还包含许多对大量数据进行的、连续的、向文件添加数据的写操作。所写的数据的规模和读相似。一旦写完,文件很少改动。 在随机位置对少量数据的写操作也支持,但不必非常高效。
6、系统必须高效地实现定义完好的大量客户同时向同一个文件的添加操作的语义。
(2)系统接口:
GFS提供了一个相似地文件系统界面,虽然它没有向POSIX那样实现标准的API。文件在目录中按层次组织起来并由路径名标识 。
(3)体系结构:
一个GFS集群由一个master和大量的chunkserver构成,并被许多客户(Client)访问。如图1所示。Master和chunkserver通常是运行用户层服务进程的Linux机器。只要资源和可靠性允许,chunkserver和c lient可以运行在同一个机器上。
文件被分成固定大小的块。每个块由一个不变的、全局唯一的64位的chunk-handle标识,chunk-handle是在块创建时由master分配的。ChunkServer将块当作Linux文件存储在本地磁盘并可以读和写由chunk-handle和位区间指定的数据。出于可靠性考虑,每一个块被复制到多个chunkserver上。默认情况下,保存3个副本,但这可 以由用户指定。
Master维护文件系统所有的元数据(metadata),包括名字空间、访问控制信息、从文件到块的映射以及块的当前位置。它也控制系统范围的活动,如块租约(lease)管理,孤立块的垃圾收集,chunkserver间的块迁移。Master定期通过HeartBeat消息与每一个chunkserver通信,给chunkserver传递指令并收集它的状态。
与每个应用相联的GFS客户代码实现了文件系统的API并与master和chunkserver通信以代表应用程序读和写数据 。客户与master的交换只限于对元数据(metadata)的操作,所有数据方面的通信都直接和chunkserver联系 。
客户和chunkserver都不缓存文件数据。因为用户缓存的益处微乎其微,这是由于数据太多或工作集太大而无法缓存。不缓存数据简化了客户程序和整个系统,因为不必考虑缓存的一致性问题。但用户缓存元数据(metadata)。Chunkserver 也不必缓存文件,因为块时作为本地文件存储的。
(4)单master:
只有一个master也极大的简化了设计并使得master可以根据全局情况作出块放置和复制的决定。但是我们必须要将master对读和写的参与减至最少,这样它才不会成为系统的瓶颈。Client从来不会从master中读和写文件数据。Clien t只是询问master它应该和哪个chunkserver联系。Client在一段限定的时间内将这些信息缓存,在后续的操作中Client直接和chunkserver交互。
以图1解释一下一个简单的读操作的交互。
1、client使用固定的块大小将应用程序指定的文件名和字节偏移转换成文件的一个块索引(chunk index)。
2、给master发送一个包含文件名和块索引的请求。
3、master回应对应的chunk handle和副本的位置(多个副本)。
4、client以文件名和块索引为键缓存这些信息。(handle和副本的位置)。
5、Client 向其中一个副本发送一个请求,很可能是最近的一个副本。请求指定了chunk handle(chunkserver以chunk handle标识chunk)和块内的一个字节区间。
6、除非缓存的信息不再有效(cache for a limited time)或文件被重新打开,否则以后对同一个块的读操作不再需要client和master间的交互。
通常Client可以在一个请求中询问多个chunk的地址,而master也可以很快回应这些请求。
(5)块规模:
块规模是设计中的一个关键参数。我们选择的是64MB,这比一般的文件系统的块规模要大的多。每个块的副本作为一个普通的Linux文件存储,在需要的时候可以扩展。
块规模较大的好处有:
1、减少client和master之间的交互。因为读写同一个块只是要在开始时向master请求块位置信息。对于读写大型文 件这种减少尤为重要。即使对于访问少量数据的随机读操作也可以很方便的为一个规模达几个TB的工作集缓存块位置信息。
2、Client在一个给定的块上很可能执行多个操作,和一个chunkserver保持较长时间的TCP连接可以减少网络负载 。
3、这减少了master上保存的元数据(metadata)的规模,从而使得可以将metadata放在内存中。这又会带来一 些别的好处。
不利的一面:
一个小文件可能只包含一个块,如果很多Client访问改文件的话,存储这些块的chunkserver将成为访问的热点。但在 实际应用中,应用程序通常顺序地读包含多个块的文件,所以这不是一个主要问题。
(6)元数据(metadata):
master存储了三中类型的metadata:文件的名字空间和块的名字空间,从文件到块的映射,块的副本的位置。所有的me tadata都放在内存中。前两种类型的metadata通过向操作日志记录修改而保持不变,操作日志存储在master的本地磁盘并在几个远程机器上留有副本。使用日志使得我们可以很简单地、可靠地更新master的状态,即使在master崩溃的情况下也不会有不一致的问题。相反,mater在每次启动以及当有chuankserver加入的时候询问每个chunkserver的所拥有的块的情况。
A、内存数据结构:
因为metadata存储在内存中,所以master的操作很快。进一步,master可以轻易而且高效地定期在后台扫描它的整个状态。这种定期地扫描被用于实现块垃圾收集、chunkserver出现故障时的副本复制、为平衡负载和磁盘空间而进行的块迁移。
这种方法的一个潜在的问题就是块的数量也即整个系统的容量是否受限与master的内存。实际上,这并不是一个严重的问题。Master为每个64MB的块维护的metadata不足64个字节。除了最后一块,文件所有的块都是满的。类似的,每个文件的名字空间数据也不足64个字节,因为文件名是以一种事先确定的压缩方式存储的.如果要支持更大的文件系统,那么增加一些内存的方法对于我们将元数据(metadata)保存在内存种所获得的简单性、可靠性、高性能和灵活性来说,这只是一个很小的代价。
B、块位置:
master并不为chunkserver所拥有的块的副本的保存一个不变的记录。它在启动时通过简单的查询来获得这些信息。Master可以保持这些信息的更新,因为它控制所有块的放置并通过Heart Beat消息来监控chunkserver的状态。
这样做的好处:因为chunkserver可能加入或离开集群、改变路径名、崩溃、重启等,一个集群重有成百个server,这 些事件经常发生,这种方法就排除了master与chunkserver之间的同步问题。
另一个原因是:只有chunkserver才能确定它自己到底有哪些块,由于错误,chunkserver中的一些块可能会很自 然的消失,这样在master中就没有必要为此保存一个不变的记录。
C、操作日志:
操作日志包含了对metadata所作的修改的历史记录。它作为逻辑时间线定义了并发操作的执行顺序。文件、块以及它们的版本号 都由它们被创建时的逻辑时间而唯一地、永久地被标识。
操作日志是如此的重要,我们必须要将它可靠地保存起来,并且只有在metadata的改变固定下来之后才将变化呈现给用户。所以 我们将操作日志复制到数个远程的机器上,并且只有在将相应的日志记录写到本地和远程的磁盘上之后才回答用户的请求。
Master可以用操作日志来恢复它的文件系统的状态。为了将启动时间减至最小,日志就必须要比较小。每当日志的长度增长到超过 一定的规模后,master就要检查它的状态,它可以从本地磁盘装入最近的检查点来恢复状态。
创建一个检查点比较费时,master的内部状态是以一种在创建一个检查点时并不耽误即将到来的修改操作的方式来组织的。Master切换到一个新的日志文件并在一个单独的线程中创建检查点。这个新的检查点记录了切换前所有的修改。在一个有数十万文件的集群中用一分钟左右就能完成。创建完后, 将它写入本地和远程的磁盘。
(7)数据完整性:
名字空间的修改必须是原子性的,它们只能有master处理:名字空间锁保证了操作的原子性和正确性,而master的操作日志 在全局范围内定义了这些操作的顺序。
文件区间的状态在修改之后依赖于修改的类型,不论操作成功还是失败,也不论是不是并发操作。如果不论从哪个副本上读,所有的客户都看到同样的数据,那么文件的这个区域就是一致的。如果文件的区域是一致的并且用户可以看到修改操作所写的数据,那么它就是已定义的。如果修改是在没有并发写操作的影响下完成的,那么受影响的区域是已定义的,所有的client都能看到写的内容。成功的并发写操作是未定义但却是一致的。失败的修改将使区间处于不一致的状态。
Write操作在应用程序指定的偏移处写入数据,而record append操作使得数据(记录)即使在有并发修改操作的情况下也至少原子性的被加到GFS指定的偏移处,偏移地址被返回给用户 。
在一系列成功的修改操作后,最后的修改操作保证文件区域是已定义的。GFS通过对所有的副本执行同样顺序的修改操作并且使用块版 本号检测过时的副本(由于chunkserver退出而导致丢失修改)来做到这一点。
因为用户缓存了块位置信息,所以在更新缓存之前有可能从一个过时的副本中读取数据。但这有缓存的截止时间和文件的重新打开而受到 限制。
在修改操作成功后,部件故障仍可以是数据受到破坏。GFS通过master和chunkserver间定期的handshake ,借助校验和来检测对数据的破坏。一旦检测到,就从一个有效的副本尽快重新存储。只有在GFS检测前,所有的副本都失效,这个块 才会丢失。
[GFS学习(二):http://shift-alt-ctrl.iteye.com/blog/1842217]
[GFS学习(三):http://shift-alt-ctrl.iteye.com/blog/1842219]
相关推荐
通过深入理解和学习GFS,我们可以更好地理解大数据处理的挑战和解决方案,这对于从事云计算、大数据领域的专业人士来说是必不可少的知识基础。阅读这篇论文,不仅可以了解GFS的具体实现,还能启发我们思考如何设计和...
在大数据处理领域,Hadoop是一个不可或缺的名字,而GFS(Google File System)和MapReduce则是Hadoop生态系统中的核心组件。本篇将深入探讨这三个概念及其相互关系。 首先,GFS是Google设计的一种分布式文件系统,...
学习GFS2文件系统对于任何希望在集群环境中部署高性能共享存储解决方案的系统管理员来说都是至关重要的。它为集群节点提供了可靠的数据共享和访问能力,确保了数据的一致性、可靠性和可扩展性,是企业级IT环境中不可...
这个实验包是针对GFS的一个学习资源,旨在帮助用户理解和掌握分布式文件系统的原理和操作。在Linux环境中,GFS是一种关键的技术,因为它能够提供高可用性、可扩展性和容错性,对于处理大数据量的计算任务至关重要。 ...
《谷歌文件系统(GFS)》是谷歌在2003年发布的一篇著名论文,它详述了谷歌为处理海量数据而设计的一种分布式存储系统。这篇论文在信息技术领域具有里程碑式的意义,对后续的云存储和大数据处理系统产生了深远影响。...
标题中的“GFS BigTable MapReduce中文版”指的是Google三篇经典的分布式系统论文的...对于想要学习和理解Google云计算架构的专业人士,这是一个非常宝贵的资源,可以帮助他们克服语言障碍,更深入地掌握这些关键技术。
GFS Toolbox是一款专为研究和学习类型-2模糊系统(Type-2 Fuzzy Systems)而设计的软件工具箱。该工具箱提供了一系列的功能和算法,旨在帮助用户理解、设计和实现复杂的模糊逻辑控制策略。在模糊逻辑领域,类型-2...
《Google三篇论文-GFS英文版.pdf》是一份重要的技术文档,详细介绍了Google文件系统(Google File System, GFS)的设计原理和技术特点。这篇论文由Google公司的Sanjay Ghemawat、Howard Gobioff和Shun-Tak Leung共同...
【分布式系统学习——GFS谷歌文件系统Paper翻译1】 谷歌文件系统(Google File System, GFS)是一个专为大规模分布式数据处理设计的可扩展的分布式文件系统。它基于普通的、价格适中的硬件设备,旨在在容错性、性能...
接下来,GFS(Google File System)是谷歌开发的一个大规模分布式文件系统。GFS的目标是为处理海量数据提供一个高吞吐量的平台。它将大型文件分割成块,并在多台机器上冗余存储,确保数据的可用性和容错性。GFS的...
1. **Google File System (GFS)**: GFS是Google设计的一个分布式文件系统,它针对大规模数据处理的特定需求进行了优化。GFS的核心设计理念是高可用性、容错性和可扩展性。系统由主服务器(Master)和多个Chunk服务器...
GFS,全称为Google File System,是谷歌设计并实现的一款分布式文件系统,旨在处理大规模的数据存储和...通过学习和部署GFS,我们可以更好地理解大数据存储和处理的基本原理,为构建大规模的分布式应用打下坚实的基础。
GFS是Google设计的一种分布式文件系统,专为处理海量数据而构建。它具有高容错性、可扩展性和高性能的特点。GFS将大文件分割成固定大小的块,这些块被复制到多个节点上,确保数据的可靠性和可用性。主服务器管理文件...
现在,我们拥有的是一份包含这些核心论文的2021年修正版集合,涵盖了中英文版本的PDF和Word文档,方便读者深入学习和研究。 **谷歌分布式文件系统(GFS)** GFS,全称为Google File System,是谷歌设计的一个大...
GFS,全称为Google File System,是Google设计的一种分布式文件系统,用于存储和处理海量数据。GFS的核心目标是提供高吞吐量的数据访问,以支持大规模的并行计算任务。它将大文件分割成多个块(通常为64MB),并分布...
首先,"The Google File System"(GFS)是由Google开发的一种分布式文件系统,旨在支持大规模、并行的数据处理。GFS的核心设计理念是将单一的大文件分割成多个小块,这些块分布在多台服务器上,提供高可用性和容错性...
【GFS】(Google 文件系统)是Google设计的一种分布式文件系统,它被广泛应用于大规模数据处理和存储。GFS的设计目标是为了支持大规模、并行的数据处理应用,它具有高容错性、高吞吐量和低延迟的特点。GFS的核心思想是...
**GFS(Google File System)**是Google设计的一种分布式文件系统,专为处理海量数据而构建。GFS的核心特性包括大文件、简单的接口、高容错性和可扩展性。它将大文件分割成固定大小的块,并将这些块复制到多个节点上...
首先,Google File System(GFS)是Google设计的一个分布式文件系统。它专为处理非常大、不可预测增长的数据集而构建,旨在支持大规模并行计算任务。GFS的核心特性包括强一致性模型、大块数据存储(通常为64MB或更大...
通过学习GFS,我们可以了解如何构建高可用的分布式文件系统;通过MapReduce,我们可以掌握如何编写处理海量数据的并行程序;通过BigTable,我们可以理解如何设计适应大规模数据的分布式数据库。这些知识对于从事大...