zoukankan      html  css  js  c++  java
  • gfs分布式文件系统

    1、介绍

        gfs是构建在廉价服务器之上的大型分布式文件系统。

    设计原则:

    • gfs组件失效是常态事件,而不是意外事件。gfs构建在普通商业PC之上,这些PC的稳定性并没有很高的保障,任何时间都可能发生组件无法工作。
    • gfs文件系统中存储的文件大部分是数GB的大文件。
    • 绝大部分文件的修改是在文件末尾追加数据,而不是覆盖原有数据的方式。文件随机写入在实际中几乎不存在。一旦写完之后,对文件的操作就只有读,而且通常是顺序读。

    2、整体架构

        gfs文件系统的整体架构如图所示:

    gfs文件系统一共包含四个部分:

    • gfs主控服务器(master)
    • chunk server
    • gfs客户端

    (2.1)主控服务器(master)

        gfs的主控服务器是一个主从结构。有点是整个存储系统存在一个全局的主控节点,管理相对简单。缺点是很多的服务请求都需要经过主控服务器,所以很容易成为整个系统的瓶颈。

         master的作用包括以下几个方面:

        i、维护系统中的元数据:命名空间(文件及chunk命名空间)、文件到chunk的映射关系、chunk的存储位置信息。其中前两种需要持久化存储到磁盘,第三种可以通过chunkserver汇报获取(master服务器只需要不到64个字节的元数据就能够管理一个64M的chunk)

        ii、负载均衡:包括chunk的创建、复制以及负载均衡

            其中chunk的创建会根据以下因素来选择chunk副本的存放位置:

           1)新副本所在的chunkserver的磁盘利用率低于平均水平;

           2)限制每个chunkserver最近创建的数量。因为创建chunk往往意味着后续有大量的写入操作。

           3)为了提高系统的可用性,gfs会尽量将同一个chunk的不通副本放在不同的机架上

        iii、垃圾回收:gfd采用延时回收策略。当要删除文件时,gfs只是在元数据中将文件改为一个隐藏的名字,并且包含一个删除时间。master定期检查,如果发现文件删除超过一定时间,就会从内存中将元数据删除。在chunkserver通过心跳汇报chunk信息时,master会回复master元数据中已经不存在的的chunk信息,然后chunkserver会释放这些chunk副本。

        iv、快照(可以瞬间完成,几乎不会对正在进行其它操作造成任何干扰)

            写时复制生成快照。步骤如下:

            1)通过租约机制收回对文件的每个chunk的写操作权限(master把这个操作以日志的方式记录到硬盘上),停止对文件的写操作

            2)master拷贝文件名等元数据生成一个新的快照文件

            3)对执行快照的文件的所有chunk增加引用计数

            在快照操作之后,客户端向快照中涉及到的chunk写数据步骤:

            1)询问master当前持有租约者

             2)master发现当前chunk的引用大于1,通知chunkserver复制该chunk,客户端的所有追加操作转向新复制出来的chunk

    (2.2)chunkserver

            gfs中文件都是以固定大小(64M)来存储的,每一个chunk通过全局唯一的64位chunk handle来标识。默认情况下,每个chunk会存储3份。

    3、关键问题

         3.1、chunk size

          对于gfs系统来说,chunk size 的默认大小是64M,比一般系统的block(4K?)要大

          优点:

    • 可以减少GFS client和GFS master的交互次数,chunk size比较大的时候,多次读可能是一块chunk的数据,这样,可以减少GFS client向GFS master请求chunk位置信息的请求次数。
    • 对于同一个chunk,GFS client可以和GFS chunkserver之间保持持久连接,提升读的性能
    • chunk size越大,chunk的metadata的总大小就越小,使得chunk相关的metadata可以存储在GFS master的内存中

          缺点:

    • chunk size越大时,可能对部分文件来讲只有1个chunk,那么这个时候对该文件的读写就会落到一个GFS chunkserver上,成为热点       

    对于热点问题,google给出的解决方案是应用层避免高频地同时读写同一个chunk。还提出了一个可能的解决方案是,GFS client找其他的GFS client来读数据

        3.2、租约机制

            gfs系统采用单一master节点设计,如果所有读写操作都通过master,那么master将成为系统瓶颈。因此在gfs中,master通过租约机制将chunk的写权限交给chunkserver。拥有写权限的chunkserver为主chunkserver,其他为备份。租约针对单个chunk。租约时长为60秒,且在租约结束后如果不出问题,master尽量将租约付给原持有租约的chunkserver。

        3.3、一致性:gfs保证至少追加成功一次

            1)出现异常:客户端会重新请求追加,因此可能出现记录在某些副本中被追加了多次,即重复记录;也可能出现一些可识别的填充记录。

            2)gfs客户端支持并发追加。多个客户端之间的顺序无法保证,同一客户端连续追加成功的多个记录也可能被打断

        3.4、容错机制

            1)master容错机制:

              i、操作日志和checkpoint。master服务器的所有操作日志和checkpoint文件都被复制到多台机器上。

             ii、“影子”master服务器,非master的镜像,它们比主服务器的更新要慢,通常不到1秒

            iii、持久化命名空间和文件到chunk映射的元数据

            2)chunserver容错机制

              i、存储多个chunk副本

             ii、对存储数据进行checksum。gfs的每个chunk都分成一定大小的block,每个block都有对应的checksum。当读取一个chunk副本时,chunkserver会将读取的数据和校验和进行比较。如果比匹配,则返回客户端错误,并报告master服务器。客户端收到错误后会请求其它副本读取数据。同时master服务器也会从其它副本克隆数据进行恢复。当一个新副本就绪后,master服务器通知副本错误的chunkserver删除错误的副本

        3.5、追加流程

           gfs系统的追加流程特点是流水线和分离数据流和控制流。流水线操作减少延时。分离数据流和控制流可以优化数据传输(数据流可以通过精心安排的数据传输线路进行传输,每次都传到距离最近的一个chunkserver)。

           

       3.6、过期失效的副本检测

         当 Chunk 服务器失效时, Chunk 的副本有可能因错失了一些修改操作而过期失效。 Master 节点保存了每个 Chunk 的版本号,用来区分当前的副本和过期副本。   

         无论何时,只要 Master 节点和 Chunk 签订一个新的租约,它就增加 Chunk 的版本号,然后通知最新的副本

  • 相关阅读:
    J2ME游戏开发之层:动画
    HTTPClient
    Objectc 类的定义
    python占位符介绍及操作方法
    selenium IE浏览器运行很慢解决方法
    python eval()用法
    使用MySQL执行update时报错:You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences
    python之字符串格式化(format)
    Python问题:UnboundLocalError: local variable 'xxx' referenced before assignment
    JS滚动页面操作
  • 原文地址:https://www.cnblogs.com/sobk/p/14058926.html
Copyright © 2011-2022 走看看