五分钟了解什么是Google文件系统(GFS)? - Go语言中文社区

五分钟了解什么是Google文件系统(GFS)?


简介

Google文件系统是构建在廉价服务器之上的大型分布式文件系统。它将服务器故障视为正常现象,通过软件的方式自动容错,在保证系统可靠性和可用性的同时,大大降低系统的成本

系统架构

在这里插入图片描述
GFS系统的节点可以分为三种角色

  • GFS Master(主控服务器)
  • GFS ChunkServer(CS,数据块服务器)
  • GFS客户端

GFS文件被分为固定大小的数据块(chunk),由主控服务器在创建时分配一个64位全局唯一的chunk句柄。CS以普通的Linux文件的形式将chunk存储在磁盘中。为了保证可靠性,chunk在不同的机器中复制多份,默认为三份

主控服务器维护了系统的元数据,包括文件以及chunk命名空间、文件到chunk之间的映射、chunk位置信息。它也负责整个系统的全局控制,如chunk租约管理、垃圾回收无用chunk、chunk的复制等。主控服务器会定期与CS通过心跳的方式交换信息

客户端是GFS提供给应用程序的访问接口,它是一组专用接口,不遵循POSIX规范,以库文件的形式提供。客户端访问GFS时,首先访问主控服务器节点,获取与之进行交互的CS信息,然后直接访问CS,完成数据的存取工作。

特别的是,GFS中的客户端不缓存文件数据,只缓存主控服务器中获取的元数据,这是由GFS的应用特点决定的。GFS最主要的应用有两个:MapReduce与Bigtable。对于Mapreduce,GFS客户端使用方式为顺序读写,没有缓存文件数据的必要;而Bigtable作为分布式表格系统,内部实现了一套缓存机制

租约机制

GFS数据追加以记录为单位,每个记录的大小为几十KB到MB不等,如果每次记录追加需要请求Master,那么Master就会成为系统的性能瓶颈,因此,GFS系统中通过租约机制将chunk写操作授权给ChunkServer。

拥有租约授权的ChunkServer称为主ChunkServer,其他副本所在的ChunkServer为备ChunkServer。

一致性模型

GFS主要是为了追加而不是改写而设计的

追加流程

在这里插入图片描述

  1. 客户端向Master请求chunk每个副本所在的ChunkServer,其中ChunkServer持有修改租约。如果没有ChunkServer持有租约,那么Master会发起一个任务,将租约授权给一台ChunkServer
  2. Master返回客户端主副本和各副本所在的ChunkServer的位置信息,客户端将缓存这些信息供以后使用
  3. 客户端将要追加的记录发送到每一个副本。GFS中采用数据流和控制流分离的方法,从而能够基于网络拓扑结构很好地调度数据流的传输
  4. 当所有副本都确认收到了数据,客户端发起一个写请求控制命令给主副本
  5. 主副本把写请求提交给所有的备副本
  6. 各备副本成功完成后应答主副本
  7. 主副本应答客户端,如果有副本发生错误,将出现主副本写成功但某些备副本不成功的情况,客户端将重试

容错机制

  1. Master容错
    • 通过操作日志加checkpoint的方式进行,并且有一台称为”Shadow Master“的实时设备
    • Master上保存三种元数据信息:
      1. 命令空间:整个文件系统的目录结构以及chunk基本信息
      2. 文件到chunk之间的映射
      3. chunk副本的位置信息,每个chunk通常有三个副本
    • GFS Master的修改操作总是新纪录操作日志,然后修改内存
    • Master需要持久化前两种元数据,即命令空间及文件到chunk之间的映射,对于第三种元数据,ChunkServer维护了这些信息,即使Master发生故障,也可以在重启时通过ChunkServer汇报来获取
  2. ChunkServer容错
    • GFS采用复制多个副本的方式实现ChunkServer的容错
    • ChunkServer会对存储的数据维持校验和

Master设计

Master内存占用

GFS系统中每个chunk大小为64MB,默认存储3份,每个chunk的元数据小于64字节,那么1PB数据的chunk元信息大小不超过1PB×3/64MB*64=3GB

负载均衡

系统中需要创建chunk副本的情况有三种:

  • chunk创建
    • 当Master创建一个chunk,它会根据如下因素选择chunk副本的起始位置:
      1. 新副本所在的ChunkServer的磁盘利用率低于平均水平
      2. 限制每个ChunkServer最近创建的数量
      3. 每个chunk的所有副本不能在同一个机架
  • chunk复制
    • 当chunk的副本数量小于一定的数量后,Master会尝试重新复制一个chunk副本
    • 其他原因包括ChunkServer宕机或者ChunkServer报告自己的副本损坏,或者ChunkServer的某个磁盘故障,或者用户动态增加了chunk的副本数等等
    • chunk复制任务都有一个优先级,按照优先级从高到低在Master排队等待执行
  • 负载均衡
    • Master会定期扫描当前副本的分布情况,如果发现磁盘使用量或者机器负载不均衡,将执行重新负载均衡操作

垃圾回收

GFS采用延迟删除的机制,当删除文件后,GFS并不要求立即归还可用的物理存储,而是在元数据中将文件名改为一个隐藏的名字,并且包含一个删除时间戳

快照

快照操作是对源文件/目录进行一个快照操作,生成该时刻源文件/目录的一个瞬间状态存放于目标文件/目录中。

GFS中使用写时复制生成快照,快照只是增加chunk中的引用计数,表示这个chunk被快照文件引用了,等到客户端修改这个chunk时,才需要在ChunkServer中拷贝chunk的数据生成新的chunk,后续的操作落到新生成的chunk上

ChunkServer设计

ChunkServer是一个磁盘和网络IO密集型应用

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/westbrookliu/article/details/82756142
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