Google论文之 Google File System

摘要

GFS 文件系统,一个面向大规模数据密集型应用的、可伸缩的分布式文件系统。GFS 虽然运行在廉价的普遍硬件设备上,但是它依然了提供灾难冗余的能力,为大量客户机提供了高性能的服务。

1. 简介

GFS 与传统的分布式文件系统有着很多相同的设计目标,比如,性能、可伸缩性、可靠性以及可用性。但是,在重新审视了传统文件系统在设计上的折衷选择,衍生 出了完全不同的设计思路。

  1. 首先,组件失效被认为是常态事件,而不是意外事件。所以,持续的监控、错误侦测、灾难冗余以及自动恢复的机制必须集成在 GFS 中。
  2. 其次,以通常的标准衡量,我们的文件非常巨大。
  3. 第三,绝大部分文件的修改是采用在文件尾部追加数据,而不是覆盖原有数据的方式。对文件的随机写入操作在实际中几乎不存在。一旦写完之后,对文件的操作就只有读,而且通常是按顺序读。
  4. 第四,应用程序和文件系统 API 的协同设计提高了整个系统的灵活性。

2. 设计概述

GFS 提供了一套类似传统文件系统的 API 接口函数,虽然并不是严格按照 POSIX 等标准 API 的形式实现 的。文件以分层目录的形式组织,用路径名来标识。我们支持常用的操作,如创建新文件、删除文件、打开 文件、关闭文件、读和写文件。
另外,GFS 提供了快照和记录追加操作。快照以很低的成本创建一个文件或者目录树的拷贝。记录追加 操作允许多个客户端同时对一个文件进行数据追加操作,同时保证每个客户端的追加操作都是原子性的。
一个 GFS 集群包含一个单独的 Master 节点、多台 Chunk(块) 服务器(相当于HDFS的datanode),并且同时被多个客户端访问,如图 1所示。


