FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。

1、拉取 FastDFS 镜像

docker pull morunchang/fastdfs

2、启动容器

1)、运行跟踪器 Tracker

docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh

2)、运行存储节点 Storage

docker run -d --name storage --net=host -e TRACKER_IP=192.168.37.137:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh
  • 使用的网络模式是–net=host, 192.168.37.137是宿主机的IP
  • group1是组名,即storage的组
  • 如果想要增加新的storage服务器,再次运行该命令,注意更换 新组名
  • 如果想要挂载到本机目录,就在命令里面添加-v /data/fastdfs/storage:/data/fast_data

3、需要配置访问代理 Nginx

因为在 FastDFS 镜像中有自带的 Nginx 服务器,所以我们只需要进入容器配置下 Nginx 服务器即可,注意我们需要进入的是存储节点 Storage,具体的 Shell 命令如下:

docker exec -it storage  /bin/bash
vi /etc/nginx/conf/nginx.conf
// 配置一个访问规则
location ~ /M00 {root /data/fast_data/data;ngx_fastdfs_module;
}
// 在 nginx.conf 中配置禁止使用缓存
add_header Cache-Control no-store;
// 需要重新启动容器
docker restart storage

搭建好之后,存储的文件的路径大概是 http://192.168.37.137:8080/group1/M00/00/00/rBUABl-CwNuAeRPyAAFwqWytcEA860.png 这个样子,端口 8080 实际上是 Storage 中的 Nginx 服务器的监听端口,如果需要改,去修改该配置文件即可。

文末彩蛋

提供后端配置 FastDFS 的工具类和配置

1、引入 POM 依赖

<dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId><version>1.27.0.0</version>
</dependency>

2、配置文件 fdfs_client.conf

connect_timeout=60
network_timeout=60
charset=UTF-8
http.tracker_http_port=8080
tracker_server=192.168.48.132:22122

3、自定义 FastDFS 文件类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** @author qiukangming* @version 1.0* @description* @since 2020/11/23 22:18*/@Data
@AllArgsConstructor
@NoArgsConstructor
public class FastDFSFile implements Serializable {//文件名字private String name;//文件内容private byte[] content;//文件扩展名private String ext;//文件MD5摘要值private String md5;//文件创建作者private String author;
}

4、自定义 FastDFS 文件操作工具类

