FastDFS单机部署及SpringBoot整合

news2024/11/18 5:41:18

前言

FastDFS是一个开源的高性能分布式文件系统。它的主要功能包括:文件存储、文件同步和文件访问(文件上传和文件下载),可以解决高容量和负载平衡问题。FastDFS应满足其服务基于文件的网站的要求,如照片共享网站和视频共享网站。开源地址https://github.com/happyfish100

介绍

1、角色

Tracker:跟踪器负责文件访问的调度和负载平衡。负责管理所有的storage和group,storage启动后会连接tracker,告知自己的group信息

Storage:存储器存储文件,其功能是文件管理,包括:文件存储、文件同步、提供文件访问接口

Client:客户端,上传下载文件的服务器,一般是我们的应用程序
在这里插入图片描述

2、文件上传

storage定时向tracker同步状态信息,集群中的每个tracker是对等的,因此上传时,客户端选择任意的tracker,请求到storage的相关信息(ip、port),根据返回的信息上传文件,通过storage写入磁盘,并返回客户端存储的文件信息(fileId、路径、文件名等)
在这里插入图片描述

3、文件同步

客户端向group内的任意storage写入文件成功即可,storage写完文件后,会由后台线程将文件同步至同group内其他的storage,每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步

4、文件下载

客户端根据业务存储的文件信息,可以拿到文件,流程同上传,如下所示
在这里插入图片描述

安装

最新版FastDFS安装要求Centos7及以上,FastDFS安装包

1、安装libfastcommon

解压安装包unzip libfastcommon-master.zip
在这里插入图片描述
进入libfastcommon-master安装目录,分别执行./make.sh./make.sh install
在这里插入图片描述
在这里插入图片描述
libfastcommon默认会被安装到/usr/lib64/libfastcommon.so,FastDFS的主程序在/usr/local/lib目录下,创建软连接

ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

至此,libfastcommon安装完成

2、安装fastdfs

在安装fastdfs之前,需要先安装libserverframe,这是因为我这里安装的最新fastdfs安装包,缺少libserverframe,github地址,否则执行./make.sh时报错

/common/fdfs_global.h:15:26: 致命错误:sf/sf_global.h:没有那个文件或目录

在这里插入图片描述
解压安装包unzip libserverframe-master.zip
进入安装目录,分别执行./make.sh./make.sh install,如遇到如下问题,执行./make.sh clean然后重新./make.sh
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
安装完毕后,安装fasfdfs,解压安装包unzip fastdfs-master.zip
进入fastdfs-master目录,分别执行./make.sh./make.sh install
fastdfs配置文件默认在/etc/fdfs,我们继续执行./setup.sh /etc/fdfs安装

3、配置tracker

先创建tracker的工作目录,主要用来保存data和log,我直接在fastdfs同级目录创建了/tools/fastdfs_tracker,进入/etc/fdfs配置目录,编辑配置文件vi /etc/fdfs/tracker.conf,修改配置如下

1.disabled=false #默认开启(false是启用这个配置文件) 
2.port=22122 #默认端口号 (tracker默认端口)
3.base_path=/tools/fastdfs_tracker #上面创建的目录就用在这里
4.http.server_port=6666 #默认端口是8080(tracker的默认http端口)

修改完成保存,然后启动tracker,systemctl start fdfs_trackerd,启动后,在工作目录可以看到创建了data和log目录,也可以查看下端口监听netstat -unltp|grep fdfs
在这里插入图片描述
关闭trackerservice fdfs_trackerd stop,然后将其加入开机启动,查看ll /etc/rc.d/rc.local是否有修改权限,若为-rwxr-xr-x表示可以,若为-rw-r–r–则需要刷新权限
在这里插入图片描述
执行chmod +x /etc/rc.d/rc.local,然后编辑vi /etc/rc.d/rc.local加入如下配置

systemctl start fdfs_trackerd

至此,tracker配置启动完毕

4、配置storage

新建storage安装目录/tools/storage和文件存储目录/tools/fdfs_storage_data,编辑配置文件vi /etc/fdfs/storage.conf,如下

