FastDFS分布式文件系统

分布式文件系统


 

实现图片上传功能,需要图片服务器

 

图片服务器 

如果要实现图片上传功能,需要一台图片服务器(可以不要,但是因为图片上传只能到指定的服务器上,如果不搭建另外一台服务器用于接收图片,则只能上传到正在运行的应用服务器,这样的话,应用服务器的压力将会无限加大)

图片服务器特点

1、存储空间可扩展

2、提供统一的访问方式

3、访问效率高

企业中的图片服务器

1、使用fastDFS分布式文件系统

2、使用nginx反向代理服务器

 

FastDFS

FastDFS(Fast Distributed file system),使用了C语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、横向扩展等机制,并注重高可用、高性能等指标,使用FastDFS可以很容易搭建一套高性能的文件服务器集群,提供文件上传、下载等服务

FastDFS架构

FastDFS架构包括Tracker server和Storage server。由客户端请求Tracker server文件的上传或下载,Tracker server调度Storage server完成文件上传下载。

Tracker server

负载均衡和调度,通过Tracker server调度,通过Tracker server在文件上传时可以根据一些策略找到storage server提供文件上传服务,可以将tracker称为追踪服务器或调度服务器。

Storage server

文件存储,客户端上传的文件最终存储在storage server,storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件,可以将storage称为存储服务器

总结

Tracker server管理集群,收集信息,处理信息,为了保证高可用,可以搭建集群

Storage server保存文件,分为多组,组合组之间的数据不一样,组内成员数据一致,保证数据高可用,可以增加组,达到扩容效果

文件上传流程


其中,file_id指文件索引信息,内包含:组名、虚拟磁盘路径、数据两级目录、文件名,如下图:

  • 组名:文件上传后所在的storage组名,在文件上传成功后有storage服务器返回,需要客户端自行保存
  • 虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应,如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推
  • 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件,两级目录的范围都是00~FF
  • 文件名:与文件上传时不同,是由存储服务器根据特定信息生成,文件名包含:原存储服务器IP、文件创建时间戳、文件大小、随机数和文件拓展名等信息

文件下载流程

 

 

Java操作FastDFS

引入依赖

 
<!--fastdfs-client-->
<dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.25-RELEASE</version>
</dependency>

 

配置fafstdfc_client.conf

tracker_server=192.168.96.253:22122

 

Java步骤

//加载配置文件
Stringconf_filename=this.class().getResource("/fastdfs_client.conf").getPath();
//初始化客户端全局对象
ClientGlobal.init(conf_filename);
//创建存储客户端对象
StorageClientstorageClient=newStorageClient();
//上传文件
String[]arr=storageClient.upload_file("即将上传的文件路径",null);
/**
*访问路径:http://192.168.12.131/group1/M00/00/00/wKgMg1o53fOAL1CRAABonuLw4M4127.jpg
*[group1,M00/00/00/wKgMgFlIkk2AHfnLAABonuLw4M4075.jpg]
*数组中的第一个元素:组的名称
*数组中的第二个元素:远程文件名称
*/

返回的数组中

    第一个元素:组名

    第二个名字:远程名

 

下载

//加载配置文件
Stringconf_filename=this.getClass().getResource("/fastdfs_clien.conf").getPath();
//初始化客户端全局的对象
ClientGlobal.init(conf_filename);
//创建存储客户端对象
StorageClientstorageClient=newStorageClient();
//下载文件
byte[]data=storageClient.download_file("组名","远程文件名");
FileOutputStreamfos=newFileOutputStream(newFile("文件下载存储路径"));
fos.write(data);
fos.flush();
fos.close();

 

删除服务器上图片

//加载配置文件
Stringconf_filename=this.getClass().getResource("/fastdfs_client.conf").getPath();
//初始化客户端全局对象
ClientGlobal.init(conf_filename);
//创建存储客户端对象
storageClientstorageClient=newStorageClient();
//删除文件
intres=storageClient.delete_file("组名","远程文件名");
/*
*如果返回0,则代表成功删除
*/

 

 

 

posted @ 2018-08-03 10:01  T_time  阅读(366)  评论(0编辑  收藏  举报