import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.ServerInfo;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;/*** @author qiukangming* @version 1.0* @description FastDFS服务器操作类* @since 2020/11/24 11:24*/public class FastDFSClient {/** 初始化tracker信息*/static {try {//获取tracker的配置文件fdfs_client.conf的位置String filePath = new ClassPathResource("fdfs_client.conf").getPath();//加载tracker配置信息ClientGlobal.init(filePath);} catch (Exception e) {e.printStackTrace();}}/***** 文件上传* * @param file : 要上传的文件信息封装->FastDFSFile* @return String[]*          1:文件上传所存储的组名*          2:文件存储路径*/public static String[] upload(FastDFSFile file) {//获取文件作者NameValuePair[] meta_list = new NameValuePair[1];meta_list[0] = new NameValuePair(file.getAuthor());/** 文件上传后的返回值* uploadResults[0]:文件上传所存储的组名,例如:group1* uploadResults[1]:文件存储路径,例如:M00/00/00/wKjThF0DBzaAP23MAAXz2mMp9oM26.jpeg*/String[] uploadResults = null;try {//获取StorageClient对象StorageClient storageClient = getStorageClient();//执行文件上传uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);} catch (Exception e) {e.printStackTrace();}return uploadResults;}/**** 获取文件信息* * @param groupName:组名* @param remoteFileName:文件存储完整名*/public static FileInfo getFile(String groupName, String remoteFileName) {try {//获取StorageClient对象StorageClient storageClient = getStorageClient();//获取文件信息return storageClient.get_file_info(groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}return null;}/**** 文件下载* * @param groupName:组名* @param remoteFileName:文件存储完整名* @return InputStream*/public static InputStream downFile(String groupName, String remoteFileName) {try {//获取StorageClientStorageClient storageClient = getStorageClient();//通过StorageClient下载文件byte[] fileByte = storageClient.download_file(groupName, remoteFileName);//将字节数组转换成字节输入流return new ByteArrayInputStream(fileByte);} catch (Exception e) {e.printStackTrace();}return null;}/**** 文件删除实现* * @param groupName:组名* @param remoteFileName:文件存储完整名*/public static void deleteFile(String groupName,String remoteFileName) {try {//获取StorageClientStorageClient storageClient = getStorageClient();//通过StorageClient删除文件storageClient.delete_file(groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}}/**** 获取组信息* * @param groupName :组名*/public static StorageServer getStorages(String groupName) {try {//创建TrackerClient对象TrackerClient trackerClient = new TrackerClient();//通过TrackerClient获取TrackerServer对象TrackerServer trackerServer = trackerClient.getConnection();//通过trackerClient获取Storage组信息return trackerClient.getStoreStorage(trackerServer, groupName);} catch (Exception e) {e.printStackTrace();}return null;}/**** 根据文件组名和文件存储路径获取Storage服务的IP、端口信息* * @param groupName :组名* @param remoteFileName :文件存储完整名*/public static ServerInfo[] getServerInfo(String groupName, String remoteFileName) {try {//创建TrackerClient对象TrackerClient trackerClient = new TrackerClient();//通过TrackerClient获取TrackerServer对象TrackerServer trackerServer = trackerClient.getConnection();//获取服务信息return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);} catch (Exception e) {e.printStackTrace();}return null;}/*** 获取Tracker服务地址*/public static String getTrackerUrl() {try {//创建TrackerClient对象TrackerClient trackerClient = new TrackerClient();//通过TrackerClient获取TrackerServer对象TrackerServer trackerServer = trackerClient.getConnection();//获取Tracker地址return "http://" + trackerServer.getInetSocketAddress().getHostString() + ":" + ClientGlobal.getG_tracker_http_port();} catch (IOException e) {e.printStackTrace();}return null;}/*** 获取TrackerServer*/public static TrackerServer getTrackerServer() throws Exception {//创建TrackerClient对象TrackerClient trackerClient = new TrackerClient();//通过TrackerClient获取TrackerServer对象return trackerClient.getConnection();}/*** 获取StorageClient* * @return StorageClient* @throws Exception e*/public static StorageClient getStorageClient() throws Exception {//获取TrackerServerTrackerServer trackerServer = getTrackerServer();//通过TrackerServer创建StorageClientreturn new StorageClient(trackerServer, null);}
}

5、文件上传接口

import com.qkm.common.utils.Result;
import com.qkm.common.utils.StatusCode;
import com.qkm.file.dfs.FastDFSFile;
import com.qkm.file.utils.FastDFSClient;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;/*** @author qiukangming* @version 1.0* @description* @since 2020/11/24 11:18*/
@RestController
@CrossOrigin
@RequestMapping("/file")
public class FileController {@PostMapping("/upload")public Result<Object> upload(@RequestParam("file") MultipartFile multipartFile) throws Exception {FastDFSFile fastDFSFile = new FastDFSFile(multipartFile.getOriginalFilename(),multipartFile.getBytes(), StringUtils.getFilenameExtension(multipartFile.getOriginalFilename()), null, null);//文件上传String[] uploads = FastDFSClient.upload(fastDFSFile);//组装文件上传地址String url = FastDFSClient.getTrackerUrl()+"/"+uploads[0]+"/"+ uploads[1];return new Result<>(true, StatusCode.OK, "文件上传成功", url);}}

搭建FastDFS分布式文件方式一(Docker版本)相关推荐

  1. 搭建FastDFS分布式文件存储系统教程

    转载来源:https://github.com/happyfish100/fastdfs/wiki 搭建FastDFS分布式文件存储系统教程 环境准备 使用的系统软件 名称 说明 centos 7.x ...

  2. Docker部署Fastdfs分布式文件存储系统

    Docker部署Fastdfs分布式文件存储系统 Fastdfs分布式文件存储系统 拉取镜像 部署Tracker和Storage 开放端口 SpringBoot代码示例 Fastdfs分布式文件存储系 ...

  3. 超简单用Docker安装FastDFS分布式文件存储系统

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. Docker安装FastDFS分布式文件存储系统 ...

  4. FastDfs分布式文件存储系统

    FastDfs分布式文件存储系统 FastDfs 是一个开源的高性能分布式文件系统(DFS). 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡.主要解决了海量数据存储问题,特别适 ...

  5. 一文搞定FastDFS分布式文件系统配置与部署

    Ubuntu下FastDFS分布式文件系统配置与部署 白宁超 2017年4月15日09:11:52 摘要: FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件 ...

  6. Linux FastDFS 分布式文件系统安装

    Linux FastDFS 分布式文件系统安装 2013 年 3 月 11 日 – 09:21 | 930 views | 收藏  (No Ratings Yet) FastDFS是一款类Google ...

  7. FastDFS分布式文件系统配置与部署

    一文搞定FastDFS分布式文件系统配置与部署 阅读目录 1 分布式文件系统介绍 2 系统架构介绍 3 FastDFS性能方案 4 Linux基本命令操作 5 安装VirtualBox虚拟机并配置Ub ...

  8. 基于docker搭建cephfs分布式文件

    目的 在一台机器上, 利用多块硬盘, 搭建一个cephfs文件系统. 具体来说就是1个mon, 1个mds, 1个mgr, 3个osd 注意 a. 使用vmware会很方便 b. 安装过程中会遇到很多 ...

  9. FastDFS - 分布式文件存储系统

    目录 一.分布式文件存储 1.分布式文件存储的由来 2.常见的分布式存储框架 二.FastDFS介绍 三.FastDFS安装 1.拉取镜像文件 2.构建Tracker服务 3.构建Storage服务 ...

最新文章

  1. 查看一个索mysql_如何查看MySQL索引
  2. 如何处理Dubbo调用超时
  3. 宝塔php gd库,宝塔面板安装 EasyImag – 一款最简单图床的安装体验
  4. L1-062 幸运彩票 (15 分)-PAT 团体程序设计天梯赛 GPLT
  5. ECSHOP集成百度ueditor编辑器上传图片到服务器或又拍云(七牛云)
  6. 计算机组成原理课程要求及目的,计算机组成原理-教学大纲
  7. android 启动界面修改工具下载,安卓开机画面更改软件
  8. 华三交换机配置链路聚合
  9. 小程序连表查询(lookup)
  10. 冯诺依曼体系结构及三级缓存
  11. php钉钉机器人,PHP调用钉钉机器人
  12. C++用*和空格输出一个正方形及其对角线
  13. 《InsideUE4》GamePlay架构学习_Level和World
  14. 微信公共平台OAuth接口消息接口服务中间件-wechat-oauth
  15. java sql 违反协议_java.sql.SQLException: 违反协议异常的一种解释
  16. 安卓毕业设计- 基于Android的旅游计划APP
  17. 计算1~50之间的素数之和
  18. xmd后缀名改mp3_GitHub - dh9527/xMDPlayer: 一个可以在线听网易云音乐、QQ音乐、酷狗音乐的音乐播放器,还可以让你听自己的网易云歌单哦!...
  19. 怎么画好一个项目甘特图(内附实用模板)
  20. idea:Build或Rebuild项目特别慢

热门文章

  1. AUTHORITY-CHECK
  2. 修改ALSM_EXCEL_TO_INTERNAL_TABLE的限制
  3. SAP SD 定价过程的16个字段的作用说明
  4. GMV突破1300亿,Lazada下一站去哪?
  5. 入栈和出栈c语言源程序,用c语言可执行文件实现顺序栈的出栈、入栈、判栈空、判栈满!急求啊? 爱问知识人...
  6. 为什么单击用户账户没有反应_为什么您的网站没有流量?是因为用户搜不到你!...
  7. ffmpeg库编译加文字_ffmpeg第三方库编译记录
  8. 怎样将c++的对话框自动移到指定位置_【Excel技巧】如何批量创建多个指定名称的工作表...
  9. python约束 与MD5加密写法
  10. Python教程:内置函数filter()和匿名函数lambda解析