当前位置: 首页 > backend >正文

FastDFS,分布式文件存储系统,介绍+配置+工具类

FastDFS

什么是分布式文件存储系统

随着文件逐渐增多,单台计算机已经存储不下这么多数据,需要用多台计算机存储不同的数据或进行备份,这样就需要有一个管理系统管理不同的计算机节点,这就是分布式管理系统。

使用分布式管理系统的优点

可以存储含量数据

文件数据的高可用(冗余备份)

良好的读写性能和负载均衡

什么是fastDFS

是一款轻量级的分布式文件存储系统,可以对文件进行管理,功能包括文件存储,文件访问,文件同步等,解决了发容量存储和负载均衡的问题。

fastDFS的角色

tracker:追踪者服务器,任务是协调调用,起到负载均衡的作用。

storage:存储节点,提供文件管理的服务。

group:组,相同的组提供冗余备份,不同的组提供扩容

FastDFS上传过程

  1. Storage会定时的向Tracker发送心跳,让Tracker知道现在有什么服务可以使用
  2. 客户端向网站服务发送上传请求,网站向Tracker发送请求,Tracker检查有没有可用服务
  3. 如果有可以用服务,客户端就可以上传数据到Storage
  4. Storage将文件写入磁盘,返回路径信息给客户端
  5. 客户端可以工具这个路径找到上传文件

在这里插入图片描述

FastDFS的下载流程

  1. Storage会定时的向Tracker安装发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了
  2. 客户端发送下载请求到Tracker上,Tracker查找到存储的Storage地址后返回给客户端
  3. 客户端拿到Storage地址后,去Storage上找到文件
  4. 把文件返回给客户端

在这里插入图片描述

fastDFS配置文件

connect_timeout=60
network_timeout=60
charset=UTF-8
#Tracker的Http请求端口
http.tracker_http_port=8080
#Tracker的Http通讯端口
tracker_server=192.168.200.99:22122

fastDFS工具类

/*** @ClassName: FastDFSUtil* @Description: FastDFS工具类* @Author: CSH* @Date: 2025-05-06 15:07*/
public class FastDFSUtil {/*** @Author:CSH* @Updator:CSH* @Date 2025/5/6 15:10* @Description: 加载Tracker连接信息信息*/static {//从classpath下获取文件对象获取路径try {String path = new ClassPathResource("fdfs_client.conf").getPath();ClientGlobal.init(path);} catch (Exception e) {e.printStackTrace();}}/*** @param file* @return java.lang.String[]* @Author:CSH* @Updator:CSH* @Date 2025/5/6 15:11* @Description: 文件上传*/public static String[] upload(FastDFSFile file) throws Exception {// 获取trackerServerTrackerServer trackerServer = getTrackerServer();// 获取storageClientStorageClient storageClient = getStorageClient(trackerServer);//参数1 字节数组//参数2 扩展名(不带点)//参数3 元数据( 文件的大小,文件的作者,文件的创建时间戳)NameValuePair[] meta_list = new NameValuePair[]{new NameValuePair(file.getAuthor()), new NameValuePair(file.getName())};return storageClient.upload_file(file.getContent(), file.getExt(), meta_list);}/*** @param groupName* @param remoteFileName* @return java.io.InputStream* @Author:CSH* @Updator:CSH* @Date 2025/5/6 17:33* @Description: 文件下载*/public static InputStream downFile(String groupName, String remoteFileName) throws Exception {// 获取trackerServerTrackerServer trackerServer = getTrackerServer();// 获取storageClientStorageClient storageClient = getStorageClient(trackerServer);// 根据组名 和 文件名 下载图片byte[] bytes = storageClient.download_file(groupName, remoteFileName);return new ByteArrayInputStream(bytes);}/*** @param groupName* @param remoteFileName* @return void* @Author:CSH* @Updator:CSH* @Date 2025/5/6 17:33* @Description: 文件删除*/public static void deleteFile(String groupName, String remoteFileName) throws Exception {// 获取trackerServerTrackerServer trackerServer = getTrackerServer();// 获取storageClientStorageClient storageClient = getStorageClient(trackerServer);int i = storageClient.delete_file(groupName, remoteFileName);if (i == 0) {System.out.println("删除成功");} else {System.out.println("删除失败");}}/*** @return java.lang.String* @Author:CSH* @Updator:CSH* @Date 2025/5/6 15:26* @Description: 获取tracker的ip和端口信息*/public static String getTrackerUrl() throws IOException {// 1. 获取trackerServerTrackerServer trackerServer = getTrackerServer();// 2. 获取tracker 的ip的信息String hostString = trackerServer.getInetSocketAddress().getHostString();// 3. 获取tracker 的端口的信息int trackerHttpPort = ClientGlobal.getG_tracker_http_port();return "http://" + hostString + ":" + trackerHttpPort;}/*** @param groupName* @param remoteFileName* @return org.csource.fastdfs.FileInfo* @Author:CSH* @Updator:CSH* @Date 2025/5/6 17:28* @Description: 根据文件名和组名获取文件的信息*/public static FileInfo getFile(String groupName, String remoteFileName) throws IOException, MyException {// 获取trackerServerTrackerServer trackerServer = getTrackerServer();// 获取storageClientStorageClient storageClient = getStorageClient(trackerServer);// 根据文件名和组名获取文件的信息return storageClient.get_file_info(groupName, remoteFileName);}/*** @param groupName* @return org.csource.fastdfs.StorageServer* @Author:CSH* @Updator:CSH* @Date 2025/5/6 20:01* @Description: 获取Storages信息*/public static StorageServer getStorages(String groupName) throws Exception {TrackerClient trackerClient = new TrackerClient();TrackerServer trackerServer = trackerClient.getConnection();return trackerClient.getStoreStorage(trackerServer, groupName);}/*** @param groupName* @param remoteFileName* @return org.csource.fastdfs.ServerInfo[]* @Author:CSH* @Updator:CSH* @Date 2025/5/6 20:06* @Description: 获取Storage的ip和端口信息*/public static ServerInfo[] getServerInfo(String groupName, String remoteFileName) throws Exception {TrackerClient trackerClient = new TrackerClient();TrackerServer trackerServer = trackerClient.getConnection();return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);}private static StorageClient getStorageClient(TrackerServer trackerServer) {return new StorageClient(trackerServer, null);}private static TrackerServer getTrackerServer() throws IOException {// 创建一个tracker客户端TrackerClient trackerClient = new TrackerClient();// 通过tracker客户端获取tracker服务信息return trackerClient.getConnection();}}
http://www.xdnf.cn/news/4513.html

相关文章:

