FastDFS搭建文件系统

搭建FastDFS集成到Java当中

1.安装依赖
yum install gcc libevent libenent-devel -y
2.下载依赖包

如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6L34xd5r-1684720243430)(fastDFS.assets/image-20230511152255580.png)]

自己去官网下载即可

下载到自己本地以后讲依赖包放到Linux服务器中

我这里选择路径/usr/local/soft

如果没有soft包,需要先新建包

mkdir soft
3.解压缩依赖包
tar zxvf 依赖包名称

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ix5f0s9n-1684720243439)(fastDFS.assets/image-20230511152506655.png)]

解压缩以后如上图

现在需要执行解压缩以后的包中的脚本

cd FastDFS

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-074O6wwh-1684720243442)(fastDFS.assets/image-20230511152614332.png)]

执行命令

./make.sh

执行完毕以后下载

./make.sh install

对于libfastcommon来说也是上述步骤,这里不多赘述

执行完毕后,打开/usr/bin,会发现很多fdfs开头的命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eMiSIAVs-1684720243442)(fastDFS.assets/image-20230511152745016.png)]

4.拷贝两个脚本

进入FDFS包中的conf包,将http.conf和mime.types拷贝到/etc/fdfs/中

cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/
5.启动前的配置

编辑tracker.conf.sample

vi tranker.conf.sample

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8I4lrlY-1684720243444)(fastDFS.assets/image-20230511154637604.png)]

将base_path改成自己服务器当中存在的一个路径

编辑storage.conf.sample

vi stprage.conf.sample

修改配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayxmIBQq-1684720243446)(fastDFS.assets/image-20230511155328093.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GxPC7Xfn-1684720243447)(fastDFS.assets/image-20230511155447752.png)]

注意如果没有上面创建的目录,需要先创建目录

6.启动
  • 启动、关闭、重启tracker server
//语法:fdfs_trackerd 配置文件路径 start|stop|restart,如果不传参数,则默认是start启动

//启动
fdfs_trackerd /etc/fdfs/tracker.conf start
//停止
fdfs_trackerd /etc/fdfs/tracker.conf stop
//重启
fdfs_trackerd /etc/fdfs/tracker.conf restart

  • 启动、关闭、重启storage server
//语法:fdfs_trackerd 配置文件路径 start|stop|restart,如果不传参数,则默认是start启动

//启动
fdfs_trackerd /etc/fdfs/tracker.conf start
//停止
fdfs_trackerd /etc/fdfs/tracker.conf stop
//重启
fdfs_trackerd /etc/fdfs/tracker.conf restart

查看是否启动服务成功

ps -ef | grep fdfs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6QLAz5cm-1684720243448)(fastDFS.assets/image-20230511162508789.png)]

如上图所示 说明启动成功

7.测试上传

修改 base_pathtracker_server

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ptoka38j-1684720243450)(fastDFS.assets/image-20230511165541370.png)]

在根目录下创建一个文件 test.txt

然后执行命令

语法:fdfs_test 配置文件位置 参数 upload, download, getmeta, setmeta, delete and query_servers

//上传
fdfs_test /etc/fdfs/client.conf upload 要上传的文件路径 (这里是test.txt)

日志

[2023-05-11 17:05:55] DEBUG - base_path=/opt/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

tracker_query_storage_store_list_without_group: 
	server 1. group_name=, ip_addr=42.192.23.207, port=23000

group_name=group1, ip_addr=42.192.23.207, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/CgAEDWRcr_SAKeKxAAAAHNz9dIo846.txt
source ip address: 10.0.4.13
file timestamp=2023-05-11 17:05:56
file size=28
file crc32=3707597962
example file url: http://42.192.23.207/group1/M00/00/00/CgAEDWRcr_SAKeKxAAAAHNz9dIo846.txt
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/CgAEDWRcr_SAKeKxAAAAHNz9dIo846_big.txt
source ip address: 10.0.4.13
file timestamp=2023-05-11 17:05:56
file size=28
file crc32=3707597962
example file url: http://42.192.23.207/group1/M00/00/00/CgAEDWRcr_SAKeKxAAAAHNz9dIo846_big.txt