GFS 存储的文件都被分割成固定大小的 Chunk。在 Chunk 创建的时候,Master 服务器会给每个 Chunk 分配一个不变的、全球唯一的 64 位的 Chunk 标识。Chunk 服务器把 Chunk 以 Linux 文件的形式保存在本地硬盘上,并且根据指定的 Chunk 标识和字节范围来读写块数据。出于可靠性的考虑,每个块都会复制到多个块服务器上。缺省情况下,我们使用 3 个存储复制节点,不过用户可以为不同的文件命名空间设定不同的复制级别。
Master 节点管理所有的文件系统元数据。这些元数据包括名字空间、访问控制信息、文件和 Chunk 的映射信息、以及当前 Chunk 的位置信息。Master 节点还管理着系统范围内的活动,比如,Chunk 租用管理、孤儿 Chunk的回收、以及 Chunk 在 Chunk 服务器之间的迁移。Master 节点使用心跳信息周期地和每个 Chunk服务器通讯,发送指令到各个 Chunk服务器并接收 Chunk 服务器的状态信息。
GFS 客户端代码以库的形式被链接到客户程序里。客户端代码实现了 GFS 文件系统的 API 接口函数、应用程序与 Master 节点和 Chunk 服务器通讯、以及对数据进行读写操作。客户端和 Master 节点的通信只获取元数据,所有的数据操作都是由客户端直接和 Chunk 服务器进行交互的。
单一的 Master 节点可以通过全局的信息精确定位Chunk 的位置以及进行复制决策。另外,我们必须减少对 Master 节点的读写,避免 Master 节点成为系统的瓶颈。客户端并不通过 Master 节点读写文件数据。反之,客户端向 Master 节点询问它应该联系的 Chunk 服务器。客户端将这些元数据信息缓存一段时间,后续的操作将直接和 Chunk 服务器进行数据读写操作。
解释一下一次简单读取的流程。首先,客户端把文件名和程序指定的字节偏移,根据固定 的 Chunk 大小,转换成文件的 Chunk 索引。然后,它把文件名和 Chunk 索引发送给 Master 节点。Master 节 点将相应的 Chunk 标识和副本的位置信息发还给客户端。客户端用文件名和 Chunk 索引作为 key 缓存这些信 息。之后客户端发送请求到其中的一个副本处,一般会选择最近的。请求信息包含了 Chunk 的标识和字节范 围。在对这个 Chunk 的后续读取操作中,客户端不必再和 Master 节点通讯了,除非缓存的元数据信息过期或 者文件被重新打开。
选择较大的 Chunk 尺寸有几个重要的优点。首先,它减少了客户端和 Master 节点通讯的需求,因为只需要一次和 Mater 节点的通信就可以获取 Chunk 的位置信息,之后就可以对同一个 Chunk 进行多次的读写操作。这种方式对降低我们的工作负载来说效果显著,因为我们的应用程序通常是连续读写大文件。即使是小规模的随机读取,采用较大的 Chunk 尺寸也带来明显的好处,客户端可以轻松的缓存一个数 TB 的工作数据集所有的 Chunk 位置信息。其次,采用较大的 Chunk 尺寸,客户端能够对一个块进行多次操作,这样就可以通过与 Chunk 服务器保持较长时间的TCP 连接来减少网络负载。第三,选用较大的 Chunk 尺寸减少了 Master节点需要保存的元数据的数量。这就允许我们把元数据全部放在内存中。
采用较大的 Chunk 尺寸也有其缺陷。小文件包含较少的 Chunk,甚至只有一个 Chunk。当有许多的客户端对同一个小文件进行多次的访问时,存储这些 Chunk 的 Chunk 服务器就会变成热点。通过使用更大的复制参数来保存可 执行文件,以及错开批处理队列系统程序的启动时间的方法可以解决这个问题。
Master 服务器存储 3 种主要类型的元数据,包括:文件和 Chunk 的命名空间、文件和 Chunk 的对应关系、每个 Chunk 副本的存放地点。所有的元数据都保存在Master 服务器的内存中。前两种类型的元数据同时也会以记录变更日志的方式记录在操作系统的系统日志文件中,日志文件存储在本地磁盘上,同时日志会被复制到其它的远程Master服务器上。采用保存变更日志的方式,我们能够简单可靠的更新 Master 服务器的状态, 并且不用担心 Master 服务器崩溃导致数据不一致的风险。Master 服务器不会持久保存 Chunk 位置信息。Master 服务器在启动时,或者有新的 Chunk 服务器加入时,向各个 Chunk 服务器轮询它们所存储的 Chunk 的信息。
因为元数据保存在内存中,所以 Master 服务器的操作速度非常快。并且,Master 服务器可以在后台简单 而高效的周期性扫描自己保存的全部状态信息。这种周期性的状态扫描也用于实现 Chunk 垃圾收集、在 Chunk 服务器失效的时重新复制数据、通过 Chunk 的迁移实现跨 Chunk 服务器的负载均衡以及磁盘使用状况统计等 功能。
将元数据全部保存在内存中的方法有潜在问题:Chunk 的数量以及整个系统的承载能力都受限于 Master 服务器所拥有的内存大小。但是在实际应用中,这并不是一个严重的问题。Master 服务器只需要不到 64 个字 节的元数据就能够管理一个 64MB 的 Chunk。同样的,每个文件的在命名空间中的数据大小通常在 64字节以下,因为保存的文件名是用前缀压缩算法压缩过的。
Master 服务器并不持久化保存哪个 Chunk 服务器存有指定 Chunk 的副本的信息。Master 服务器只是在启动的时候轮询 Chunk 服务器以获取这些信息。Master 服务器能够保证它持有的信息始终是最新的,因为 它控制了所有的 Chunk 位置的分配,而且通过周期性的心跳信息监控 Chunk 服务器的状态。
操作日志包含了关键的元数据变更历史记录。这对 GFS 非常重要。这不仅仅是因为操作日志是元数据唯 一的持久化存储记录,它也作为判断同步操作顺序的逻辑时间基线。操作日志非常重要,我们必须确保日志文件的完整,确保只有在元数据的变化被持久化后,日志才对客 户端是可见的。我们会把日志复制到多台远程机器,并且只有把相应的日志记录写入到本地以及远程 机器的硬盘后,才会响应客户端的操作请求。Master 服务器在灾难恢复时,通过重演操作日志把文件系统恢复到最近的状态。为了缩短 Master 启动的 时间,我们必须使日志足够小。Master 服务器在日志增长到一定量时对系统状态做一次 Checkpoint,将所 有的状态数据写入一个 Checkpoint 文件。在灾难恢复的时候,Master 服务器就通过从磁盘上读取这个Checkpoint 文件,以及重演 Checkpoint 之后的有限个日志文件就能够恢复系统。Master 服务器恢复只需要最新的 Checkpoint 文件和后续的日志文件。旧的 Checkpoint 文件和日志文件可 以被删除。

3.系统交互

我们在设计这个系统时,一个重要的原则是最小化所有操作和 Master 节点的交互。
变更是一个会改变 Chunk 内容或者元数据的操作,比如写入操作或者记录追加操作。变更操作会在 Chunk的所有副本上执行。我们使用租约(lease)机制来保持多个副本间变更顺序的一致性。Master 节点为 Chunk的一个副本建立一个租约,我们把这个副本叫做主Chunk。主 Chunk 对 Chunk 的所有更改操作进行序列化。所有的副本都遵从这个序列进行修改操作。设计租约机制的目的是为了最小化 Master 节点的管理负担。
在图 2 中,我们依据步骤编号,展现写入操作的控制流程。