1.disabled=false 
2.group_name=group1 #组名,根据实际情况修改 
3.port=23000 #设置storage的端口号,默认是23000,同一个组的storage端口号必须一致 
4.base_path=/tools/fdfs_storage #设置storage数据文件和日志目录 
5.store_path_count=1 #存储路径个数,需要和store_path个数匹配 
6.base_path0=/tools/fdfs_storage_data #实际文件存储路径 
7.tracker_server=ip:22122 #这里我写的是服务器内网ip
8.http.server_port=8888 #设置 http 端口号,别设置6667,坑

创建软连接ln -s /usr/bin/fdfs_storaged /usr/local/bin,启动前确认tracker已启动,然后启动systemctl start fdfs_storaged,启动后查看netstat -unltp | grep fdfs在这里插入图片描述
然后查看tracker和storage是否通信,/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
在这里插入图片描述
然后接入开机启动,同上

5、客户端配置

创建tracker client的数据和日志目录/tools/fdfs_client,编辑配置文件vi /etc/fdfs/client.conf

base_path = /tools/fdfs_client
tracker_server = ip:22122

测试文件上传/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 111.png
在这里插入图片描述

group1/M00/00/00/wKiIh2SbzNCAAjD3AADMLPdP-Nk403.png
组名/磁盘/目录/文件名

6、配置nginx访问文件

安装nginx
安装gcc      yum install gcc‐c++
安装pcre库      yum install ‐y pcre pcre‐devel
安装zlib库        yum install ‐y zlib zlib‐devel
安装openssl库   yum install ‐y openssl openssl‐devel
解压  tar -zxvf nginx-1.22.1-tar.gz
进入解压目录 执行 ./configure
编译 make & make install
修改nginx.conf配置文件 vim /usr/local/nginx/conf/nginx.conf
location /group1/M00 {
            alias /tools/fdfs_storage_data/data;  #storage存储文件的data路径
        }
重启nginx /usr/local/nginx/sbin/nginx -s reload

访问http://ip:80/group1/M00/00/00/wKiIh2SbzNCAAjD3AADMLPdP-Nk403.png
在这里插入图片描述

7、fastdfs配置nginx模块

FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进行文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了A,上传成功后文件 ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储B,在文件还没有复制完成的情况下,客户端如果用这个文件ID在A上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
解压安装包unzip fastdfs-nginx-module-master.zip,停掉nginx/usr/local/nginx/sbin/nginx -s stop,进入nginx安装目录添加模块./configure --add-module=../fastdfs-nginx-module-master/src,然后编译安装makemake install,最后查看nginx模块/usr/local/nginx/sbin/nginx -V
在这里插入图片描述
复制fastdfs-nginx-module源码中的配置文件到/etc/fdfs,

cp mod_fastdfs.conf /etc/fdfs/

修改配置如下

connect_timeout=10
base_path=/tools/fdfs_nginx #日志存放目录
tracker_server=ip:22122 #tracker服务
url_have_group_name = true #如果文件ID的uri中包含/group**,则要设置为true
store_path0=/tools/fdfs_storage_data #文件存放目录,和storage保持一致

然后修改nginx配置文件,修改监听端口为storage的http端口,然后添加如下内容

location ~/group([0-9])/M00 {
    ngx_fastdfs_module;
}

重启nginx,重新访问8888端口的图片,访问成功,配置成功
在这里插入图片描述
至此,FastDFS的单机安装部署完成,若想要配置集群模式,只需要将tracker和storage多配置几个节点,然后storage里面配好多个tracker的信息即可。

SpringBoot集成

1、依赖&配置

<!--fastDfs-->
        <dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>

我这里创建的是properties类型的配置文件,根据开源网站https://github.com/happyfish100/fastdfs-client-java的README的提示,将文件命名为fastdfs-client.properties,放在source下,加载方式有如下几种

加载 properties 格式文件配置:
ClientGlobal.initByProperties("fastdfs-client.properties");
ClientGlobal.initByProperties("config/fastdfs-client.properties");
ClientGlobal.initByProperties("/opt/fastdfs-client.properties");
ClientGlobal.initByProperties("C:\\Users\\James\\config\\fastdfs-client.properties");

配置文件内容如下

fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80

fastdfs.tracker_servers = ip:22122

