搭建FastDFS分布式文件方式一(Docker版本)
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版本)相关推荐
- 搭建FastDFS分布式文件存储系统教程
转载来源:https://github.com/happyfish100/fastdfs/wiki 搭建FastDFS分布式文件存储系统教程 环境准备 使用的系统软件 名称 说明 centos 7.x ...
- Docker部署Fastdfs分布式文件存储系统
Docker部署Fastdfs分布式文件存储系统 Fastdfs分布式文件存储系统 拉取镜像 部署Tracker和Storage 开放端口 SpringBoot代码示例 Fastdfs分布式文件存储系 ...
- 超简单用Docker安装FastDFS分布式文件存储系统
个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. Docker安装FastDFS分布式文件存储系统 ...
- FastDfs分布式文件存储系统
FastDfs分布式文件存储系统 FastDfs 是一个开源的高性能分布式文件系统(DFS). 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡.主要解决了海量数据存储问题,特别适 ...
- 一文搞定FastDFS分布式文件系统配置与部署
Ubuntu下FastDFS分布式文件系统配置与部署 白宁超 2017年4月15日09:11:52 摘要: FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件 ...
- Linux FastDFS 分布式文件系统安装
Linux FastDFS 分布式文件系统安装 2013 年 3 月 11 日 – 09:21 | 930 views | 收藏 (No Ratings Yet) FastDFS是一款类Google ...
- FastDFS分布式文件系统配置与部署
一文搞定FastDFS分布式文件系统配置与部署 阅读目录 1 分布式文件系统介绍 2 系统架构介绍 3 FastDFS性能方案 4 Linux基本命令操作 5 安装VirtualBox虚拟机并配置Ub ...
- 基于docker搭建cephfs分布式文件
目的 在一台机器上, 利用多块硬盘, 搭建一个cephfs文件系统. 具体来说就是1个mon, 1个mds, 1个mgr, 3个osd 注意 a. 使用vmware会很方便 b. 安装过程中会遇到很多 ...
- FastDFS - 分布式文件存储系统
目录 一.分布式文件存储 1.分布式文件存储的由来 2.常见的分布式存储框架 二.FastDFS介绍 三.FastDFS安装 1.拉取镜像文件 2.构建Tracker服务 3.构建Storage服务 ...
最新文章
- 查看一个索mysql_如何查看MySQL索引
- 如何处理Dubbo调用超时
- 宝塔php gd库,宝塔面板安装 EasyImag – 一款最简单图床的安装体验
- L1-062 幸运彩票 (15 分)-PAT 团体程序设计天梯赛 GPLT
- ECSHOP集成百度ueditor编辑器上传图片到服务器或又拍云(七牛云)
- 计算机组成原理课程要求及目的,计算机组成原理-教学大纲
- android 启动界面修改工具下载,安卓开机画面更改软件
- 华三交换机配置链路聚合
- 小程序连表查询(lookup)
- 冯诺依曼体系结构及三级缓存
- php钉钉机器人,PHP调用钉钉机器人
- C++用*和空格输出一个正方形及其对角线
- 《InsideUE4》GamePlay架构学习_Level和World
- 微信公共平台OAuth接口消息接口服务中间件-wechat-oauth
- java sql 违反协议_java.sql.SQLException: 违反协议异常的一种解释
- 安卓毕业设计- 基于Android的旅游计划APP
- 计算1~50之间的素数之和
- xmd后缀名改mp3_GitHub - dh9527/xMDPlayer: 一个可以在线听网易云音乐、QQ音乐、酷狗音乐的音乐播放器,还可以让你听自己的网易云歌单哦!...
- 怎么画好一个项目甘特图(内附实用模板)
- idea:Build或Rebuild项目特别慢
热门文章
- AUTHORITY-CHECK
- 修改ALSM_EXCEL_TO_INTERNAL_TABLE的限制
- SAP SD 定价过程的16个字段的作用说明
- GMV突破1300亿,Lazada下一站去哪?
- 入栈和出栈c语言源程序,用c语言可执行文件实现顺序栈的出栈、入栈、判栈空、判栈满!急求啊? 爱问知识人...
- 为什么单击用户账户没有反应_为什么您的网站没有流量?是因为用户搜不到你!...
- ffmpeg库编译加文字_ffmpeg第三方库编译记录
- 怎样将c++的对话框自动移到指定位置_【Excel技巧】如何批量创建多个指定名称的工作表...
- python约束 与MD5加密写法
- Python教程:内置函数filter()和匿名函数lambda解析