前言

本篇文章会介绍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配置

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath />
  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<MetaData> metaDataSet = new HashSet<MetaData>();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<byte[]> 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);}

FastDFS 介绍相关推荐

  1. FastDFS介绍并在centos7中安装

    文章目录 FastDFS介绍 什么是FastDFS FastDFS安装 一.安装gcc环境libfastcommon 二.安装FastDFS 三.编辑tracker.conf: 四.修改storage ...

  2. FastDFS介绍与安装配置

    FastDFS由国人设计开发,是一个开源的轻量级分布式文件系统,采用tracker和storage完成对文件的分布式存储管理,实现对文件访问的负载均衡. 一.FastDFS介绍 FastDFS服务端有 ...

  3. FastDFS介绍及安装教程

    FastDFS 介绍 技术论坛: http://bbs.chinaunix.net/forum-240-1.html FAQ:http://bbs.chinaunix.net/thread-19204 ...

  4. 分布式文件存储FastDFS介绍安装部署及相关Java代码编写

    分布式文件存储FastDFS 一.FastDFS简介 1.1 FastDFS体系结构 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传 ...

  5. fastdfs mysql_FastDFS介绍 - KG-鲜血、汗水和眼泪 - OSCHINA - 中文开源技术交流社区

    FastDFS介绍 余庆 2009年09月13日 FastDFS简介 FastDFS是一个轻量级的开源分布式文件系统 FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均 ...

  6. 分布式文件系统(FastDFS)安装 配置

    [TOC] 百度百科: FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文 ...

  7. 第一章、FastDFS简介

    1.FastDFS介绍 FastDFS 是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线服务,如图 ...

  8. 美多商城之商品(准备商品数据 )、Dockers容器和FastDFS存储

    二.准备商品数据    [这些数据一般保存在第三方云存储服务] 提示: 数据库表有了以后,我们现在需要准备商品信息数据和商品图片数据,以便查询和展示. 商品信息数据:比如商品编号等都是字符串类型的,可 ...

  9. FastDFS+Nginx实现文件服务器(转载)

    本文转自:https://www.cnblogs.com/chiangchou/p/fastdfs.html 同时加入自己的见解与修改 目录 一.FastDFS介绍 1.简介 2.FastDFS的存储 ...

最新文章

  1. CStopwatch的C++实现
  2. 20190318-使用类做一个简单的图书馆管理系统
  3. 聚焦实战,架构升级!
  4. LeetCode 1610. 可见点的最大数目(atan2函数求夹角)
  5. 5 随窗口改变大小_C4D默认界面两个关于坐标轴的窗口有什么区别
  6. Hbase 中文参考指南 3.0 校对活动发车了~
  7. 具有预先训练模型的AI人脸识别
  8. 广工十四届校赛 count 矩阵快速幂
  9. 对unidbgrid的单元格操作
  10. 华为云服务器测试并用docker快速搭建2048网站
  11. Bluedroid 函数分析:BTA_GATTC_Open
  12. 交叉熵损失函数权重计算
  13. 衍射极限、MTF与像素大小(1)
  14. ps制作的html手机怎么使用,ps制作手机的教程
  15. 对View的onMeasure方法理解
  16. Tomcat7.0浅析
  17. linux下查看mysql线程_linux-如何查看线程在哪个CPU内核中运行?
  18. 詹妮弗洛佩兹宣布订婚,网友:这颗钻戒够大!有钱!
  19. 通俗讲义 | 深入浅出云计算、大数据、人工智能
  20. Vue 随笔1-加入vue router 后发现app被渲染了2次

热门文章

  1. 零基础Unity做一个中秋诗词鉴赏网页,提前祝您中秋快乐!(DoTween动画 | WebGL视频 | 大文件上传GitHub)
  2. SpringMVC与JSON传值,取值,使用SpringMVC实现文件的上传与下载,SpringMVC拦截器
  3. 论文阅读笔记《Anomaly Detection in Nanofibrous Materials by CNN-Based Self-Similarity》
  4. 计算机cpu的速度越来越快 这导致,计算机一级笔试模拟题(1-6)
  5. AJAX实验(添加+模糊查询 图书)
  6. 电脑系统修复之--Windows系统开机蓝屏 EFI Network 0 for IPv4(XX-XX-XX-XX-XX)boot failed.
  7. 模电1.1 半导体基础知识
  8. nslookup参数说明
  9. 物联网中常提到的M2M究竟是什么?
  10. Hibernate 中setResultTransformer使用