可以在代码中加入本行代码,检查加载配置结果System.out.println("ClientGlobal.configInfo(): " + ClientGlobal.configInfo());
加载成功的输出如下

ClientGlobal.configInfo(): {
  g_connect_timeout(ms) = 5000
  g_network_timeout(ms) = 30000
  g_charset = UTF-8
  g_anti_steal_token = false
  g_secret_key = FastDFS1234567890
  g_tracker_http_port = 80
  trackerServers = ip:22122
}

2、文件上传

package com.example.test.fastDfs;

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

/**
 * @author zy_ys
 */
public class fast {
    static StorageClient1 storageClient;
    static TrackerServer trackerServer;
    public void init() {
        try{
            //加载fastDFS客户端配置文件
            ClientGlobal.initByProperties("fastdfs-client.properties");
            //检查加载结果
            System.out.println("ClientGlobal.configInfo(): " + ClientGlobal.configInfo());
            //创建tracker客户端
            TrackerClient trackerClient = new TrackerClient();
            trackerServer = trackerClient.getConnection();
            StorageServer storageServer = null;
            //创建storage客户端
            storageClient = new StorageClient1(trackerServer,storageServer);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void destroy(){
        try{
            trackerServer.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        fast f = new fast();
        f.init();
        f.testQuery();
        f.destroy();
    }
    public void testUpload(){
        try{
            //文件元信息
            NameValuePair[] nameValuePairs = new NameValuePair[1];
            nameValuePairs[0] = new NameValuePair("fileName","iu.jpeg");
            //执行上传
            String fileId = storageClient.upload_file1("C:\\Users\\zy_ys\\Desktop\\壁纸\\iu.jpeg","jpeg",nameValuePairs);
            System.out.println(fileId);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

3、文件查询

public void testQuery(){
        try{
            FileInfo fileInfo1 = storageClient.query_file_info("group1","M00/00/00/wKiIh2SdLxGAJa56AAH0QK31_6c47.jpeg");
            FileInfo fileInfo2 = storageClient.query_file_info1("group1/M00/00/00/wKiIh2SdLxGAJa56AAH0QK31_6c47.jpeg");
            System.out.println(fileInfo1);
            System.out.println(fileInfo2);
            //查询元信息
            NameValuePair[] nameValuePairs = storageClient.get_metadata1("group1/M00/00/00/wKiIh2SdLxGAJa56AAH0QK31_6c47.jpeg");
            System.out.println(nameValuePairs);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

在这里插入图片描述

4、文件下载

public void testDown(){
        try{
            byte[] bytes = storageClient.download_file1("group1/M00/00/00/wKiIh2SdLxGAJa56AAH0QK31_6c47.jpeg");
            File file = new File("C:\\Users\\zy_ys\\Desktop\\down_iu.jpeg");
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(bytes);
            fileOutputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

在这里插入图片描述
上面展示了基本的上传下载的Java API调用,实际上,我们应用中是需要封装一个可重复使用的项目去连接FastDFS,这里给出一个开源的工具https://github.com/bojiangzhou/lyyzoo-fastdfs-java

5、开启token验证

前面,我们可以直接根据nginx访问图片,这种显然不安全,FastDFS提供了一种token验证机制,需要在访问地址上拼接token才能访问。我们先配置服务端,修改http.conf,内容如下

http.anti_steal.check_token = true #开启token验证
http.anti_steal.token_ttl = 900 #token失效时间,单位s
http.anti_steal.secret_key = FastDFS1234567890 #密钥,与客户端的fastdfs.http_secret_key保持一致
http.anti_steal.token_check_fail = /etc/fdfs/anti-steal.jpg #token检查失败返回页面

全部重启后,发现访问不到文件,然后修改客户端配置

fastdfs.http_anti_steal_token = true
fastdfs.http_secret_key = FastDFS1234567890

然后客户端生成token,代码如下

public void getToken(){
        String filePath = "group1/M00/00/00/wKiIh2SdLxGAJa56AAH0QK31_6c47.jpeg";
        String secretKey = "FastDFS1234567890";
        String token = "";
        int ts = (int) Instant.now().getEpochSecond();
        try{
            token = ProtoCommon.getToken(getFilename(filePath),ts,secretKey);
        }catch (Exception e){
            e.printStackTrace();
        }
        StringBuilder sb = new StringBuilder();
        sb.append("token=").append(token);
        sb.append("&ts=").append(ts);
        System.out.println(sb.toString());
    }

    public String getFilename(String fileId){
        String[] results = new String[2];
        StorageClient1.split_file_id(fileId, results);

        return results[1];
    }

在这里插入图片描述
最后在访问路径拼接token信息,访问
在这里插入图片描述
访问成功,至此,FastDFS的基本使用搞定!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据安全服务,美创科技为“数字国贸” 筑牢安全防线

在数字经济蓬勃发展的当下&#xff0c;国有企业作为国民经济的“中流砥柱”&#xff0c;正以主力军和先行者之姿&#xff0c;以数字化转型创新作为引擎&#xff0c;驱动高质量发展。数字化进程持续深入&#xff0c;伴随数据要素多样流动&#xff0c;降低数据安全风险&#xff0…

UART I2C SPI CAN LIN 和ETH这些通讯外设的内在联系

这些不同的通讯手段之间其实有着许多隐藏的共性。 物理层到数据链路层扒一扒这些通讯手段的底层原理。 物理层与数据链路层这两个概念&#xff1a; ISO国际标准化组织在上世纪70年代末&#xff0c; 把计算机网络通信的整个框架描述成了一个七层的模型&#xff0c;并称之为OS…

数据备份技术------概述与总结

数据备份技术------概述与总结 数据备份技术------概述与总结备份技术的发展&#xff08;组网方式&#xff09;1、Host备份方式2、LAN备份方式3、LAN-free备份方式&#xff08;SAN&#xff09;4、Server-free备份方式5、Sever-less备份方式 备份技术的发展&#xff08;主流备份…

Springboot搭配Redis实现接口限流

目录 介绍 限流的思路 代码示例 必需pom依赖 自定义注解 redis工具类 redis配置类 主拦截器 注册拦截器 介绍 限流的需求出现在许多常见的场景中&#xff1a; 秒杀活动&#xff0c;有人使用软件恶意刷单抢货&#xff0c;需要限流防止机器参与活动 某 api 被各式各样…

人工智能系统的技术架构

一、架构图 1.基础层包括&#xff1a; 硬件设施、软件设施、数据资源。其中在硬件设施方面&#xff0c;做深度学习和神经网络训练时候往往会涉及到模型训练是在CPU还是GPU上面&#xff0c;在这个里面GPU就是做计算加速的&#xff0c;第二个是智能芯片&#xff0c;市面上出现的…

linux 系统 最详细 启动流程

文章目录 详细分析 系统启动过程主要流程阶段说明BIOSMBR(Stage 1 bootloader)GROUB(Stage 2 bootloader)kernelvmlinuzinitrd.img Init 详细分析 系统启动过程 主要流程 PC 启动主要流程&#xff0c;分为四个阶段&#xff1a; BIOS -> MBR -> GRUB -> KERNEL ->…

6.3.5 修改文件时间或创建新文件: touch

我们在 ls 这个指令的介绍时&#xff0c;有稍微提到每个文件在linux下面都会记录许多的时间参数&#xff0c; 其实是有三个主要的变动时间&#xff0c;那么三个时间的意义是什么呢&#xff1f; modification time &#xff08;mtime&#xff09;&#xff1a; 当该文件的“内容…

1.6、JAVA 分支结构 switch结构 for循环

1 分支结构 1.1 概述 顺序结构的程序虽然能解决计算、输出等问题 但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构 1.2 形式 1.3.1 练习&#xff1a;商品打折案例 创建包: cn.tedu.basic 创建类: TestDiscount.java 需求: 接收用户输入的原价。满1000打9折…

消息通知模块的设计原理

目录 介绍 一、数据库设计 公告消息记录应该全局唯一&#xff0c;还是为每个用户创建一条公告消息&#xff1f; 用MongoDB存储消息数据 1. 搞冷热数据分离&#xff0c;热数据定期归档 2. 冷数据存储一段时间后就销毁&#xff0c;释放存储空间 二、系统消息的发送与收…

肺癌的成因

中国医师协会 2023 年呼吸医师年会暨第二十二届中国呼吸医师论坛&#xff08;CACP 2023&#xff09;于 2023 年 6 月 15-18 日在大连如期举行。肺癌是我国目前发病率和死亡率最高的癌症&#xff0c;它的早期筛查和诊断十分关键。 丁香园呼吸时间特邀四川大学华西医院院长、呼吸…

软件测试报告办理解决方案分享,为什么要选择CMA认证或CNAS认可测试报告?

在进行软件测试时&#xff0c;合格的测试报告对于软件产品的质量保障至关重要。那么软件测试报告又该如何办理呢?软件企业为什么要选择CMA认证或CNAS认可的测试报告呢?因为CMA认证的测试报告和CNAS认可的测试报告都具有不可忽视的好处。 一、软件测试报告办理解决方案 1. 测…

我蒙了面试官一上来就说:请你介绍一下你测试过的项目

测试人员在找工作中&#xff0c;基本都会碰到让介绍项目的这种面试题&#xff0c;如何正确介绍自己的项目&#xff1f;需要做哪些技术准备&#xff1f; 今天这篇文章&#xff0c;围绕这些问题&#xff0c;跟大家一起聊一聊。 关于介绍自己的项目&#xff1f; 可以从以下几个方面…

赛效:如何将PDF文件分割成单页的PDF文档

1&#xff1a;打开wdashi点击PDF处理菜单里的“PDF分割”。 2&#xff1a;将本地PDF文件添加上去&#xff0c;在下方选择转换页码&#xff0c;在这里我们选择转换每一页。 3&#xff1a;点击右下角“开始转换”。 4&#xff1a;转换好后&#xff0c;点击绿色下载按钮将分割好的…

七、Docker安装MySQL/Tomcat/Redis等

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、安装步骤二、Docker安装Tomcat2.1 搜索镜像2.2 拉取镜像2.3 查看镜像2.4 启动镜像&#xff08;端口映射&#xff09;2.5 停止容器2.6 移除容器 三、Docker安装MySQL…

23年下半年软考软件测评师难考吗?最近考虑要不要考?

软考中级难度是适中的&#xff0c;可以考啊&#xff01; 因为当代随着各种应用技术层出不穷&#xff0c;随着社会发展&#xff0c;需要大量的软件人才支持&#xff0c;同时软件的更新速度越来越快&#xff0c;市场竞争极其激烈。相关国际认证有微软的&#xff0c;Orical&#…

新西兰访问学者签证申请注意事项

新西兰是一个美丽而富有文化多样性的国家&#xff0c;许多学者都梦想着前往这里进行学术交流和研究。如果你计划申请新西兰的访问学者签证&#xff0c;以下是知识人网小编整理的一些你需要注意的事项&#xff1a; 1. 确认申请资格&#xff1a;在开始申请之前&#xff0c;确保你…

旧手机不要轻易扔掉,将其设置为无线网卡,不消耗流量

如果你有一部旧手机正在闲置着&#xff0c;或者正考虑要将其丢弃&#xff0c;那么请暂停一下。因为这个旧手机可以成为你的无线网卡&#xff0c;帮助你在家中或出行时实现更快的网络下载速度&#xff0c;而且毫不费流量。接下来&#xff0c;我将告诉你如何将旧手机变成无线网卡…

安装 Prometheus 指标存储 观测 dubbo /windows_exporter指标 windows 版本 其他系统换个语法思路一样

目录 下载 Prometheus 访问Prometheus Targets 发现服务 对应的 dubbo 指标就出来了 Dubbo脚手架生成个最简单的项目 导入 Prometheus 相关包 或者使用这个包即可 启动后就自动上报指标了 Windows_exporter or node_exporter 端口 9182 Prometheus 配置 windows_exp…

基于SpringBoot+vue的旧物置换网站设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【产品应用】一体化步进电机在全自动纸张分切机的应用

全自动纸张分切机是现代印刷业中的重要设备之一&#xff0c;它能够将大的纸张切割成相同大小的小纸张&#xff0c;并具有高精度、高速度和高效率等优点。一体化步进电机作为全自动纸张分切机的重要部件&#xff0c;其应用对于提高设备的性能和稳定性具有重要意义。 01.设备简介…