关键词:
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储,文件同步,文件访问(文件上传下载)等,他解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务,如相册网站,视频网站等
FastDFS充分考虑了冗余备份,负载均衡,线性扩容等机制,并注重高可用,高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传,下载等服务
FastDFS架构包括Tracker server 和Storage server 客户端请求Tracker server 进行文件上传,下载,通过Tracker server调度最终由Storage server完成文件上传和下载
2.Tracker server作用
Tracker server 的作用是负载均衡和调度,通过Tracker server 在文件上传时可以根据一些策略找到Storage server 提供上传服务,可以将tracker称为追踪服务器或调度服务器
3.Storage server作用
客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将Storage server称为存储服务器
4.服务端两个角色
1.Tracker :管理集群,tracker也可以实现集群。每个tracker节点的地位平等。负责收集Storage集群的状态
2.Storage:保存文件,Storage分为多个分组,每组之间保存的文件是不同的,每个组内部可以有多个成员,成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念
上传流程图
客户端上传文件后存储服务器将文件Id返回给客户端,此文件Id用于以后访问改文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录级文件名
例:
group1/M00/00/32/wKgCS114sHiAT4pGAAdRFLGbXaw.d52ca2
group1(组名):文件上传后所在的storage组名称,在文件上传成功后由storage服务器返回,需要客户端自行保存
M00(虚拟磁盘路径)
00/32(数据两级目录):storage服务在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件
wKgCS114sHiAT4pGAAdRFLGbXaw.d52ca2(文件名):与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址,文件创建时间戳,文件大小,随机数据和文件拓展名等信息
例:
group1/M00/00/32/wKgCS114sHiAT4pGAAdRFLGbXaw.d52ca2
通过tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问
存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位
例:
前台:
this.axios( method:‘GET‘, url:"/upload/upload/downloadFile", headers:this.headers, params: id:id, ,responseType: ‘blob‘ ).then(data=> if (!data) this.$message.warning("文件下载失败") return if (typeof window.navigator.msSaveBlob !== ‘undefined‘) window.navigator.msSaveBlob(new Blob([data]),fileName) else let url = window.URL.createObjectURL(new Blob([data])) let link = document.createElement(‘a‘) link.style.display = ‘none‘ link.href = url link.setAttribute(‘download‘,fileName) document.body.appendChild(link) link.click() document.body.removeChild(link); //下载完成移除元素 window.URL.revokeObjectURL(url); //释放掉blob对象 )
后台:
//通过id获得图片 Upload a = getById(id); //获得文件服务器连接 FastFileStorageClient storageClient = getStorageClient(); //下载文件 byte[] bytes = storageClient.downloadFile(a.getFileGroup(), a.getFilePath()); //设置文件类型和字符编码 response.setContentType("application/octet-stream;charset=UTF-8"); //设置返回的头部信息 response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(a.getFileName()+a.getFileType(), "UTF-8")))); response.addHeader("Content-Length", "" + bytes.length); //获得输出流 OutputStream outputStream = response.getOutputStream(); //将数组写出 outputStream.write(bytes); //冲刷缓冲区 outputStream.flush(); //关闭流 outputStream.close();
//获得文件服务器地址 public FastFileStorageClient getStorageClient() //初始化连接池 FdfsConnectionPool pool = new FdfsConnectionPool(); // 设置tracker List<String> trackers = Arrays.asList("文件服务器ip地址:端口", "文件服务器IP地址:端口"); TrackerConnectionManager tcm = new TrackerConnectionManager(pool, trackers); TrackerClient trackerClient = new DefaultTrackerClient(tcm); // 得到storage客户端 ConnectionManager cm = new ConnectionManager(pool); FastFileStorageClient storageClient = new DefaultFastFileStorageClient(trackerClient, cm); return storageClient;
下载图片转为base64码发送到前台
//获得文件服务链接 FastFileStorageClient sClient = getStorageClient(); //获得文件数组 byte[] bytes = sClient.downloadFile(a.getFileGroup(), a.getFilePath()); BASE64Encoder npBase64Encoder = new BASE64Encoder(); String s=npBase64Encoder.encode(bytes);
前台显示
<img width="40" height="30" src="data:image/jpeg;base64,/9j/4QMZRXhp" />
SpringBoot整合FastDFS
1.引入协议
<dependency> <groupId>com.luhuiguo</groupId> <artifactId>fastdfs-client</artifactId> <version>0.4.0</version> </dependency>
2.获得文件服务器地址
public FastFileStorageClient getStorageClient() //初始化连接池 FdfsConnectionPool pool = new FdfsConnectionPool(); // 设置tracker List<String> trackers = Arrays.asList("192.168.2.77:55122", "192.168.2.78:55122"); TrackerConnectionManager tcm = new TrackerConnectionManager(pool, trackers); TrackerClient trackerClient = new DefaultTrackerClient(tcm); // 得到storage客户端 ConnectionManager cm = new ConnectionManager(pool); FastFileStorageClient storageClient = new DefaultFastFileStorageClient(trackerClient, cm); return storageClient;
3.下载文件
//获得文件服务器 FastFileStorageClient sclient = getStorageClient(); //获得文件名加后缀 String fileName = file.getOriginalFilename(); //得到文件类型 String type = fileName.substring(fileName.indexOf(".")+1); //得到文件名称 String name = fileName.substring(0, fileName.indexOf(".")); //将文件发送到服务器 StorePath storePath = sclient.uploadFile(file.getBytes(), type); String group = storePath.getGroup(); String path = storePath.getPath(); //1.通过group和payh下载文件 byte[] bytes = sClient.downloadFile(group ,path ); 或 //2.通过文件路径访问 String url =文件服务器地址 + "/" + group + "/" + path;
fastdfs(代码片段)
分布式图片服务器FastDFS什么是FastDFS FastDFS使用c编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗(rong余备份,负载均衡,线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套... 查看详情
fastdfs(代码片段)
FastDFSjava上传下载配置文件dfs.properties##fastdfs-clientfastdfs.connect_timeout_in_seconds=5fastdfs.network_timeout_in_seconds=30fastdfs.charset=UTF-8fastdfs.http_anti_steal_token=truefastdfs.http_secret_key 查看详情
fastdfs(代码片段)
一、简介#FastDFS是一个轻量级的开源分布式文件系统#FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡#FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储#支持存储服务器在线扩容#支... 查看详情
fastdfs基于group扩容(代码片段)
#新建pathmkdir/home/fastdfs1#storage.conf配置修改vim/etc/fdfs/storage.conf配置mod_fastdfs.confvim/etc/fdfs/mod_fastdfs.conf 查看详情
fastdfs专有术语(代码片段)
FastDFS专有术语本篇文章转载于FastDFS作者余庆大佬的FastDFS分享与交流公众号。1.trackerserver中心服务器,FastDFSserver端两大主角之一。trackerserver作为FastDFS集群管理中心,管理集群拓扑结构,对storageserver文件上传和文件... 查看详情
docker安装fastdfs(代码片段)
什么是FastDFS?FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提... 查看详情
fastdfs架构分析(代码片段)
本系列文章将使用FastDFS框架来搭建一个基于分布式文件系统的网络云盘 1.FastDFS架构分析FastDFS是由国人余庆所开发,其项目地址是:https://github.com/happyfish100FastDFS主要功能包括:文件存储,同步和访问,设计... 查看详情
fastdfs运维友好那些事儿(代码片段)
FastDFS运维友好那些事儿本篇文章转载于FastDFS作者余庆大佬的FastDFS分享与交流公众号。FastDFS运维友好那些事儿(一)FastDFS运维友好那些事儿(二)最近有人在FastDFSQQ技术交流群里爆料,说网上有人吐槽FastDFS... 查看详情
fastdfs的三大误解(代码片段)
FastDFS的三大误解本篇文章转载于FastDFS作者余庆大佬的FastDFS分享与交流公众号。整理个别同学对FastDFS的三个误解,我将逐一澄清。误解一、FastDFS不易安装和配置网上有人吐槽说FastDFS是他见过最难安装和配置的一款开源软件... 查看详情
fastdfs(代码片段)
简介FastDFS是一个高性能的分布式文件系统。功能文件存储、文件同步、文件访问(文件上传、文件下载)。目标大容量存储和负载均衡的问题。依赖<dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-jav... 查看详情
fastdfs安全注意事项(代码片段)
FastDFS安全注意事项本篇文章转载于FastDFS作者余庆大佬的FastDFS分享与交流公众号。对于互联网应用,FastDFS的标准使用姿势:通过FastDFSAPI进行文件上传等更新操作,storageserver上通过FastDFSnginx扩展模块使用HTTP方式下载... 查看详情
springboot集成fastdfs(代码片段)
官方文档:https://github.com/happyfish100/fastdfs-client-java一、首先,maven工程添加依赖<!--fastdfs--><dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifa 查看详情
fastdfs依赖无法导入(代码片段)
fastdfs-client-java导入爆红<!--FastDFS--><dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifactId><version>1.29-SNAPSHOT</version& 查看详情
fastdfs安装使用(代码片段)
...器,有的可能选择搭建ftp+nginx做简单图片处理,或者搭建FastDFS+nginx来存储和管理图片。这篇博客主要讲解下如何在云服务器上搭建FastDFS和springboot如何整合FastDFS客户端上传图片。正文:一、FastDFS的介绍1.1什么是Fas 查看详情
fastdfs集群搭建(代码片段)
所需软件包https://github.com/happyfish100/libfastcommonhttps://github.com/happyfish100/fastdfshttps://github.com/happyfish100/fastdfs-nginx-modulehttps://nginx.org/en/yuminstall-ylibeventgccpcre-develzlib- 查看详情
fastdfs集群部署(代码片段)
FastDFS集群部署官网https://github.com/happyfish100FastDFS是一款开源的高性能分布式文件系统(DFS)。主要功能:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围... 查看详情
安装部署fastdfs(代码片段)
环境准备使用的系统软件名称说明centos7.xlibfatscommonFastDFS分离出的一些公用函数包FastDFSFastDFS本体fastdfs-nginx-moduleFastDFS和nginx的关联模块nginxnginx1.15.4编译环境yuminstallgitgccgcc-c++makeautomakeautoconflibtoolpcrepcre-develzlibzli 查看详情
docker搭建fastdfs文件系统(代码片段)
1、检索和拉取fastDFS镜像#检索fastdfsdockersearchfastdfs#拉取fastdfsdockerpulldelron/fastdfs2、使用docker镜像构建tracker容器跟踪服务器,起到调度的作用#创建tracker挂载文件目录mkdir-p/usr/local/fdfs/tracker#创建fastdfs跟踪服务器trackerdockerrun- 查看详情