根据日志,可以知道我们刚才上传的文件位置是在group1,远程文件路径未我们创建的client目录下的

/opt/fastdfs/storage/files/data/00/00/CgAEDWRcr_SAKeKxAAAAHNz9dIo846.txt

由此我们上传文件的操作就做好了,接下来尝试删除文件和下载文件

//下载文件
fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/CgAEDWRcr_SAKeKxAAAAHNz9dIo846_big.txt

//删除文件
fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/CgAEDWRcr_SAKeKxAAAAHNz9dIo846_big.txt

到这里跟大家总结一下,我们每次上传文件时最终要上传到/opt/fastdfs/storage/files/data 下,data下有许多文件夹,因此我们在上传时会返回group_name和remote_filename,通过命令与group_name和具体路径的拼接拿到文件的全路径,然后来对文件进行一系列的操作,如上面的下载文件和上传文件。而作为一个客户端来说,比如我想使用Java来操作远程仓库的文件,我一定是在数据库中保存该文件的group_name 以及 remote_filename,这样子每一个文件的路径我们都可以维护起来,之后再想要进行下载文件操作和删除文件操作,就都很简单了。

8.安装Nginx

FastDFS在服务器上不支持浏览器直接访问,因此我们需要配置Nginx来暴露FastDFS对外服务

  • 安装Nginx到 /usr/local/soft 目录下
  • 解压缩
tar -zxvf Nginx压缩包名

解压完成后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJkwRDW2-1684720243451)(fastDFS.assets/image-20230515162957413.png)]

这里需要两个文件

//nginx
nginx-1.17.3
//fastdfs提供的nginx拓展模块
fastdfs-nginx-module
  • 进入fastdfs-nginx-module的src目录下
cd /fastdfs-nginx-module/src
  • 拷贝src完整路径
//获取当前的目录路径
pwd
//输出
/usr/local/soft/fastdfs-nginx-module/src
  • 配置nginx
//进入到nginx目录下
cd nginx-1.17.3

//prefix标识nginx安装路径  --add-module表示添加一个模块到nginx  这个模块就是你的fastdfs-nginx-modele/src所在的路径
./configure --prefix=/usr/local/nginx_fdfs --add-module=/usr/local/soft/fastdfs-nginx-module/src

//编译
make


//安装
make install
  • 配置nginx拓展模块
//进入拓展模块的src目录
cd fastdfs-nginx-module/src

修改mod_fastdfs.conf

vi mod_fastdfs.conf

具体修改的内容

1.修改基础目录 如果没有这个目录 需要我们手动创建

# 修改前
base_path=/tmp

# 修改后
base_path=/opt/fastdfs/nginx_mod

2.指定tracker server的地址

# 修改前
tracker_server=tracker:22122

# 修改后
tracker_server=127.0.0.1:22122

3.修改指定url请求中必须包含组名 必须改为true

# 修改前
url_have_group_name = false

# 修改后
url_have_group_name = true

4.指定文件存储路径

# 修改前
store_path0=/home/yuqing/fastdfs

# 修改后
store_path0=/opt/fastdfs/storage/files

所有配置都改完以后,将mod_fastdfs.conf文件放到/etc/fdfs下

  • 创建/opt/fastdfs/nginx_mod 目录,否则nginx会启动不起来

  • 配置nginx.conf文件

cd /usr/locaol/nginx_fdfs/conf

