Google File System架构
GFS是一个面向大规模数据密集型应用的,可伸缩的分布式文件系统。GFS可以运行在廉价的设备上,并且能够提供具有容灾、高性能的服务。
GFS架构:
一个GFS集群包括一个单点Master,多台Chunk服务器 (ChunkServer,下面也称块服务器),并且能够同时被多个客户端访问。如图1所示。所有的这些机器可以使普通的运行用户级线程的Linux机器。只要机器允许,我们完全可以将客户端与Chunk服务器放在同一台机器上。
GFS上存储的文件被分割成固定大小的Chunk(块)。Chunk服务器把 Chunk以Linux文件的形式保存在本地磁盘上行,并根据指定的Chunk标识和字节范围来读写数据。处于可靠性的考虑,每个块会复制到多个 chunk服务器上。默认情况下,GFS被将块复制为3份,当然,用户可以指定这个参数。
Master节点管理着所有的文件系统元数据,包括命名空间、访问控制信息、文件和 Chunk之间的映射信息、以及当前chunk的位置信息。Master节点还管理着全系统范围内的活动,如块的租用管理、孤立块的回收、以及块在不同块服务器间的移动。Master使用心跳信息周期性的和每个Chunk服务器通讯,并发送指令到各个块服务器并接收各个块服务器的状态信息。
无论是客户端还是块服务器都无需对文件数据进行缓存。客户端无需缓存的原因,因为大部分程序需要以流的方式读取一个巨大的文件,再者,工作集可能会很大以至于无法进行缓存。块服务器无需缓存数据的原因,块一本地的方式保存,Linux文件系统缓存会把经常访问的数据缓存在内存中。
下面简单解释下在单点Master下一次简单的读取过程:
(1)客户端向Master发送请求,请求信息为(文件名,块索引)
(2)Master使用心跳信息监控块服务器的状态,并向其发送指令。
(3)块服务器需要周期性的返回自己的状态给Master,以确保能够接收Master的请求。
(4)Master将(块句柄,块位置)这一信息返回给客户端
(5)客户端使用文件名和块索引作为Key进行缓存信息。然后,客户端发送请求到其中的一个副本中(通常为最近的),该请求包括(块句柄,字节范围)。对这个块的后续操作,客户端无需再和Master进行通信,除非缓存信息过期或者文件被重新打开。
(6)块服务器将所需的块数据发送给客户端。
整个流程如下图所示: