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