综述

背景

随着信息时代的到来,企业数据呈现爆发式增长,为了应对大数据存储问题,分布式文件系统应运而生。

架构

nameserver

nameserver存储文件位置等元信息,由一个master和多个slave组成。只有master对外提供服务,slave的作用是灾难冗余,快速恢复。

文件存储元信息

文件存储的位置等信息被存储在nameserver的内存中,以B-树形式存储。一个目录下的文件和目录以数组形式存储,并以二分查找查询,这在内存使用率和查询速度中找到了一个平衡。

文件树镜像

nameserver会定时生成文件树镜像(缺省情况下在每日凌晨两点),如果nameserver为单机模式,则生成镜像采用写时复制技术,如果nameserver为集群,则生成镜像的任务就交给slave,slave再把生成好的镜像传输给master,这期间不会影响master的性能。通常故障恢复只需最新的镜像文件,但为了应付灾难时的故障情况,通常会保存多个镜像文件。

storageserver

storageserver对外以集群形式提供存储服务,文件被切分成固定大小的块,以多副本方式存储,缺省情况下,每块64m,3副本。

客户端读取文件流程

客户端首先会请求nameserver获取文件位置等元信息,之后会以tcp协议链接storageserver读取文件。

客户端写文件流程

客户端先请求nameserver,由nameserver来负载均衡决定存储的storageserver。客户端先把一个块传给s1,s1再把文件传给s2。由storageserver来传输副本可以避免在某个storageserver不可用时客户端沟通nameserver,有storageserver来沟通nameserver决定存储的服务器。

小文件存储

对于小于一个块的小文件存储,如果把一个小文件称为一个块的话,会导致storageserver检索负担过重。所以采用小文件拼接成一个块的方式存储,nameserver存储块的位置信息和文件的偏移量范围。

单台服务负载过高

有时会出现多个客户端请求一个storageserver导致网络负载过高的情况,这事客户端会转而请求副本server获取数据。

api

并非严格按照posix标准提供服务,而是提供简单的api,创建、删除、打开、关闭、写入和读取。

机架感知

在写入数据时,nameserver会根据不同机架进行负载均衡,保证副本尽可能存在不同的机架。在副本传输时,会先传输一个机架的server,一个机架传输完成后,才会传输到另一个机架,保证传输的效率。

原子的文件追加操作

在多个客户端向一个文件追加数据时,server会保证一次只进行一个客户端的追加操作。


最后修改 June 7, 2021: Add 综述文档 (6b62253)