FastDFS 介绍
创始人
2024-06-02 09:21:33
0

前言

本篇文章会介绍FastDFS是什么,具有什么功能;FastDFS服务端有的角色,来实现这些功能;当然也涉及到集群,以及 负载均衡;使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。作为文件存储的中间件 ,我们怎么去使用它。

简介

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。

存储节点存储文件,完成文件管理的所有功能:

就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。

跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。

存储节点(服务器)采用了分卷(或分组)的组织方式

为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。

当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

web项目架构

架构

tracker Server:

- 主节点,跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。

- 记录storage server的状态,是连接Client和Storage server的枢纽。

- FastDFS集群中的Tracker server可以有多台,Trackerserver之间是相互平等关系同时提供服务

- Trackerserver不存在单点故障。客户端请求Trackerserver采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

Storage Server:

- 存储服务器,文件和meta data都保存到存储服务器上

- storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。

- 一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系

- 不同组的Storageserver之间不会相互通信,同组内的Storageserver之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。

- 一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。

- Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

group:组,也称为卷。同组内服务器上的文件是完全相同的

文件标识:包括两部分:组名和文件名(包含路径)

meta data:文件相关属性,键值对(Key Value Pair)方式,如:width=1024,heigth=768

上传流程

- client询问tracker上传到的storage,不需要附加参数;

- tracker返回一台可用的storage;

- client直接和storage通讯完成文件上传

内部机制如下:

  1. 选择tracker server:

当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。

选择存储的group

当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:

- 1、Round robin,所有的group间轮询

- 2、Specified group,指定某一个确定的group

- 3、Load balance,剩余存储空间多多group优先

  1. 选择storage server

当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:

- 1、Round robin,在group内的所有storage间轮询

- 2、First server ordered by ip,按ip排序

- 3、First server ordered by priority,按优先级排序(优先级在storage上配置)

  1. 选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:

- 1、Round robin,多个存储目录间轮询

- 2、剩余存储空间最多的优先

  1. 生成Fileid

选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。

选择两级目录

当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。

  1. 生成文件名

当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

下载流程

- client询问tracker下载文件的storage,参数为文件标识(组名和文件名);

- tracker返回一台可用的storage;

- client直接和storage通讯完成文件下载。

binlog

每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。

FastDFS和其他文件存储的简单对比

指标

FastDFS

NFS

集中存储设备

线性扩容性

文件高并发访问性能

一般

文件访问方式

专有API

POSIX

支持POSIX

硬件成本

较低

中等

相同内容文件只保存一份

支持

不支持

不支持

指标

FastDFS

mogileFS*

系统简洁性

简洁 只有两个角色:tracker和storage

一般 有三个角色:tracker、storage和存储文件信息的mysql db

系统性能

很高(没有使用数据库,文件同步直接点对点,不经过tracker中转)

高(使用mysql来存储文件索引等信息,文件同步通过tracker调度和中转)

系统稳定性

高(C语言开发,可以支持高并发和高负载)

一般(Perl语言开发,高并发和高负载支持一般)

软RAID方式

分组(组内冗余),灵活性较大

动态冗余,灵活性一般

通信协议

专有协议 下载文件支持HTTP

HTTP

技术文档

较详细

较少

文件附加属性(meta data)

支持

不支持

相同内容文件只保存一份

支持

不支持

下载文件时支持文件偏移量

支持

不支持

使用方式

GitHub - tobato/FastDFS_Client: Java Client for FastDFS

maven配置

org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
  1. 将Fdfs配置引入项目

在Maven当中配置依赖以后,SpringBoot项目将会自动导入FastDFS依赖(感谢@Lzgabel)。

/*** 导入FastDFS-Client组件* * @author tobato**/
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class ComponetImport {// 导入依赖组件
}

只需要一行注解 @Import(FdfsClientConfig.class)就可以拥有带有连接池的FastDFS Java客户端了。

  1. 在application.yml当中配置Fdfs相关参数

# ===================================================================
# 分布式文件系统FDFS配置
# ===================================================================
fdfs:so-timeout: 1501connect-timeout: 601 thumb-image:             #缩略图生成参数width: 150height: 150tracker-list:            #TrackerList参数,支持多个- 192.168.1.105:22122- 192.168.1.106:22122 

3.连接池的管理参数

应用启动后拥有两个连接池管理对象:

  • Tracker连接池(TrackerConnectionManager)

  • Storage连接池(FdfsConnectionManager)

必要的时候可以注入这两个对象,跟踪打印并分析连接池的情况

两个连接池的参数配置一致,可参考 ConnectionPoolConfig 与 apache.pool2 进行优化配置,默认配置为

fdfs:..其他配置信息..pool:#从池中借出的对象的最大数目(配置为-1表示不限制)max-total: -1#获取连接时的最大等待毫秒数(默认配置为5秒)max-wait-millis: 5*1000#每个key最大连接数max-total-per-key: 50#每个key对应的连接池最大空闲连接数max-idle-per-key: 10#每个key对应的连接池最小空闲连接数min-idle-per-key: 5

4. 使用接口服务对Fdfs服务端进行操作

