综述
背景
随着信息时代的到来,企业数据呈现爆发式增长,为了应对大数据存储问题,分布式文件系统应运而生。
架构
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会保证一次只进行一个客户端的追加操作。