GFS文件系统,一个面向大规模数据密集型应用的、可伸缩的分布式文件系统,运行在廉价的普遍硬件设备上,提供灾难冗余的能力,为大量客户机提供了高性能的服务。
GFS特点
- 灾难冗余
GFS组件的数量和质量导致在事实上,任何给定时间内都有可能发生某些组件无法工作,某些组件无法从它们目前的失效状态中恢复,因此GFS中集成了持续的监控、错误侦测、灾难冗余以及自动恢复的机制。 - 存储大规模数据
系统存储一定数量的大文件,数GB的文件非常普通,每个文件通常都包含许多应用程序对象,比如web文档。 - 尾部追加数据
绝大部分文件的修改是采用在文件尾部追加数据,而不是覆盖原有数据的方式。对文件的随机写入操作在实际中几乎不存在。 - 支持多个客户端
实现多客户端并行追加数据到同一个文件里。我们的文件通常被用于”生产者-消费者“队列,或者其它多路文件合并操作。通常会有数百个生产者,每个生产者进程运行在一台机器上,同时对一个文件进行追加操作。 - 高性能
程序绝大部分能够高速率的、大批量的处理数据,极少有程序对单一的读写操作有严格的响应时间要求。
GFS架构
读取流程
首先,客户端把文件名和程序指定的字节偏移,根据固定的Chunk大小,转换成文件的Chunk索引。然后,它把文件名和Chunk索引发送给Master节点。Master节点将相应的Chunk标识和副本的位置信息发还给客户端。客户端用文件名和Chunk索引作为key缓存这些信息。 之后客户端发送请求到其中的一个副本处,一般会选择最近的。请求信息包含了Chunk的标识和字节范围。在对这个Chunk的后续读取操作中,客户端不必再和Master节点通讯了,除非缓存的元数据信息过期或者文件被重新打开。
-
单一Master节点
采用单一的Master单一的Master节点可以通过全局的信息精确定位Chunk的位置以及进行复制决策。客户端并不通过Master节点读写文件数据。反之,客户端向Master节点询问它应该联系的Chunk服务器。客户端将这些元数据信息缓存一段时间,后续的操作将直接和Chunk服务器进行数据读写操作。 -
Chunk尺寸
Chunk的大小为64MB。选择较大的Chunk尺寸优点有:
第一,它减少了客户端和Master节点通讯的需求,因为只需要一次和Mater节点的通信就可以获取Chunk的位置信息,之后就可以对同一个Chunk进行多次的读写操作;
第二,采用较大的Chunk尺寸,客户端能够对一个块进行多次操作,这样就可以通过与Chunk服务器保持较长时间的TCP连接来减少网络负载;
第三,选用较大的Chunk尺寸减少了Master节点需要保存的元数据的数量。 -
元数据
文件和Chunk的命名空间
文件和Chunk的对应关系
每个Chunk副本的存放地点 -
一致性模型
GFS支持一个宽松的一致性模型。文件命名空间的修改)是原子性的。它们仅由Master节点的控制:命名空间锁提供了原子性和正确性的保障;Master节点的操作日志定义了这些操作在全局的顺序。
系统交互
实现数据修改操作、原子的记录追加操作以及快照功能
-
租约和变更顺序
变更是一个会改变Chunk内容或者元数据的操作,比如写入或者记录追加操作。变更操作会在Chunk的所有副本上执行。我们使用租约机制来保持多个副本间变更顺序的一致性。Master节点为Chunk的一个副本建立一个租约,我们把这个副本叫做主Chunk。主Chunk对Chunk的所有更改操作进行序列化。所有的副本都遵从这个序列进行修改操作。因此,修改操作全局的顺序首先由Master节点选择的租约的顺序决定,然后由租约中主Chunk分配的序列号决定。 -
数据流
数据流和控制流分开,在控制流从客户机到主Chunk、再到所有二级副本的同时,数据以管道的方式,顺序的沿着一个精心选择的Chunk服务器链推送。目标是充分利用每台机器的带宽,避免网络瓶颈和高延时的连接,最小化推送所有数据的延时。 -
原子的记录追加
使用记录追加,客户机只需要指定要写入的数据。GFS保证至少有一次原子的写入操作成功执行,写入的数据追加到GFS指定的偏移位置上,之后GFS返回这个偏移量给客户机。
如果记录追加操作在任何一个副本上失败了,客户端就需要重新进行操作。重新进行记录追加的结果是,同一个Chunk的不同副本可能包含不同的数据–重复包含一个记录全部或者部分的数据。GFS并不保证Chunk的所有副本在字节级别是完全一致的。它只保证数据作为一个整体原子的被至少写入一次。 -
快照
快照操作几乎可以瞬间完成对一个文件或者目录树做一个拷贝,并且几乎不会对正在进行的其它操作造成任何干扰。用户可以使用快照迅速的创建一个巨大的数据集的分支拷贝,或者是在做实验性的数据操作之前,使用快照操作备份当前状态,这样之后就可以轻松的提交或者回滚到备份时的状态。