分布式文件系统—Google File System介绍

为什么要文件系统?

我们知道如要要从磁盘取数据,需要告诉控制器从哪取,取多长等信息,如果这步由应用来做,那实在太麻烦。所以操作系统提供了一个中间层,它管理本地的磁盘存储资源、提供文件到存储位置的映射,并抽象出一套文件访问接口供用户使用。对用户来说只需记住文件名和路径,其他的与磁盘块打交道的事就交给这个中间层来做,这个中间层即为文件系统。

但随着互联网企业的高速发展,一些业务对数据存储的要求越来越高,而且模式各异,如购物网站的大量商品图片,其特点是文件较小,但数量巨大;而类似于youtube,优酷这样的视频服务网站,其后台存储着大量的视频文件,尺寸大多在几十M到几十G不等。这些应用场景都是传统文件系统不能解决的。分布式文件系统将数据存储在物理上分散的多个存储节点上,对这些节点的资源进行统一的管理与分配,并向用户提供文件系统访问接口,其主要解决了本地文件系统在文件大小、文件数量、打开文件数等的限制问题。

上一篇文章关于分布式系统的介绍中有提到GFS,谷歌的三篇重要论文之一。GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,提供容错功能。

GFS体系结构

图1 GFS Architecture

GFS包括一个master结点(元数据服务器),多个chunkserver(数据服务器)和多个client(运行各种应用的客户端)。在可靠性要求不高的场景,client和chunkserver可以位于一个结点。图1是GFS的体系结构示意图,每一结点都是普通的Linux服务器,GFS的工作就是协调成百上千的服务器为各种应用提供服务。

典型分布式系统架构 参考GFS设计理念,目前比较主流的一种分布式文件系统架构,如下图所示,通常包括主控服务器(或称元数据服务器、名字服务器等,通常会配置备用主控服务器以便在故障时接管服务,也可以两个都为主的模式),多个数据服务器(或称存储服务器,存储节点等),以及多个客户端,客户端可以是各种应用服务器,也可以是终端用户。

采用集中式管理方式,通过一个独立的服务器(如上图中的主控服务器)来管理数据服务器,每个服务器向其汇报服务状态来达到集中管理的目的,这种方式简单易实现,目前很多分布式文件系统都采用这种方式如GFS、TFS等。主控服务器在负载较大时会出现单点,较多的解决方案是配置备用服务器,以便在故障时接管服务,如果需要,主备之间需要进行数据的同步。

分布式文件系统的数据存储解决方案,归根结底是将将大问题划分为小问题。大量的文件,均匀分布到多个数据服务器上后,每个数据服务器存储的文件数量就少了,另外通过使用大文件存储多个小文件的方式,总能把单个数据服务器上存储的文件数降到单机能解决的规模;对于很大的文件,将大文件划分成多个相对较小的片段,存储在多个数据服务器上(目前,很多本地文件系统对超大文件的支持已经不存在问题了,如ext3文件系统使用4k块时,文件最大能到4T,ext4则能支持更大的文件,只是受限于磁盘的存储空间)。

分布式文件系统涉及的主要问题及解决方法如下图所示:

主控服务器包含:

1. 命名空间维护

  • 维护整个文件系统的命名空间,并暴露给用户使用,命名空间的结构主要有典型目录树结构、扁平化结构、图结构
  • 需要存储一些辅助的元数据如文件(块)到数据服务器的映射关系、文件之间的关系

2. 数据服务管理

  • 集中管理数据服务器,监测数据服务器存活
  • 当数据服务器不可用时,对一些副本数不足的文件(块)执行复制
  • 当数据服务器负载过高,执行一些副本迁移计划

3. 服务调度

  • 负责客户端和数据服务器的请求处理
  • 包含单线程和线程池方式,线程池的方式目前使用较多

4. 主备容灾

  • 主服务器作用非常重要,为了避免单点问题,通常会为其配置备用服务器,当备用服务器检测到主宕机时,会接管主的资源及服务
  • 主备数据需要一致,可采用etcd或zookeeper等

数据服务器包含

1. 数据本地存储

  • 数据服务器负责文件数据在本地的持久化存储
  • 对于小文件的存储,可以将多个文件的数据存储在一个块中,并为块内的文件建立索引,这样可以极大的提高存储空间利用率
  • 对于大文件的存储,则可将文件存储到多个块上,多个块所在的数据服务器可以并行服务,这种需求通常不需要对本地存储做太多优化

2. 状态维护

  • 将自己的状态以心跳包的方式周期性的报告给主控服务器
  • 心跳信息还包含当前负载情况,可以帮助主控服务器制定负载均衡策略

3. 副本管理

  • 分布式文件系统中的文件会存储多个副本到数据服务器上
  • 方式一,客户端分别向多个数据服务器写同一份数据,如DNFS采用这种方式
  • 方式二方式二,客户端向主数据服务器写数据,主数据服务器向其他数据服务器转发数据,如TFS采用这种方式
  • 方式三,采用流水复制的方式,client向某个数据服务器写数据,该数据服务器向副本链中下一个数据服务器转发数据,依次类推,如HDFS、GFS采取这种方式

客户端包含:

1. 接口

  • 用户最终通过文件系统提供的接口来存取数据
  • 需考虑接口复杂性

2. 缓存

  • 缓存元数据信息,降低主控服务器负载
  • 数据可根据业务特性缓存在本地内存或磁盘,也可缓存在远端的cache系统上
  • 维护缓存需考虑如何解决一致性问题及缓存替换算法,使用得较多的替换算法如LRU、随机替换等

3. 其他

  • 数据进行加密保证数据的安全性
  • 数据进行压缩后存储降低存储空间使用
  • 在接口中封装一些访问统计行为,以支持系统对应用的行为进行监控和统计

本文主要从典型分布式文件系统架构出发,讨论了分布式文件系统的基本原理,工程实现时需要解决的问题、以及解决问题的基本方法,真正在系统工程实现时,要考虑的问题会更多。

本文分享自微信公众号 - MYSQL轻松学(learnmysql)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券