Google 文件系统的工作原理

Google 文件系统是 Google 开发的一个在线工具。

Google 是一家价值数十亿美元的公司。它是万维网内外的主要参与者之一。该公司依靠分布式计算系统为用户提供访问、创建和更改数据所需的基础设施。Google 肯定会购买最先进的计算机和服务器来保持系统顺畅运行,对吗?

错了。为 Google 运营提供动力的机器并非拥有众多花哨功能的尖端高性能计算机。事实上,它们是运行 Linux 操作系统的相对廉价的机器。为什么万维网上最具影响力的公司之一会依赖廉价硬件?这是由于Google 文件系统GFS)的存在,它利用了现成服务器的优势,同时弥补了任何硬件弱点。这一切都体现在其设计中。

广告

Google 使用 GFS 来组织和操作庞大的文件,并为应用程序开发人员提供他们所需的研究和开发资源。GFS 是 Google 独有的,不予出售。但它可以作为具有类似需求组织的 文件系统的模型。

GFS 的一些细节对于 Google 外部的人来说仍然是个谜。例如,Google 不会透露它使用了多少台计算机来运行 GFS。在 Google 官方文件中,该公司只说系统中有“数千”台计算机(来源:Google)。但尽管有这层保密性,Google 已经将 GFS 的大部分结构和操作公之于众。

那么 GFS 到底有什么作用,为什么它很重要?请看下一节。

广告

Google 文件系统基础知识

Google 开发人员经常处理传统计算机文件系统难以操作的大文件。文件的大小是程序员在设计 GFS 时必须做出许多决定的驱动因素。另一个主要考虑因素是可伸缩性,它指的是向系统添加容量的容易程度。如果一个系统易于增加容量,那么它就是可伸缩的。系统性能不应随着其增长而下降。Google 需要一个非常大的计算机网络来处理其所有文件,因此可伸缩性是首要关注的问题。

由于网络如此庞大,对其进行监控和维护是一项艰巨的任务。在开发 GFS 时,程序员决定尽可能多地自动化维持系统运行所需的管理职责。这是自主计算的一个关键原则,即计算机能够实时诊断问题并解决问题,而无需人工干预。GFS 团队面临的挑战不仅是创建一个自动监控系统,还要将其设计成能够跨越庞大的计算机网络工作。

广告

团队设计的关键是简化概念。他们得出结论,系统越复杂,出现问题的频率就越高。即使系统规模庞大,简单的方法也更容易控制。

基于这一理念,GFS 团队决定用户将可以访问基本文件命令。这些命令包括打开创建读取写入关闭文件等。团队还包含了一些专用命令:追加快照。他们根据 Google 的需求创建了这些专用命令。追加允许客户端向现有文件添加信息,而不会覆盖以前写入的数据。快照是创建计算机内容快速副本的命令。

GFS 上的文件通常非常大,通常以千兆字节 (GB) 为单位。访问和操作如此大的文件会占用大量网络带宽。带宽是指系统从一个位置向另一个位置移动数据的能力。GFS 通过将文件分解为每个 64 兆字节 (MB) 的块来解决这个问题。每个块都收到一个唯一的 64 位标识号,称为块句柄。虽然 GFS 可以处理较小的文件,但其开发人员并未针对此类任务优化系统。

通过要求所有文件块具有相同的大小,GFS 简化了资源的应用。很容易看出系统中哪些计算机接近容量而哪些未充分利用。将块从一个资源传输到另一个资源以平衡系统工作负载也很容易。

GFS 的实际设计是什么?继续阅读即可了解。

广告

Google 文件系统架构

Google 将 GFS 组织成计算机集群。集群就是计算机网络。每个集群可能包含数百甚至数千台机器。GFS 集群中有三种实体:客户端主服务器块服务器

在 GFS 的世界中,“客户端”是指任何发出文件请求的实体。请求范围从检索和操作现有文件到在系统上创建新文件。客户端可以是其他计算机或计算机应用程序。您可以将客户端视为 GFS 的“客户”。

广告