客户机向 Master 节点询问哪一个 Chunk 服务器持有当前的租约,以及其它副本的位置。如果没有一个 Chunk 持有租约,Master 节点就选择其中一个副本建立一个租约(这个步骤在图上没有显示)。Master 节点将主 Chunk 的标识符以及其它副本(又称为 secondary 副本、二级副本)的位置返回给客户 机。客户机缓存这些数据以便后续的操作。只有在主 Chunk 不可用,或者主 Chunk 回复信息表明它已不再持 有租约的时候,客户机才需要重新跟 Master 节点联系。客户机把数据推送到所有的副本上。客户机可以以任意的顺序推送数据。Chunk 服务器接收到数据并保 存在它的内部 LRU 缓存中,一直到数据被使用或者过期交换出去。当所有的副本都确认接收到了数据,客户机发送写请求到主 Chunk 服务器。这个请求标识了早前推送到 所有副本的数据。主 Chunk 为接收到的所有操作分配连续的序列号,这些操作可能来自不同的客户机,序列 号保证了操作顺序执行。它以序列号的顺序把操作应用到它自己的本地状态中。主 Chunk 把写请求传递到所有的二级副本。每个二级副本依照主 Chunk 分配的序列号以相同的顺序执行 这些操作。所有的二级副本回复主 Chunk,它们已经完成了操作。主 Chunk 服务器回复客户机。任何副本产生的任何错误都会返回给客户机。
为了提高网络效率,我们采取了把数据流和控制流分开的措施。在控制流从客户机到主 Chunk、然后再 到所有二级副本的同时,数据以管道的方式,顺序的沿着一个精心选择的 Chunk 服务器链推送。我们的目标 是充分利用每台机器的带宽,避免网络瓶颈和高延时的连接,最小化推送所有数据的延时。为了尽可能的避免出现网络瓶颈和高延迟的链接,每台机器 都尽量的在网络拓扑中选择一台还没有接收到数据的、离自己最近的机器作为目标推送数据。
GFS 提供了一种原子的数据追加操作–记录追加。
快照操作几乎可以瞬间完成对一个文件或者目录树(“源”)做一个拷贝,并且几乎不会对正在进行的其 它操作造成任何干扰。我们用标准的 copy-on-write 技术实现快照。当 Master 节点收到一个快照请求,它首先取消作快照的文件的所有 Chunk 的租约。这个措施 保证了后续对这些 Chunk 的写操作都必须与 Master 交互以找到租约持有者。这就给 Master 节点一个率先创建 Chunk 的新拷贝的机会。租约取消或者过期之后,Master 节点把这个操作以日志的方式记录到硬盘上。然后,Master 节点通过复 制源文件或者目录的元数据的方式,把这条日志记录的变化反映到保存在内存的状态中。新创建的快照文件 和源文件指向完全相同的 Chunk 地址。在快照操作之后,当客户机第一次想写入数据到 Chunk C,它首先会发送一个请求到 Master 节点查询当 前的租约持有者。Master 节点注意到 Chunk C 的引用计数超过了 1。Master 节点不会马上回复客户机的请求, 而是选择一个新的 Chunk 句柄 C`。之后,Master 节点要求每个拥有 Chunk C 当前副本的 Chunk 服务器创建一 个叫做 C`的新 Chunk。通过在源 Chunk 所在 Chunk 服务器上创建新的 Chunk,我们确保数据在本地而不是通 过网络复制。从这点来讲,请求的处理方式和任何其它 Chunk 没什么不同:Master 节点确保新 Chunk C`的一个副本拥有租约,之后回复客户机,客户机得到回复后就可以 正常的写这个 Chunk,而不必理会它是从一个已存在的 Chunk 克隆出来的。

4. Master节点的操作

Master 节点执行所有的名称空间操作。此外,它还管理着整个系统里所有 Chunk 的副本:它决定 Chunk 的存储位置,创建新 Chunk 和它的副本,协调各种各样的系统活动以保证 Chunk 被完全复制,在所有的 Chunk 服务器之间的进行负载均衡,回收不再使用的存储空间。
在逻辑上,GFS 的名称空间就是一个全 路径和元数据映射关系的查找表。利用前缀压缩,这个表可以高效的存储在内存中。在存储名称空间的树型 结构上,每个节点(绝对路径的文件名或绝对路径的目录名)都有一个关联的读写锁。采用这种锁方案的优点是支持对同一目录的并行操作。因为名称空间可能有很多节点,读写锁采用惰性分配策略,在不再使用的时候立刻被删除。
Chunk 副本位置选择的策略服务两大目标:最大化数据可靠性和可用性,最大化网络带宽利用率。
Chunk 的副本有三个用途:Chunk 创建,重新复制和重新负载均衡。
Master 服务器周期性地对副本进行重新负载均衡:它检查当前的副本分布情况,然后移动副本以 便更好的利用硬盘空间、更有效的进行负载均衡。
GFS 在文件删除后不会立刻回收可用的物理空间。GFS 空间回收采用惰性的策略,只在文件和 Chunk 级 的常规垃圾收集时进行。
当一个文件被应用程序删除时,Master 节点象对待其它修改操作一样,立刻把删除操作以日志的方式记 录下来。但是,Master 节点并不马上回收资源,而是把文件名改为一个包含删除时间戳的、隐藏的名字。当 Master 节点对文件系统命名空间做常规扫描的时候,它会删除所有三天前的隐藏文件(这个时间间隔是可以 设置的)。直到文件被真正删除,它们仍旧可以用新的特殊的名字读取,也可以通过把隐藏文件改名为正常显 示的文件名的方式“反删除”。当隐藏文件被从名称空间中删除,Master 服务器内存中保存的这个文件的相关 元数据才会被删除。这也有效的切断了文件和它包含的所有 Chunk 的连接。
在对 Chunk 名字空间做类似的常规扫描时,Master 节点找到孤儿 Chunk(不被任何文件包含的 Chunk) 并删除它们的元数据。Chunk 服务器在和 Master 节点交互的心跳信息中,报告它拥有的 Chunk 子集的信息, Master 节点回复 Chunk 服务器哪些 Chunk 在 Master 节点保存的元数据中已经不存在了。Chunk 服务器可以任 意删除这些 Chunk 的副本。
垃圾回收在空间回收方面相比直接删除有几个优势。首先,对于组件失效是常态的大规模分布式系统, 垃圾回收方式简单可靠。另外,垃圾回收在 Master 节点相对空闲的时候完成。这样 Master节点就可以给那些需要快速反应的客户机请求提供更快捷的响应。第三,延缓存储空间回收为意外的、不可逆转的删除操作提供了安全保障。延迟回收空间的主要问题是,延迟回收会阻碍用户调优存储空间的使用,特别是当存储空间比较紧缺的时候。当应用程序重复创建和删除临时文件时,释放的存储空间不能马上重用。

5. 容错和诊断

在 GFS 集群的数百个服务器之中,在任何给定的时间必定会有些服务器是不可用的。我们使用两条简单但是有效的策略保证整个系统的高可用性:快速恢复和复制。
为了保证 Master 服务器的可靠性,Master 服务器的状态也要复制。Master 服务器所有的操作日志和 checkpoint 文件都被复制到多台机器上。对 Master 服务器状态的修改操作能够提交成功的前提是,操作日志 写入到 Master 服务器的备节点和本机的磁盘。简单说来,一个 Master 服务进程负责所有的修改操作,包括后 台的服务,比如垃圾回收等改变系统内部状态活动。当它失效的时,几乎可以立刻重新启动。如果 Master 进 程所在的机器或者磁盘失效了,处于 GFS 系统外部的监控进程会在其它的存有完整操作日志的机器上启动一 个新的 Master 进程。
此外,GFS 中还有些“影子”Master 服务器,这些“影子”服务器在“主”Master 服务器宕机的时候提 供文件系统的只读访问。
每个 Chunk 服务器都使用 Checksum 来检查保存的数据是否损坏。我们可以通过别的 Chunk 副本来解决数据损坏问题,但是跨越 Chunk 服务器比较副本来检查数据是否损坏很 不实际。因此,每个 Chunk 服务器必须独立维 护 Checksum 来校验自己的副本的完整性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,928评论 2 89
  • 分布式文件系统的主要功能有两个:一个是存储文档、图像、视频之类的Blob类型数据;另外一个是作为分布式表格系统的持...
    olostin阅读 3,146评论 1 5
  • 众所周知,Hadoop的存储基础,HDFS分布式文件系统,是按照GFS的思想实现的。本文参考:Google Fil...
    SmileySure阅读 1,101评论 0 1
  • sina Google File System,一个适用于大规模分布式数据处理相关应用的,可扩展的分布式文件系统。...
    橙小汁阅读 686评论 0 0
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,843评论 0 5