vi nginx.conf

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;
    }

    # 配置FastDFS,拦截文件请求给FastDFS提供的nginx拓展模块 我们只需要添加这个配置即可
    location ~ /group[1-9]/M0[0-9] {
        ngx_fastdfs_module;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
9.启动nginx
//-t参数,检查配置文件语法是否有问题
/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf -t

//正式启动
/usr/local/nginx_fdfs/sbin/nginx -c /usr/local/nginx_fdfs/conf/nginx.conf   //-c后的路径是自己的nginx.conf文件所在的绝对路径
#查看是否启动成功
ps -ef | grep nginx

如果失败,可以查看nginx的日志文件

cd /usr/local/nginx_fdfs
cd logs

启动失败的原因: 1.mod_fastdfs.conf没有方法/etc/fdfs目录下 2.mode_fastdfs.conf的base_path错误

10.Java操作FastDFS
10.1 由于maven仓库没有FastDFS,因此我们需要从github中下载并在自己本地打包到本地仓库中

https://github.com/happyfish100/fastdfs-client-java

10.2 新建一个maven工程并导入依赖
<dependencies>
    <dependency>
        <groupId>org.csource</groupId>
        <artifactId>fastdfs-client-java</artifactId>
        <version>1.27-SNAPSHOT</version>
    </dependency>
</dependencies>

10.3 配置tracker server地址
tracker_server=xxx.xxx.xxx.xxx:22122  //写上自己的服务器地址
10.4 新增FastDFS工具类

这里基本功能不需要自己写,如果上业务上有需要再进行个性化更改就行

package com.fannnnn.util;

import org.csource.common.MyException;
import org.csource.fastdfs.*;

import java.io.IOException;

public class FastDFSUtil {
    /**
     * 文件上传
     */
    public static String[] upload(String localFileName) {
        TrackerServer trackerServer = null;
        StorageServer storageServer = null;
        try {
            //读取配置文件,用于将所有tracker server的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            TrackerClient trackerClient = new TrackerClient();
            trackerServer = trackerClient.getConnection();
            storageServer = trackerClient.getStoreStorage(trackerServer);
            //定义Storage的客户端对象,需要使用这个对象来完成具体的文件上传、下载和删除操作
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            //上传,参数一:需要上传的文件的绝对路径,参数二:需要上传的文件的扩展名,参数三:文件的属性文件,通常不上传
            //返回一个String数组,这个数据对我们非常有用,必须妥善保管,建议保存到数据库
            //返回结果数组:第一个元素为文件所在的组名,第二个元素为文件所在的远程路径名称
            return storageClient.upload_file(localFileName, "png", null);
        } catch (IOException | MyException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            try {
                if (storageServer != null) {
                    storageServer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (trackerServer != null) {
                    trackerServer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 下载
     *
     * @param groupName      组名
     * @param remoteFileName 远程文件名称
     * @param saveFileName   保存的文件名称
     * @return 返回是否下载成功
     */
    public static boolean download(String groupName, String remoteFileName, String saveFileName) {
        TrackerServer trackerServer = null;
        StorageServer storageServer = null;
        try {
            //读取配置文件,用于将所有tracker server的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            TrackerClient trackerClient = new TrackerClient();
            trackerServer = trackerClient.getConnection();
            storageServer = trackerClient.getStoreStorage(trackerServer);
            //定义Storage的客户端对象,需要使用这个对象来完成具体的文件上传、下载和删除操作
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            //文件下载,参数一:文件的组名,参数二:文件的远程文件名,参数三:保存到本地文件的名称
            //返回0,则为文件下载成功,其他值表示下载失败
            int code = storageClient.download_file(groupName, remoteFileName, saveFileName);
            return code == 0;
        } catch (IOException | MyException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            try {
                if (storageServer != null) {
                    storageServer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (trackerServer != null) {
                    trackerServer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    /**
     * 文件删除
     *
     * @param groupName      组名
     * @param remoteFileName 远程文件名称
     */
    public static boolean delete(String groupName, String remoteFileName) {
        TrackerServer trackerServer = null;
        StorageServer storageServer = null;
        try {
            //读取配置文件,用于将所有tracker server的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            TrackerClient trackerClient = new TrackerClient();
            trackerServer = trackerClient.getConnection();
            storageServer = trackerClient.getStoreStorage(trackerServer);
            //定义Storage的客户端对象,需要使用这个对象来完成具体的文件上传、下载和删除操作
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
            //文件删除,参数一:需要删除的文件组名,参数二:文件的远程名称,返回int结果,为0则成功,其他则为失败
            int code = storageClient.delete_file(groupName, remoteFileName);
            return code == 0;
        } catch (IOException | MyException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            try {
                if (storageServer != null) {
                    storageServer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (trackerServer != null) {
                    trackerServer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
}
10.5 测试
package com.fannnnn.util;

/**
 * \*  Created with IntelliJ IDEA.
 * \*  @author shensifan
 * \*  Date: 2023/5/16
 * \*  Time: 10:36
 * \*  Description:
 * \
 */

public class test {

    public static void main(String[] args) {
//        String[] results = FastDFSUtil.upload("G:\\沈思帆.pdf");
//        if (results!=null && results.length==2) {
//            String group = results[0];
//            String remoteFileName = results[1];
//            System.out.println("group:"+group);
//            System.out.println("remoteFileName:"+remoteFileName);
//            System.out.println("链接地址: http://42.192.23.207/"+group+"/"+remoteFileName);
//        }
        download();
    }

    /**
     * 上传文件
     */
    private static void upload() {
        String[] results = FastDFSUtil.upload("/Users/wally/Desktop/Code/Java/fastdfs-java/src/main/resources/FastDFS命名解析.png");
        if (results != null && results.length == 2) {
            String group = results[0];
            String remoteFileName = results[1];
            System.out.println("group:" +group);
            System.out.println("remoteFileName:" + remoteFileName);
            System.out.println("链接地址:http://192.168.211.131/" + group + "/" + remoteFileName);
        }
    }



    /**
     * 下载文件
     */
    private static void download() {
        //下载文件到项目的根目录
        boolean result = FastDFSUtil.download("group1",
                "M00/00/00/CgAEDWRi79qAabDHAAdEJVWnCdM638.png",
                "a.pdf");
        if (result) {
            System.out.println("文件下载成功!");
        } else {
            System.out.println("文件下载失败!");
        }
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FastDFS 是一个开源高性能分布式文件系统,它主要解决了海量数据存储和负载均衡的问题,适合用于图片、音频、视频等文件的存储和访问。下面是在 Linux 系统上搭建 FastDFS 文件服务器的步骤: 1. 安装依赖库: ``` yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel wget ``` 2. 下载 FastDFS 源码: ``` wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz ``` 3. 解压源码并编译安装: ``` tar zxvf V6.06.tar.gz cd fastdfs-6.06/ ./make.sh ./make.sh install ``` 4. 配置 Tracker 服务器: 在 Tracker 服务器上创建一个 tracker.conf 配置文件,并添加以下内容: ``` # 配置 Tracker 服务器的 IP 和端口号 port=22122 bind_addr=192.168.0.1 # 配置存储服务器的组名和存储服务器的 IP 和端口号 group_name=group1 group_count=1 group0_ip=192.168.0.2 group0_port=23000 # 配置日志文件的路径和级别 log_level=info log_filename=/var/log/fdfs/trackerd.log ``` 5. 启动 Tracker 服务器: ``` /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart ``` 6. 配置 Storage 服务器: 在 Storage 服务器上创建一个 storage.conf 配置文件,并添加以下内容: ``` # 配置 Tracker 服务器的 IP 和端口号 tracker_server=192.168.0.1:22122 # 配置存储服务器的 IP 和端口号 port=23000 bind_addr=192.168.0.2 # 配置存储服务器的组名和容量 group_name=group1 store_path_count=1 store_path0=/data/fastdfs/storage # 配置心跳时间和同步文件的时间 heart_beat_interval=30 sync_wait_msec=600 # 配置日志文件的路径和级别 log_level=info log_filename=/var/log/fdfs/storaged.log ``` 7. 启动 Storage 服务器: ``` /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart ``` 8. 测试上传和下载文件: 在客户端机器上安装 FastDFS 客户端工具: ``` yum install -y libfastcommon wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz tar zxvf V6.06.tar.gz cd fastdfs-6.06/ ./make.sh ./make.sh install ``` 上传文件: ``` /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /path/to/local/file ``` 下载文件: ``` /usr/bin/fdfs_download_file /etc/fdfs/client.conf group1 M00/00/00/xxx /path/to/local/file ``` 以上就是在 Linux 系统上搭建 FastDFS 文件服务器的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值