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配置文件

bash 复制代码
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工具类

java 复制代码
/**
 * @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 {
        // 获取trackerServer
        TrackerServer trackerServer = getTrackerServer();
        // 获取storageClient
        StorageClient 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 {
        // 获取trackerServer
        TrackerServer trackerServer = getTrackerServer();
        // 获取storageClient
        StorageClient 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 {
        // 获取trackerServer
        TrackerServer trackerServer = getTrackerServer();
        // 获取storageClient
        StorageClient 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. 获取trackerServer
        TrackerServer 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 {
        // 获取trackerServer
        TrackerServer trackerServer = getTrackerServer();
        // 获取storageClient
        StorageClient 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();
    }


}
相关推荐
sanx184 分钟前
从零搭建体育比分网站完整步骤
java·开发语言
夏季疯5 分钟前
学习笔记:黑马程序员JavaWeb开发教程(2025.3.29)
java·笔记·学习
auspicious航16 分钟前
PostgreSQL 常用SQL操作命令
数据库·sql·postgresql
努力也学不会java20 分钟前
【HTTP】《HTTP 全原理解析:从请求到响应的奇妙之旅》
java·网络·网络协议·http
Ten peaches22 分钟前
苍穹外卖(订单状态定时处理、来单提醒和客户催单)
java·数据库·sql·springboot
caihuayuan532 分钟前
全文索引数据库Elasticsearch底层Lucene
java·大数据·vue.js·spring boot·课程设计
冼紫菜43 分钟前
Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决
java·spring boot·后端·mysql·docker·springcloud
gbase_lmax1 小时前
gbase8s数据库 tcp连接不同阶段的超时处理
网络·数据库·网络协议·tcp/ip
Aliano2171 小时前
Pinecone向量库 VS Redis
数据库·redis·缓存·pinecone向量库
爬呀爬的水滴1 小时前
02 mysql 管理(Windows版)
数据库·mysql