作者:Sanjay Ghemawat
          Howard Gobioff
          Shun-Tak Leung
翻译:tinyfool

2.3 架构

一个GFS集群包含一个主服务器和多个块服务器,被多个客户端访问,如图1。这些机器通常都是普通的Linux机器,运行着一个基于用户层的服务进程。如果机器的资源允许,而且运行多个程序带来的低稳定性是可以接受的话,我们可以很简单的把块服务器和客户端运行在同一台机器。

GFS架构

图1: GFS架构

文件被分割成固定尺寸的块。在每个块创建的时候,服务器分配给它一个不变的、全球唯一的64位的块句柄对它进行标识。块服务器把块作为linux文件保存在本地硬盘上,并根据指定的块句柄和字节范围来读写块数据。为了保证可靠性,每个块都会复制到多个块服务器上。缺省情况下,我们保存三个备份,不过用户可以为不同的文件命名空间设定不同的复制级别。

主服务器管理文件系统所有的元数据。这包括名称空间,访问控制信息,文件到块的映射信息,以及块当前所在的位置。它还管理系统范围的活动,例如块租用管理,孤儿块的垃圾回收,以及块在块服务器间的移动。主服务器用心跳信息周期地跟每个块服务器通讯,给他们以指示并收集他们的状态。

GFS客户端代码被嵌入到每个程序里,它实现了Google文件系统API,帮助应用程序与主服务器和块服务器通讯,对数据进行读写。客户端跟主服务器交互进行元数据操作,但是所有的数据操作的通讯都是直接和块服务器进行的。我们并不提供POSIX API,而且调用不需要深入到Linux的vnode级别。

不管是客户端还是块服务器都不缓存文件数据。客户端缓存几乎没什么好处,因为大部分程序读取巨大文件的全部,或者工作集太大无法被缓存。不进行缓存简化了客户端和整个系统,因为无需考虑缓存相关的问题。(不过,客户端会缓存元数据。)块服务器不需要缓存文件数据的原因是,块保存成本地文件形式,Linux的缓冲器会把经常被访问的数据缓存在内存中。