侧边栏壁纸
博主头像
拾荒的小海螺博主等级

只有想不到的,没有做不到的

  • 累计撰写 192 篇文章
  • 累计创建 18 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
OPS

Docker:搭建 FastDFS 分布式文件系统的技术指南

拾荒的小海螺
2024-12-16 / 0 评论 / 0 点赞 / 8 阅读 / 7554 字

1、简述

FastDFS 是一个高性能的分布式文件系统,主要用于处理海量数据的存储需求,尤其在处理图片、视频等大文件时表现优秀。FastDFS 具有很高的效率和灵活性,广泛应用于图片存储和文件管理系统。本文将介绍如何在 Docker 上部署 FastDFS,并提供 Java 示例代码来集成 FastDFS 客户端。

1734311367263.jpg

2、什么是 FastDFS?

FastDFS 是一个开源的分布式文件系统,它的设计目标是解决海量文件存储、文件上传下载的效率问题。FastDFS 由两个主要的组件组成:

  • Tracker 服务器:用于管理文件上传和下载请求,以及对存储服务器的管理。
  • Storage 服务器:用于存储实际的文件数据,并提供文件的读取和写入功能。

FastDFS 支持水平扩展,可以根据需要增加多个存储服务器以提升性能和可用性。

3、 部署 FastDFS

通过 Docker 部署 FastDFS 是一种简单且高效的方式,它能够帮助我们快速搭建环境并进行测试。

3.1 拉取 FastDFS 镜像

我们可以使用官方的 FastDFS Docker 镜像或者社区镜像。下面是使用 Docker Hub 上的社区镜像的步骤:

docker pull delron/fastdfs

3.2 启动 Tracker 服务

Tracker 是 FastDFS 的调度节点,用于管理和跟踪 Storage 节点。运行以下命令启动 Tracker 服务:

docker run -d --name fastdfs-tracker \
  --restart=always \
  --network=host \
  -p 22122:22122 \
  delron/fastdfs tracker

3.3 启动 Storage 服务

Storage 是文件存储节点,负责实际的文件存储和访问。运行以下命令启动 Storage 服务,并链接到 Tracker:

#创建映射路径
mkdir -p /data/fastdfs/storage

docker run -d --name fastdfs-storage \
  --link fastdfs-tracker:tracker \
  --restart=always \
  --network=host \
  -e TRACKER_SERVER=tracker:22122 \
  -v /data/fastdfs/storage:/var/fdfs \
  -p 23000:23000 -p 8080:8080 -p 8888:8888 \
  delron/fastdfs storage

3.4 对外端口

FastDFS 自带Ngnix,默认的端口有三个8888,23000,22122。8888是默认的nginx代理端口,23000是storage服务端口,22122是tracker服务端口。如果要修改当前8888端口,可以进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在**/etc/fdfs**目录下的storage.conf:

#进入容器
docker exec -it fastdfs-storage /bin/bash  

#进入目录
cd /etc/fdfs/   

#编辑文件
vi storage.conf   

1734311418321.jpg

通过以上方式修改好端口,如果有防火墙需要将当前的三个端口开放:

firewall-cmd --zone=public --permanent --add-port=8888/tcp
firewall-cmd --zone=public --permanent --add-port=22122/tcp
firewall-cmd --zone=public --permanent --add-port=23000/tcp

重启防火墙:

systemctl restart firewalld

3.5 验证服务

使用以下命令检查容器状态,确保 Tracker 和 Storage 服务运行正常:

docker ps

1734311454520.jpg

通过storage容器,进入/var/fdfs目录:

#进入容器
docker exec -it fastdfs-storage /bin/bash  

#进入目录
cd /var/fdfs/

#添加b.txt测试文件
 echo hello 测试文件>b.txt

#通过以下指令上传b.txt文件
 /usr/bin/fdfs_upload_file /etc/fdfs/client.conf b.txt
 
 #上传成功生成对外访问的地址
group1/M00/00/00/rBEABWdHM8iAGXyhAAAAFy0dlFI076.txt

通过浏览器访问以下地址:

http://ip:8888/group1/M00/00/00/rBEABWdHNC6AH7hIAAAAECkLk8U783.txt

4、实现文件操作

4.1 Maven引用

在使用 FastDFS 之前,需要添加其依赖。以下是 FastDFS 的 Maven 依赖:

<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.27.2</version>
</dependency>

4.2 配置

在项目的配置文件application.properties 指定 FastDFS 配置:

fdfs.so-timeout=1500
fdfs.connect-timeout=600
#thumbImage param
fdfs.thumb-image.height=150
fdfs.thumb-image.width=150
#TrackerList参数,支持多个
fdfs.tracker-list=192.168.157.129:22122

4.3 文件上传和下载

创建FastDFSUtil 工具类来负责文件系统的上传和下载,通过该组件来请求:

package com.lm.shop.shopeureka.util;

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;

@Component
public class FastDFSUtil {


    private final Logger logger = LoggerFactory.getLogger(FastDFSUtil.class);

    @Autowired
    private FastFileStorageClient fileStorageClient;

    /**
     * 文件上传
     *
     * @param multipartFile 附件上传
     * @return fastDfs路径
     */
    public String uploadFile(MultipartFile multipartFile) throws Exception{
        String originalFilename = multipartFile.getOriginalFilename().
                substring(multipartFile.getOriginalFilename().
                        lastIndexOf(".") + 1);
        StorePath storePath = this.fileStorageClient.uploadImageAndCrtThumbImage(
                multipartFile.getInputStream(),
                multipartFile.getSize(),originalFilename , null);
        return storePath.getFullPath() ;
    }

    /**
     * 删除文件
     *
     * @param filePath 附件路径
     * @return void
     */
    public void delFile(String filePath) {
        this.fileStorageClient.deleteFile(filePath);
    }

    /**
     * 文件上传
     *
     * @param bytes     文件字节
     * @param fileSize  文件大小
     * @param extension 文件扩展名
     * @return fastDfs路径
     */
    public String uploadFile(byte[] bytes, long fileSize, String extension) {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        StorePath storePath = fileStorageClient.uploadFile(byteArrayInputStream, fileSize, extension, null);
        logger.info(storePath.getGroup() + "===" + storePath.getPath() + "======" + storePath.getFullPath());
        return storePath.getFullPath();
    }

    /**
     * 下载文件
     *
     * @param fileUrl 文件URL
     * @return 文件字节
     * @throws IOException
     */
    public byte[] downloadFile(String fileUrl) throws IOException {
        String group = fileUrl.substring(0, fileUrl.indexOf("/"));
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
        DownloadByteArray downloadByteArray = new DownloadByteArray();
        byte[] bytes = fileStorageClient.downloadFile(group, path, downloadByteArray);
        return bytes;
    }

}

5、总结

通过 Docker 搭建 FastDFS 服务非常高效,并且可以快速启动测试环境。使用 Java 客户端可以轻松实现文件的上传、下载等操作。具体的生产环境中,建议优化以下内容:

  • 高可用部署:考虑配置多台 Tracker 和 Storage 实现负载均衡和容错。
  • 文件访问权限:对上传的文件进行权限控制。
  • 日志监控:通过日志和监控工具确保服务运行稳定。

希望这篇博客能帮助您快速上手 FastDFS!

0

评论区