读完《The Google File System》,记录下学习心得:

1)组件的失效是经常的事情,GFS把这放在考虑的首位,持续性的系统监控,错误检测,

容错机制,自动恢复至关重要。

2)读写的文件巨大,I/O操作机制和数据块的大小要重新审视,应以MB计。

3)对文件的互斥操作主要是数据追加,而非覆写,对文件的随机写几乎不存在。文件一旦写操作完成后,后续就只是进行顺序的读操作。因此,数据追加操作是性能优化和原子性操作保证的核心。好像和Hadoop不同,GFS在客户端不进行数据块的缓存。

4)为了不对上层应用施加过严的限制,GFS甚至放宽了文件系统的一致性模型,也为了简化上层应用,设计了一个原子性的数据追加操作,上层应用勿需借助额外的同步机制。

5)读操作有两种类型:大数据量的流式读,小数据量的随机读。前者一般是一些批处理类型的应用,并且会在读操作提交前对操作进行一些优化操作(比如排序等)。

6)多个用户同时向同一个文件进行数据追加操作,比如文件用来作为消费者-生产者的队列或用于多路合并,多个生产者会向文件进行数据追加,并且单个的消费者会在过后或同时读此文件,GFS必须保证操作原子性和数据一致性。

7GFS实现了镜像,可以对一个文件或一棵目录树进行拷贝,Hadoop还没加入此功能。

8GFS集群包括一个单个的主节点和多个从节点。文件被划分为多个固定大小的数据块。每个数据块由一个不可改变的全局唯一的64位块句柄标识,这个块句柄由主节点在创建数据块时指派。从节点将数据块保存为本地硬盘上的linux文件,并负责读写指定块句柄和字节范围的块数据。每个数据块在多个子节点上备份,默认情况下是保存3份拷贝。

论文阅读笔记(一)_客户端

9)主节点负责维护文件系统所有的元数据,包括命名空间,访问控制信息,文件到数据块的映射信息,数据块的当前位置。同时它还负责系统全局范围的活动,比如数据块租约管理,无用块的垃圾回收,子节点间的数据块移动。主节点还周期性地发送心跳包给各个子节点,给子节点发送指令并收集其状态。

10)客户端与主节点间进行元数据操作的交互,而所有的数据通信是直接与各个子节点进行的。

11)客户端和子节点都不缓存文件数据。客户端不缓存是因为应用程序对大文件都是流式读,要不就是工作集太大,缓存几乎不可能。不缓存的优点是不用考虑cache的一致性问题,从而简化了客户端和整个系统的设计。子节点不缓存是因为数据块都以本地的linux文件形式保存,而linux的缓存机制已经够用了。

(12)单个主节点要尽量不参与文件的实际读写操作,以免成为系统的瓶颈。客户端向主节点询问哪些子节点上有需要的数据块,然后对主节点返回的结果列表缓存一段时间,接下来的读操作就直接与目标子节点之间进行了。

举例来说,客户端把文件名和数据块索引号打包发送给主节点,主节点就以数据块句柄和备份所在位置作为应答信息,客户端再以文件名和块索引号作为键缓存这些信息。然后客户端向其中一个备份(一般是最近的一个)发送请求,请求中指定了块句柄和要读的字节范围。除非缓存信息失效或文件被重新打开,以后读同一个数据块就不需要客户端和主节点间再进行交互了。实际上,客户端一般在对主节点的一次请求中会查询多个数据块的信息,并且主节点也会把接下来的数据块的信息提供给客户端,这大大减小了额外的网络通信量。

(13)数据块的大小是64M,每个数据块备份在子节点上保存为一个普通的linux文件,并只再需要时才进行扩充。同时使用延迟分配策略以避免因内部碎片导致的空间浪费,而这在大数据块中是一个很常见的问题。优点:1)减少了客户端和主节点的交互,因为对同一个数据块的读写只需要向主节点发送一个请求去查询它的位置信息,而这对于顺序读写大数据文件的应用来说是至关重要的。2)由于客户端是对本地的一个大数据块进行操作,从而减小了维护一个到子节点的TCP连接的网络消耗。3)减少了主节点中存储的元数据量,这就使得主节点可以将元数据放置在内存中。缺点:小文件只包含一个或几个数据块,如果很多客户端同时访问这个文件,那么保存这些数据块的子节点就会成为瓶颈。此时我们可以考虑提供备份因子,并让系统在某些特定时间段内“stagger”一下,当然最好的解决方案是类似p2p的处理机制,让需要的用户从其他用户那去获取数据块。

14)主节点中保存了3种元数据:1)文件和数据块的名称空间。2)文件到数据块的映射信息。3)每个数据块备份的位置信息。这些都保存在主节点的内存中。前两种信息还保存在操作日志中,并且操作日志会保存到主节点的本地硬盘,同时还会备份到远端机器上。主节点不持久性保存数据块的位置信息,相反,在主节点启动和一个新子节点加入集群时,主节点会询问每个子节点包含的数据块信息。

15)元数据都保存在内存中,主节点会周期性在后台对这些信息进行扫描,从而可以实现数据块垃圾回收,子节点失效时进行数据块的重新备份,子节点之间的数据块移动。主节点为每个64M的数据块维护少于64字节的元数据,对于每个文件,由于使用前向压缩算法来存储文件名,因此文件名称空间数据一般也少于64字节。