FastDfs分布式文件管理系统简单使用

1.分布式文件管理系统介绍

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。例如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样,下面是三个基本的分布式文件系统。

1.分布式文件管理系统一般都有公司提供服务,也就是说我们可以通过购买别人的服务来实现这种资源的存放,有专员管理,提供技术支持
2.一种是自己同搭建分布式文件管理系统,通过fastdfs自己搭建,

2.FastDfs简介

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

服务端两个角色:
Tracker:管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。
Storage:实际保存文件 Storage 分为多个组(group),每个组之间保存的文件是不同的。每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。

==>图解
在这里插入图片描述
官方网站:https://github.com/happyfish100/
参考资料:https://www.oschina.net/question/tag/fastdfs
Java客户端:https://github.com/happyfish100/fastdfs-client-java
配置文档:https://github.com/happyfish100/fastdfs/wiki/

3.上传下载流程

在这里插入图片描述

得到一个服务器端的ip和端口,使用客户端进行上传,得到服务器返回的一个文件标识,并持久化到数据库
客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
在这里插入图片描述
组名:文件上传后所在的 storage 组名称,在文件上传成功后有 storage 服务器返回,需要客户端自行保存。
 虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项 store_path*对应。如果配置了
store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。
 数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据
文件。
 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储
服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

4.最简单的FastDfs构架

在这里插入图片描述

1:本地的文件上传下载功能:
2:导入开源的fastdfs的java客户端
3:搭建fastdfs的服务器

FastDfs一般由专业的运维人员负责搭建,一般通过linux系统下搭建,我们只需要拿到linux系统,修改storage.conf,client.conf两个配置文件为正确的ip和端口

配置自己的ip规则
==cd /etc/udev/rules.d/==进到这个目录
vi 70-persistent-net.rules编辑这个文件内容
将里面的字符截图记住,然后修改
在这里插入图片描述
进入以下目录
在这里插入图片描述
在这里插入图片描述
修改配置Vi ifcfg-eth1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改storage.conf,client.conf 为正确的trackerd 地址和端口
vi /etc/fdfs/client.conf
vi /etc/fdfs/storage.conf
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

storage.conf也修改
在这里插入图片描述

修改好了,启动这两个服务
service fdfs_trackerd start
service fdfs_storaged start
检查服务是否启动
netstat -unltp|grep fdfs
在这里插入图片描述

启动监控命令
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
启动提供web服务的命令
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
长传文件测试
fdfs_test /etc/fdfs/client.conf upload /root/install.log
在这里插入图片描述

关闭防火墙再访问下面的路径
在这里插入图片	描述
http://192.168.1.124/group1/M00/00/01/wKgBfFzZ9XSAZM6MAAAfkf0NOco274_big.log
得到如下结果
在这里插入图片描述

这样,服务就开启来了,我们可以下载和上传文件了

5.使用java操作

首先下载fastdfs的原文件,
在这里插入图片描述
编译并打包成jar包使用在这里插入图片描述

生成jar依赖到如下路径
在这里插入图片描述在这里插入图片描述

项目导入依赖在这里插入图片描述
文件上传
在这里插入图片描述
文件删除
在这里插入图片描述

controller控制类代码FastDfsController

import cn.itsource.aigou.AjaxResult;
import cn.itsource.aigou.client.FastDfsClient;
import cn.itsource.aigou.client.RedisClient;
import cn.itsource.aigou.util.FastDfsApiOpr;
import cn.itsource.aigou.util.RedisUtil;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@RestController
@RequestMapping("/common")
public class FastDfsController implements FastDfsClient{


    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    @Override
    public AjaxResult upLoad(@RequestBody MultipartFile file) {
        //FastDfsApiOpr.upload(, );
        try {
            byte[] bytes = file.getBytes();
            //获取原始名
            String originalFilename = file.getOriginalFilename();
            //获取后缀名
            String extName = FilenameUtils.getExtension(originalFilename);
            // "/"+fileIds[0]+"/"+fileIds[1];
            String groupNameAndFileName = FastDfsApiOpr.upload(bytes, extName);
            return AjaxResult.me().setSuccess(true).setMsg("亲,文件上传成功!").setObject(groupNameAndFileName);
        } catch (IOException e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMsg("亲,文件上传失败!"+e.getMessage());
        }
    }



    @RequestMapping(value = "/delete",method = RequestMethod.GET)
    @Override
    public AjaxResult delete(@RequestParam("filePath") String filePath) {
        // filePath:   http://ip/groupName/fileName
        //    /groupName/fileName   groupName/fileName
        String filePath1  =filePath.substring(1);
        String  groupName= filePath1.substring(0, filePath1.indexOf("/"));
        String fileName=filePath1.substring(filePath1.indexOf("/")+1);
        System.out.println("-----"+groupName+fileName);
        int delete = FastDfsApiOpr.delete(groupName, fileName);
        if(delete==0){
            return AjaxResult.me().setSuccess(true).setMsg("删除成功!");
        }else{
            return AjaxResult.me().setSuccess(false).setMsg("删除失败!");
        }
    }

    /**
     * 测试名称拼接
     */
    public static void main(String[] args) {
        String filePath="/group1/M00/00/01/rBAHy1zYO26AEwFyAAB7VaQUqSY146.png";
        //  group1
        //  M00/00/01/rBAHy1zYLluAMw2BAC7Mdh1oFjs624.avi
        String groupName="";
        // filePath.indexOf("0"):第一个字符串出现的索引:从0开始
        // groupName.substring(0, 2):ab  [)==>左闭右开
        // group1/M00/00/01/rBAHy1zYO26AEwFyAAB7VaQUqSY146.png:只有一个参数的时候:从这个开始截取到最后:filePath.substring(1)
        String filePath1  =filePath.substring(1);//   group1/M00/00/01/rBAHy1zYO26AEwFyAAB7VaQUqSY146.png
        // group1
        groupName= filePath1.substring(0, filePath1.indexOf("/"));
        String fileName=filePath1.substring(filePath1.indexOf("/")+1);
    }
}

将这个服务加入zuul网关管理并放入swagger文档中去
在这里插入图片描述
在这里插入图片描述
启动服务你自己的网关地址
访问http://127.0.0.1:9527/swagger-ui/html
或者http://localhost/swagger-ui/html

开启服务顺序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这样,一个简单fastdfs文件系统,修改配置文件,生成api文档就差不多了!TaTa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值