FastDFS
1.什么是 FastDFS
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
2.fastdfs的实现原理
fastdfs实现分组和集群,通过组间集群,实现存储空间的动态扩容,组内集群,实现内容的备份。
fastdfs架构包括 Tracker server 和 Storage server。Storage Server:文件存储服务器,文件最终存储的物理位置;Tracker Server:追踪调度服务器,他需要进行负载均衡,计算可用的Storage Server,以及监控Storage Server的健康状态,每次都需要给客户端返回可用的Storage Server。
使用fastdfs进行文件上传时,需要做的事情:
- Storage Server 向Tracker Server, 汇报当前存储节点的状态信息(包括磁盘剩余空间、文件同步状况等统计信息)
- 客户端程序连接Tracker Server发给上传请求
- Tracker Server计算可用的Storage Server 节点,返回
- 客户端将文件上传到Storage Server,并获取返回的file_id(包括路径信息和文件名称)
- 客户端保存请求地址
3.如何使用fastdfs?
3.1导入pom文件
<!--fastdfs文件存储-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.7</version>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>
3.2导入yaml文件
fdfs:
so-timeout: 1500
connect-timeout: 600
#缩略图生成参数
thumb-image:
width: 150
height: 150
#TrackerList参数,支持多个
tracker-list: 192.168.136.160:22122
web-server-url: http://192.168.136.160:8888/
3.3 代码实现
/**
* 1 将封面上传到fastdfs,返回imgURL
* 2 将视频上传到fasrdfs,返回videoURL
* @param videoThumbnail
* @param videoFile
*/
public void saveVideos(MultipartFile videoThumbnail, MultipartFile videoFile) throws IOException {
//上传图片
InputStream imgInputStream = videoThumbnail.getInputStream();
long imgSize = videoThumbnail.getSize();
String imgExtName = videoThumbnail.getOriginalFilename().substring(videoThumbnail.getOriginalFilename().lastIndexOf('.') + 1);
StorePath imgStorePath = client.uploadFile(imgInputStream, imgSize, imgExtName, null);
String imgURL = webServer.getWebServerUrl()+imgStorePath.getFullPath();
//上传视频
InputStream videoInputStream = videoFile.getInputStream();
long videoSize = videoFile.getSize();
String videoExtName = videoFile.getOriginalFilename().substring(videoFile.getOriginalFilename().lastIndexOf('.') + 1);
StorePath videoStorePath = client.uploadFile(videoInputStream, videoSize, videoExtName, null);
String videoURL = webServer.getWebServerUrl()+videoStorePath.getFullPath();
}