Google-File-System

Google File System精要

摘要

GFS:

  • 可扩展的分布式文件系统,用于大规模分布式数据密集型应用。
  • 即使运行在大量廉价普通硬件设备上,仍然提供容错机制,并为大量客户端提供高性能服务

设计与早期分布式文件系统明显不同。

满足了存储需求;最大的集群由数千台机器的数千块硬盘组成,提供数百TB存储空间,可同时为数百台客户机提供服务。

引言

设计目的:

  • 为了满足Google快速增长的数据处理需求。

共同目标:

  • 性能、可扩展性、可靠性、可用性

不同点:

  • 组件失效是常态,而不是意外。<= 数千台廉价机器组成的存储设备,同时被相当数目的客户机访问 => 任何时候都可能有组件无法工作,无法从当前错误恢复。应用bug,系统bug,人为失误,硬盘、内存、连接器、网络、电源问题。 => 持续监控,错误检测,容错机制,自动恢复
  • 文件非常巨大(数GB文件很常见)。每个文件通常包含很多应用程序。需要经常处理快速增长的、由数亿个对象构成的TB大小级别的数据集,不宜通过管理数亿个KB大小的小文件的方式。=>I/O操作和Block的大小需要重新考虑。
  • 绝大多数文件的修改是文件追加而不是覆写。几乎不会有随机写文件。写完之后通常只读,并且是顺序读。=> 客户端对数据块缓存是没有意义的,数据追加操作是性能优化和原子性保证的核心。
  • 应用程序和系统API的协同提供了整个系统的灵活性。
    • 放松了GFS一致性模型的要求,简化了应用程序的要求
    • 引入了原子追加操作,保证多个客户端可以同时追加,而不需要额外的同步机制来保证数据一致性

设计概览

设想

预期目标:

  • 系统由大量廉价普通设备组成,运行时需要持续监控,检测,容错,恢复组件错误
  • 系统存储相当数量的大文件(数百万文件,每个100MB或更大),数百GB文件常见,需要有效管理,小文件必须支持但不必针对性优化
  • 工作负载主要来自于两种读操作:
    • 大规模流式读取:一次读取数百KB、MB或更大,同一个客户机的连续操作通常读取一个文件的连续区域
    • 小规模随机读取:随机读取数KB, 可合并小规模随机读取操作并排序,按顺序批量读
  • 负载还包括大规模、顺序的、数据追加的写操作。也支持小规模随机写。
  • 系统需要高效的、确定性的实现多客户端并发对同一个文件的追加。系统通常用于生产者-消费者队列,或多路归并。通常有数百生产者,每个运行在一个客户机上,同时追加到一个文件。最小的同步开销来实现原子的追加操作必不可少。文件可能稍后被读取,或者消费者在追加同时读取文件。
  • 高性能的稳定带宽比低延迟重要。大多数目标应用要求高速率的,大批量的处理数据,很少对单次读写操作响应时间有严格要求。

接口

  • GFS提供与传统文件系统类似的API接口
    • 文件以分层目录的形式组织,通过路径标识
    • 支持创建、删除、打开、关闭、读写文件
  • 其他接口: 快照(snapshot), 记录追加(record append)操作
    • snapshot 以较低的代价创建文件和目录树的拷贝
    • Record Append操作允许多个客户端同时对同一个文件进行追加操作,并保证每个客户端追加操作的原子性
    • 适用于多路合并、生成者-消费者队列,多客户端不需要额外的锁来追加。
    • 这种文件对构建大型分布式应用很重要。

架构

GFS集群包含一个Master节点,多个Chunk服务器,同时被多个客户端访问。架构图如下:

GFS Architecture

  • 每个机器通常是普通的linux机器,运行着用户级服务,可同时在一台机器上运行chunkserver和客户端,只要资源允许,并可接受其上运行的应用程序代码可能造成的低稳定性
  • 文件被分成固定大小的Chunk。创建Chunk时,Maser分配一个全局的、不变的、唯一的64位标识。
  • Chunk Server把chunk以linux文件的形式保存在本地磁盘,并通过chunk标识和字节范围来读写chunk
  • 为了可靠性,每个chunk会被复制到多个chunkserver,默认3副本,用户也可以为不同的文件命名空间配置不同的副本级别

Master节点:

  • 所有的文件系统元数据,包括命名空间,访问控制信息,
  • 文件和chunk的映射关系,当前chunk的位置信息。
  • 管理系统内的活动: chunk的租用管理,孤儿chunk的回收,chunk在chunk server间的迁移
  • Master利用心跳信息周期地和chunkserver进行通信以发送指令和获取状态。

GFS客户端:

  • GFS客户端代码被链接到应用中,客户端实现了文件系统API,代表应用来与Master和chunkserver节点通信以完成数据读写。
  • 客户端和Master通信时只获取元数据,所有的数据操作都是直接和chunkserver进行的,

Reference

打赏