  • upload-labs靶场通关详解:第一关
  • 远程访问代理+内网穿透:火山引擎边缘网关助力自部署模型公网调用与全链路管控
  • 阿维塔汽车CAN总线数据适配技术解析与免破线数据采集实践
  • 模型中台建设全流程指南
  • [逆向工程]什么是 Process Explorer
  • 智慧系统搭建平台有哪些?2025智慧系统搭建平台推荐?智慧系统搭建平台TOP10全面解析
  • ERP源码?ERP系统是什么?能够解决什么问题?
  • 使用 Python 与 Java 实现接入 AI 大模型的 MCP 协议:原理与实战
  • 「动态规划」线性DP:股票问题合集 / LeetCode 121|122|123|188 (C++)
  • 密码学基石:哈希、对称/非对称加密与HTTPS实践详解
  • Charles 如何高效监控特定域名
  • BGP路由反射器
  • Linux 内核对 ARM 大小核架构的支持
  • B树如何用于磁盘 ,B+树为如何用于数据库
  • 源雀SCRM开源·AI企微客服|RAG知识中枢+自训练闭环
  • 汽车生产DV与PV验证
  • MongoDB培训文档大纲(超详细)
  • 基于大模型的子宫平滑肌瘤全周期预测与诊疗方案研究
  • 第4章 递推法
  • 动态规划之完全背包
  • C++ -- 哈希扩展
  • 探索智能仓颉:Cangjie Magic开发体验
  • 电子电器架构 --- 网关释放buffer的必要性
  • 紫光展锐全新奇迹手游引擎,开启游戏“芯”时代
  • 安卓工程build.gradle中的Groovy的常见知识点
  • linux_进程地址空间(虚拟地址空间)
  • 【背包dp----01背包】例题三------(标准的01背包+变种01背包1【恰好装满背包体积 产生的 最大价值】)
  • MySQL基础关键_010_数据库设计三范式
  • OC语言学习——面向对象(下)
  • 在 R 语言中,data$Age 是一种常见的语法结构