主要接口包括

  1. TrackerClient - TrackerServer接口

  1. GenerateStorageClient - 一般文件存储接口 (StorageServer接口)

  1. FastFileStorageClient - 为方便项目开发集成的简单接口(StorageServer接口)

  1. AppendFileStorageClient - 支持文件续传操作的接口 (StorageServer接口)

上传文件

 // 元数据Set metaDataSet = new HashSet();metaDataSet.add(new MetaData("Author", "yimingge"));metaDataSet.add(new MetaData("CreateDate", "2016-01-05"));try {StorePath uploadFile = null;uploadFile = fc.uploadFile(filename.getInputStream(), filename.getSize(), getFileExtName(filename.getOriginalFilename()), metaDataSet);account.setPassword(password);account.setLocation(uploadFile.getPath());} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}

获取文件后缀

private String getFileExtName(String name) {// TODO Auto-generated method stubreturn (name.substring(name.lastIndexOf(".")+1));}

下载文件

在java中使用

@RequestMapping("/down")@ResponseBodypublic ResponseEntity down(HttpServletResponse resp) {DownloadByteArray cb = new DownloadByteArray();HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setContentDispositionFormData("attachment", "aaa.xx");byte[] bs = fc.downloadFile("group1", "M00/00/00/wKiWDV0vAb-AcOaYABf1Yhcsfws9181.xx", cb);return new ResponseEntity<>(bs,headers,HttpStatus.OK);}

相关内容

热门资讯

初一作文《假期见闻》(优选6... 初一作文《假期见闻》 篇一我的假期过得非常充实和有意义。在假期中,我参加了一次有趣的亲子旅行,还参加...
八年级作文(精彩6篇) 八年级作文 篇一:我的暑假计划暑假即将来临,我对这个假期充满了期待。我计划度过一个充实而有意义的暑假...
2017年春运火车票购票时间... 2017年春运火车票购票时间表 篇一春运是中国人民一年中最繁忙的出行季节之一,而购票则是春运期间备受...
初中作文题材万能素材积累【优... 初中作文题材万能素材积累 篇一标题:如何保护环境随着工业化和城市化的快速发展,环境问题越来越受到人们...
春天来了初一作文【推荐5篇】 春天来了初一作文 篇一春天来了,大地万物开始苏醒。初一的阳光明媚,温暖的春风轻拂着我们的脸庞,带给我...
老班长作文(优选6篇) 老班长作文 篇一回忆起初中时代,我心中最深刻的一个人就是我们班级的老班长。他是一个身材高大、目光炯炯...
原来我没懂【经典3篇】 原来我没懂 篇一在人生的旅途中,我们常常会因为一些事情或者一些人而感到困惑,迷失方向。不过,当我们经...
初中什么的我600字作文(经... 初中什么的我600字作文 篇一初中生活中的快乐与收获初中生活是人生中一个重要的阶段,对于每个学生来说...
原来这就是爱初一作文(实用6... 原来这就是爱初一作文 篇一我曾经以为爱是一种感觉,是一种浪漫的情怀。然而,随着我渐渐长大,我明白了爱...
孝在我心中初中作文600字(... 孝在我心中初中作文600字 篇一孝在我心中孝,在我心中是一种美德,是一种传统的美德。孝顺父母是我们中...
《怎么快乐》作文【优秀6篇】 《怎么快乐》作文 篇一怎么快乐快乐是一种心态,一种积极向上的情绪状态。每个人对快乐的定义可能不尽相同...
二十年后的我初中作文(实用6... 二十年后的我初中作文 篇一初中时的我,总是充满着梦想和希望。我记得那时的我喜欢画画,梦想成为一名优秀...
夏日情缘初中作文(最新5篇) 夏日情缘初中作文 篇一夏日的阳光炙热,热得令人汗流浃背。然而,在这个炎热的夏季,我经历了一段令人难忘...
不再迷茫初中作文(精彩6篇) 不再迷茫初中作文 篇一初中生活是人生中一个重要的阶段,对于很多同学来说,初中生活充满了挑战和困惑。然...
初中毕业作文(推荐6篇) 初中毕业作文 篇一我的初中生活初中生活即将结束,回首这三年的时光,我不禁感慨万分。这段时间,我经历了...
初中新生活【优选6篇】 初中新生活 篇一初中新生活带给我许多新鲜感受和挑战。从进入初中的第一天起,我就感受到了与小学完全不同...
我的初一生活作文800字(优... 我的初一生活作文800字 篇一初一生活,是我人生中的一段重要时光。刚升入初中的我,面对新环境和新生活...
我的烦恼作文800字初一【精... 我的烦恼作文800字初一 篇一我对自己的学习成绩感到很烦恼。尽管我努力学习,但总是无法取得理想的成绩...
残缺也美丽初中作文【精简5篇... 残缺也美丽初中作文 篇一残缺也美丽人生如同一场旅行,每个人都扮演着不同的角色,经历着不同的风景。有时...
我的眼里只有你优秀作文(经典... 我的眼里只有你优秀作文 篇一在我的眼里,只有你是最优秀的。你是我最敬爱的人,也是我最佩服的人。无论是...