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,则代表成功删除 */