主服务器充当集群的协调器。主服务器的职责包括维护一个操作日志,该日志记录了主服务器集群的活动。操作日志有助于最大限度地减少服务中断——如果主服务器崩溃,一个已监控操作日志的备用服务器可以取代它的位置。主服务器还跟踪元数据,即描述块的信息。元数据告诉主服务器这些块属于哪些文件以及它们在整个文件中的位置。启动时,主服务器会轮询其集群中的所有块服务器。块服务器通过告诉主服务器它们的库存内容来响应。从那时起,主服务器会跟踪集群中块的位置。

任何时候每个集群只有一个活动主服务器(尽管每个集群都有主服务器的多个副本,以防硬件故障)。这听起来可能像是一个瓶颈的好例子——毕竟,如果只有一台机器协调数千台计算机的集群,那不会造成数据拥堵吗?GFS 避开这个棘手的情况,通过保持主服务器发送和接收的消息非常小。主服务器根本不实际处理文件数据。它把这留给了块服务器。

块服务器是 GFS 的主力军。它们负责存储 64 MB 的文件块。块服务器不向主服务器发送块。相反,它们将请求的块直接发送给客户端。GFS 会多次复制每个块,并将其存储在不同的块服务器上。每个副本都称为副本。默认情况下,GFS 为每个块创建三个副本,但用户可以根据需要更改设置并创建更多或更少副本。

这些元素在日常过程中是如何协同工作的?请看下一节。

广告

使用 Google 文件系统

文件请求遵循标准的工作流程。读取请求很简单——客户端向主服务器发送请求,以找出客户端可以在系统上找到特定文件的位置。服务器响应相应的块主副本的位置。主副本持有主服务器授予该块的租约

如果没有副本当前持有租约,主服务器会指定一个块作为主副本。它通过将客户端的 IP 地址与包含副本的块服务器的地址进行比较来完成此操作。主服务器选择离客户端最近的块服务器。该块服务器的块成为主副本。然后客户端直接联系相应的块服务器,该服务器将副本发送给客户端。

广告

写请求稍微复杂一些。客户端仍然向主服务器发送请求,主服务器回复主副本和次副本的位置。客户端将此信息存储在内存缓存中。这样,如果客户端稍后需要引用同一副本,它可以绕过主服务器。如果主副本变为不可用或副本更改,客户端在联系块服务器之前必须再次咨询主服务器。

然后,客户端将写入数据发送到所有副本,从最近的副本开始,到最远的副本结束。最近的副本是主副本还是次副本无关紧要。Google 将这种数据传输方法比作管道

一旦副本收到数据,主副本就开始为对文件的每个更改分配连续的序列号。这些更改称为变异。序列号指示副本如何排序每个变异。然后主副本将其自身的数据按顺序应用变异。然后它向次副本发送写入请求,次副本遵循相同的应用过程。如果一切正常,集群中的所有副本都会整合新数据。次副本在应用过程结束后向主副本报告。

那时,主副本会向客户端报告。如果该过程成功,则到此结束。如果失败,主副本会告诉客户端发生了什么。例如,如果一个次副本未能用特定的变异进行更新,主副本会通知客户端并多次重试变异应用程序。如果次副本未能正确更新,主副本会告诉次副本从写入过程的开始重新开始。如果这不起作用,主服务器会将受影响的副本标识为垃圾

GFS 还做些什么?主服务器如何处理垃圾?继续阅读即可了解。

广告

其他 Google 文件系统功能

除了 GFS 提供的基本服务外,还有一些特殊功能有助于系统平稳运行。在设计系统时,GFS 开发人员知道根据系统架构肯定会出现某些问题。他们选择使用廉价硬件,这使得构建大型系统成为一种经济高效的过程。这也意味着系统中的各个计算机并不总是可靠的。廉价的标签与容易出现故障的计算机密不可分。

GFS 开发人员在系统中内置了功能,以弥补单个组件固有的不可靠性。这些功能包括主服务器和块复制、简化的恢复过程、重新平衡、过时副本检测、垃圾回收和校验和

广告

