什么是FastDFS
- FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
使用FASTDFS的公司有:
支付宝,京东商城,赶集网,淘米网,迅雷,UC等等。
FastDFS架构
- FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Trackerserver调度最终由Storage server完成文件上传和下载。
- Trackerserver作用是负载均衡和调度,通过Trackerserver在文件上传时可以根据一些策略找到Storageserver提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。
- Storageserver作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。
文件上传流程
- 客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
FastDFS原理
- 存储节点采用了分组(group)的方式。存储系统由一个或多个group组成,group与group之间的文件是相互独立的,所有group的文件容量累加就是整个存储系统中的文件容量。一个group可以由一台或多台存储服务器组成,一个group下的存储服务器中的文件都是相同的,group中的多台存储服务器起到了冗余备份和负载均衡的作用。在group中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加group。只需要增加一台或多台服务器,并将它们配置为一个新的group,这样就扩大了存储系统的容量。
- FastDFS只有两个角色:Tracker server和Storage server。Tracker server作为中心结点,其主要作用是负载均衡和调度。Tracker server在内存中记录分组和Storage server的状态等信息,不记录文件索引信息,占用的内存量很少。
Docker安装FastDFS
-
用Docker搜索FastDFS相关镜像
docker search fastdfs
-
拉取相关镜像、
docker pull ygqygq2/fastdfs-nginx -
根据镜像创建容器,运行tracker服务 22122
docker run -d --network=host --name tracker -v /usr/local/fdfs/tracker:/var/fdfs ygqygq2/fastdfs-nginx tracker
说明: --network=host表示容器和宿主机共享同一个网络和端口。
-v:表示容器和宿主机映射一个数据卷
-d:后台运行 -
根据镜像创建容器,运行storage服务Nginx服务 23000
docker run -d --network=host --name storage0 -e TRACKER_SERVER=192.168.189.137:22122 -v /usr/local/fdfs/storage0:/var/fdfs ygqygq2/fastdfs-nginx storage
因为storage中Nginx默认端口号是8080,我们宿主机中已有一个tomcat启动,所以导致nginx启动失败,解决办法修改Ngxin的端口为80,然后进入到storage容器启动nginx。
cd /usr/local/nginx/sbin
./nginx -
第二次启动tracker和srorage服务
1.先查询以往运行过的所有容器,找到这个两个服务
docker ps -a
2.找到对应的对应的服务后,根据ID启动
docker start a8da2539e996
3.如有需要进入到容器中进行相关操作
docker exec -i -t a8da2539e996 /bin/bash
SpringBoot整合FastDFS
- 添加依赖
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.1-RELEASE</version>
</dependency>
- 导入配置
@SpringBootApplication(scanBasePackages = "com.qf")
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class ShopBackApplication {
public static void main(String[] args) {
SpringApplication.run(ShopBackApplication.class, args);
}
}
- application.properties中配置
#上传的超时时间
fdfs.connect-timeout=10000
#连接超时时间
fdfs.so-timeout=10000
#缩略图生成参数
fdfs.thumb-image.height=100
fdfs.thumb-image.width=100
#TrackerList参数,支持多个
fdfs.tracker-list[0]=192.168.189.137:22122
#FastDFS服务器的路径
fastdfspath=http://192.168.189.137:8080/
- 上传文件Controller
@Controller
public class CommonController {
@Value("${fastdfspath}")
private String fastdfspath;
@Autowired
private FastFileStorageClient ffsc;
@ResponseBody
@RequestMapping(value = "/uploadFile")
public String uploadFile(MultipartFile file){
System.out.println(file);
//截取源图片的后缀
String originalFilename = file.getOriginalFilename();
int index = originalFilename.lastIndexOf(".");
String houzhui = originalFilename.substring(index + 1);
String uploadFile = "";
try {
StorePath storePath = ffsc.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), houzhui, null);
uploadFile = storePath.getFullPath();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("file:"+fastdfspath+uploadFile);
return fastdfspath+uploadFile;
}
}