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();
    }


}
相关推荐
Hello.Reader2 小时前
从零到一上手 Protocol Buffers用 C# 打造可演进的通讯录
java·linux·c#
小熊h2 小时前
redis 集群——redis cluster(去中心化)
redis·去中心化
树码小子2 小时前
Java网络初识(4):网络数据通信的基本流程 -- 封装
java·网络
稻草人想看远方2 小时前
GC垃圾回收
java·开发语言·jvm
蒋士峰DBA修行之路2 小时前
实验九 合理定义分布列实现性能优化-分布式聚集
分布式
en-route3 小时前
如何在 Spring Boot 中指定不同的配置文件?
java·spring boot·后端
得意霄尽欢3 小时前
Redis之底层数据结构
数据结构·数据库·redis
百锦再3 小时前
在 CentOS 系统上实现定时执行 Python 邮件发送任务
java·linux·开发语言·人工智能·python·centos·pygame
hsjkdhs3 小时前
MySQL 数据类型与运算符详解
数据库·mysql
echoyu.3 小时前
消息队列-kafka完结
java·分布式·kafka