一、前言
FastDFS 分布式文件系统(项目实践:存放图片音视频等静态资源,电商网站静态资源太多,使用分布式文件系统代替传统文件系统)
二、什么是分布式文件系统
2.1 分布式文件系统
定义:文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。
传统文件系统 VS 分布式文件系统
传统文件系统管理的文件就存储在本机。
分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问’
分布式架构=分布式锁+分布式事务+分布式登录(单点登录)+分布式文件系统
分布式文件系统包括:淘宝的FastDFS、谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。
2.2 FastDFS是一个淘宝C语言开发的分布式文件系统
FastDFS
定义:淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统,用纯C语言开发。
功能:文件存储、文件同步、文件访问(上传、下载)、存取负载均衡、在线扩容,五个功能适合有大容量存储需求的应用或系统。
ps:大容量存储需求的应用和系统,也是所有分布式存储的一致需求。
三、FastDFS的架构
3.1 FastDFS架构图
FastDFS架构图
对于上图的解释:
FastDFS两个主要的角色:Tracker Server 和 Storage Server 。
第一,Tracker Server:跟踪服务器,主要负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽。
第二,Storage Server:存储服务器,保存文件和文件的meta data(元数据),每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息
Group:文件组,多台Storage Server的集群。上传一个文件到同组内的一台机器上后,FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。
Tracker Cluster:跟踪服务器的集群,有一组Tracker Server(跟踪服务器)组成。
Storage Cluster :存储集群,有多个Group组成。
3.2 FastDFS上传流程
对于上图的解释:
- Client通过Tracker server查找可用的Storage server。
- Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
- 上传完成,Storage server返回Client一个文件ID,文件上传结束。
3.3 FastDFS下载流程
对于上图的解释:
- Client通过Tracker server查找要下载文件所在的的Storage server。
- Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
- 下载文件成功。
3.4.安装和使用
参考课前资料的:《centos安装FastDFS.md》
3.5 实践:java客户端
余庆先生提供了一个Java客户端,但是作为一个C程序员,写的java代码可想而知。而且已经很久不维护了。
这里推荐一个开源的FastDFS客户端,支持最新的SpringBoot2.0。
配置使用极为简单,支持连接池,支持自动生成缩略图,狂拽酷炫吊炸天啊,有木有。
3.5.1.引入maven依赖
在父工程中,我们已经管理了依赖,版本为:
<fastDFS.client.version>1.26.2</fastDFS.client.version>
因此,这里我们直接引入坐标即可:
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
</dependency>
3.5.2.引入配置类
纯java配置:
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastClientImporter {
}
3.5.3.编写FastDFS配置文件信息
fdfs:
so-timeout: 1501
connect-timeout: 601
thumb-image: # 缩略图
width: 60
height: 60
tracker-list: # tracker地址
- 192.168.56.101:22122
3.5.4.测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = LyUploadService.class)
public class FdfsTest {
@Autowired
private FastFileStorageClient storageClient;
@Autowired
private ThumbImageConfig thumbImageConfig;
@Test
public void testUpload() throws FileNotFoundException {
File file = new File("D:\\test\\baby.png");
// 上传并且生成缩略图
StorePath storePath = this.storageClient.uploadFile(
new FileInputStream(file), file.length(), "png", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
}
@Test
public void testUploadAndCreateThumb() throws FileNotFoundException {
File file = new File("D:\\test\\baby.png");
// 上传并且生成缩略图
StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
new FileInputStream(file), file.length(), "png", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
// 获取缩略图路径
String path = thumbImageConfig.getThumbImagePath(storePath.getPath());
System.out.println(path);
}
}
结果:
group1/M00/00/00/wKg4ZVro5eCAZEMVABfYcN8vzII630.png
M00/00/00/wKg4ZVro5eCAZEMVABfYcN8vzII630.png
M00/00/00/wKg4ZVro5eCAZEMVABfYcN8vzII630_60x60.png
访问第一个路径:
访问最后一个路径(缩略图路径),注意加组名:
FastDFS和HDFS(Hadoop DFS)一起学习,都是
3.5.5.改造上传逻辑
@Service
public class UploadService {
private static final Logger logger = LoggerFactory.getLogger(UploadController.class);
// 支持的文件类型
private static final List<String> suffixes = Arrays.asList("image/png", "image/jpeg");
@Autowired
FastFileStorageClient storageClient;
public String upload(MultipartFile file) {
try {
// 1、图片信息校验
// 1)校验文件类型
String type = file.getContentType();
if (!suffixes.contains(type)) {
logger.info("上传失败,文件类型不匹配:{}", type);
return null;
}
// 2)校验图片内容
BufferedImage image = ImageIO.read(file.getInputStream());
if (image == null) {
logger.info("上传失败,文件内容不符合要求");
return null;
}
// 2、将图片上传到FastDFS
// 2.1、获取文件后缀名
String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
// 2.2、上传
StorePath storePath = this.storageClient.uploadFile(
file.getInputStream(), file.getSize(), extension, null);
// 2.3、返回完整路径
return "http://image.leyou.com/" + storePath.getFullPath();
} catch (Exception e) {
return null;
}
}
}
只需要把原来保存文件的逻辑去掉,然后上传到FastDFS即可。
3.5.6.测试
通过RestClient测试:
3.6.页面测试上传
发现上传成功:
不过,当我们访问页面时:
这是因为我们图片是上传到虚拟机的,ip为:192.168.56.101
因此,我们需要将image.leyou.com映射到192.168.56.101
修改我们的hosts:
再次上传:
四、面试金手指
4.1 FastDFS和HDFS(Hadoop DFS)一起学习
第一,FastDFS和HDFS(Hadoop DFS)一起学习
FastDFS和HDFS(Hadoop DFS)一起学习,都是分布式文件存储系统,都是用于大容量存储需求的应用和系统,使用起来都很简单,面试要吹的话,一定要介绍一下 FastDFS和HDFS 的架构。
第二,为什么要是使用分布式文件系统FastDFS?
FastDFS 分布式文件系统(项目实践:存放图片音视频等静态资源,电商网站静态资源太多,使用分布式文件系统代替传统文件系统)
4.2 分布式文件系统 + FastDFS
4.2.1 分布式文件系统
定义:文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。
传统文件系统 VS 分布式文件系统
传统文件系统管理的文件就存储在本机。
分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问’
分布式架构=分布式锁+分布式事务+分布式登录(单点登录)+分布式文件系统
分布式文件系统包括:淘宝的FastDFS、谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。
4.2.2 FastDFS是一个淘宝C语言开发的分布式文件系统
FastDFS
定义:淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统,用纯C语言开发。
功能:文件存储、文件同步、文件访问(上传、下载)、存取负载均衡、在线扩容,五个功能适合有大容量存储需求的应用或系统。
ps:大容量存储需求的应用和系统,也是所有分布式存储的一致需求。
4.3 FastDFS的架构
4.3.1 FastDFS架构图
FastDFS架构图
对于上图的解释:
FastDFS两个主要的角色:Tracker Server 和 Storage Server 。
第一,Tracker Server:跟踪服务器,主要负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽。
第二,Storage Server:存储服务器,保存文件和文件的meta data(元数据),每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息
Group:文件组,多台Storage Server的集群。上传一个文件到同组内的一台机器上后,FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。
Tracker Cluster:跟踪服务器的集群,有一组Tracker Server(跟踪服务器)组成。
Storage Cluster :存储集群,有多个Group组成。
4.3.2 FastDFS上传流程
对于上图的解释:
- Client通过Tracker server查找可用的Storage server。
- Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
- 上传完成,Storage server返回Client一个文件ID,文件上传结束。
4.3.3 FastDFS下载流程
对于上图的解释:
- Client通过Tracker server查找要下载文件所在的的Storage server。
- Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
- 下载文件成功。
五、小结
FastDFS 分布式文件系统,完成了。
天天打码,天天进步!!!