虽然每个 GFS 集群只有一个活动主服务器,但主服务器的副本存在于其他机器上。一些副本,称为影子主服务器,即使主服务器处于活动状态也提供有限的服务。这些服务仅限于读取请求,因为这些请求不会以任何方式更改数据。影子主服务器总是比主服务器稍有滞后,但这通常只差几分之一秒。主服务器副本与主服务器保持联系,监控操作日志并轮询块服务器以跟踪数据。如果主服务器发生故障且无法重新启动,次主服务器可以取代它的位置。

GFS 复制块以确保即使硬件发生故障,数据也可用。它将副本存储在不同机架上的不同机器上。这样,即使整个机架发生故障,数据仍将以可访问的格式存在于另一台机器上。GFS 使用唯一的块标识符来验证每个副本是否有效。如果某个副本的句柄与块句柄不匹配,主服务器会创建一个新副本并将其分配给块服务器。

主服务器还监视整个集群,并定期通过将块从一个块服务器移动到另一个块服务器来重新平衡工作负载。所有块服务器都在接近容量但从未达到满负荷的状态下运行。主服务器还监视块并验证每个副本是否最新。如果副本与块的识别号不匹配,主服务器会将其指定为过时副本。过时副本变为垃圾。三天后,主服务器可以删除垃圾块。这是一种安全措施——用户可以在垃圾块永久删除之前对其进行检查,并防止不必要的删除。

为防止数据损坏,GFS 使用一种称为校验和的系统。系统将每个 64 MB 的块分解为 64 千字节 (KB) 的块。块内的每个小块都有自己的 32 位校验和,这有点像指纹。主服务器通过查看校验和来监控块。如果副本的校验和与主服务器内存中的校验和不匹配,主服务器会删除该副本并创建一个新副本以替换它。

Google 在其 GFS 中使用哪种硬件?请看下一节。

广告

Google 文件系统硬件

Google 很少提及它目前用于运行 GFS 的硬件,只说它是一组现成的廉价 Linux 服务器。但在 GFS 的一份官方报告中,Google 透露了它用于运行一些 GFS 性能基准测试的设备规格。虽然测试设备可能不能真实代表当前的 GFS 硬件,但它让你了解 Google 用于处理其存储和操作的大量数据所使用的计算机类型。

测试设备包括一台主服务器、两台主副本、16 台客户端和 16 台块服务器。所有这些都使用相同规格的硬件,并且都运行 Linux 操作系统。每台设备都配有双 1.4 千兆赫奔腾 III 处理器、2 GB 内存和两块 80 GB 硬盘。相比之下,目前多家供应商提供的消费级 PC 的性能是 Google 在测试中使用的服务器的两倍多。Google 开发人员证明,GFS 可以使用适度的设备高效工作。

广告

连接这些机器的网络由 100 兆比特每秒(Mbps)的全双工以太网连接和两个惠普 2524 网络交换机组成。GFS 开发人员将 16 台客户端机器连接到一个交换机,将其他 19 台机器连接到另一个交换机。他们通过 1 千兆比特每秒(Gbps)的连接将这两个交换机连接在一起。

通过落后于硬件技术的领先地位,Google 可以以低廉的价格购买设备和组件。GFS 的结构使得可以随时轻松添加更多机器。如果一个集群开始接近满负荷,Google 可以向系统中添加更多廉价硬件并重新平衡工作负载。如果主服务器的内存负担过重,Google 可以为主服务器升级更多内存。该系统真正实现了可扩展性。

Google 是如何决定使用这个系统的?有人将其归功于 Google 的招聘政策。Google 以直接从研究生院招聘计算机科学专业学生并为他们提供实验 GFS 等系统所需的资源和空间而闻名。另一些人则认为这源于许多计算机系统开发人员(包括 Google 的创始人)似乎拥有的“用现有资源做你能做的事”的心态。最终,Google 可能选择 GFS 是因为它旨在处理有助于公司实现其组织世界信息的既定目标的那种进程。

要了解更多关于计算机系统和相关主题的信息,请查看下一页的链接。

广告

更多精彩信息

相关文章

更多精彩链接

  • Ghemawat, Sanjay, Gobioff, Howard and Leung, Shun-Tak. "The Google File System." Google. 2003.
  • Harris, Robin. "Google File System Evaluation." StorageMojo. June 13, 2006. http://storagemojo.com/?page_id=152

广告

正在加载...