综合百科

FastDFS的原理和使用方法

文件系统是负责管理和存储文件的系统软件,它是操作系统和硬件驱动之间的桥梁,操作系统通过文件系统提供的接口去存取文件,用户通过操作系统访问磁盘上的文件。

分布式文件系统是面对互联网的需求而产生,互联网时代对海量数据如何存储?靠简单的增加硬盘的个数已经无法满足我们的要求,因为硬盘传输速度有限但是数据在急剧增长,另外我们还要做好数据备份、数据安全等。

采用分布式文件系统可以将多个地点的文件系统通过网络连接起来,组成一个文件系统网格,结点之间通过网络进行通信,一台文件系统的存储和传输能力有限,我们让文件在多台计算机上存储,通过多台计算共同传输。

好处:

1、一台计算机的文件系统处理能力扩充到多台计算机同时处理

2、一台计算机挂了还要另外副本计算机提供给数据

3、每台计算机可以放在不同的地域,这样用户就可以就近访问,提供访问速度

主流的分布式文件系统:NFS,GFS,HDFS,

分布式文件服务提供商:阿里OSS,七牛云,百度云

fastdfs是用C语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用,高性能等指标,使用FastDFS很容易搭建一套高性能等文件服务器集群提供文件上传、下载等服务。与上述主流的分布式文件系统相比,,FastDFS虽然开发体验差,但是系统复杂性低并且性能高,非常适合存储图片等那些小文件,FastDFS不对文件进行分块,所以它就没有分块合并对开销, 网络通信采用socket,通信速度很快。

FastDFS架构

FastDFS架构包括Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。

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

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

Tracker集群

FastDFS集群中的Tracker server可以,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server

采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

Storage集群

Storage集群采用分组存储方式,storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量只和。一个组由一台或多台存储服务器组成,组内的Storage server之间的平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个Storage上的文件完全一致。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。

采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由Tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力。当系统容量不足时,可以增加组来扩充存储容量。

Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状态、文件上传下载次数等统计信息。

文件上传流程:

1、Client发送上传连接请求,给Tracker server

2、Tracker server查询可用storage,并将查询到的信息(Storage的ip和端口)返回给Client

3、Client上传文件到Storage server

4、Storage server生成文件ID,并且存储文件,将文件ID返回给Client

5、Client存储文件ID

注意:文件ID包含组名,虚拟磁盘路径,数据两级目录,文件名

文件下载流程

1、Client发送下载链接请求,给Tracker server

2、Tracker server查询可用Storage,并将查询到的信息(Storage的ip和端口)返回给Client

3、Client发送文件ID,给Storage server

4、Storage server根据文件ID查找文件,并且返回文件内容给Client

入门代码:

一、导入依赖

<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>lianbang.wu</groupId><artifactId>FastDFSDemo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version></parent><dependencies><dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId><version>1.27.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dependency></dependencies></project>

二、配置文件,在类路径下创建fastdfs-client. properties

fastdfs.connect_timeout_in_seconds=5fastdfs.network_timeout_in_seconds=30fastdfs.charset=UTF-8fastdfs.tracker_servers=192.168.0.0:22222

三、测试代码

packagelianbang.wu.fastDFS;importorg.csource.common.MyException;importorg.csource.common.NameValuePair;importorg.csource.fastdfs.*;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;@SpringBootTest@RunWith(SpringRunner.class)publicclassFastdfsTest{/***文件上传*/@TestpublicvoidtestUpload(){try{//加载全局配置ClientGlobal.initByProperties("config/fastdfs_client.properties");//创建客户端TrackerClienttrackerClient=newTrackerClient();//连接trackerserverTrackerServertrackerServer=trackerClient.getConnection();if(trackerServer==null){return;}//获取一个storageserverStorageServerstoreStorage=trackerClient.getStoreStorage(trackerServer);StorageClientstorageClient=newStorageClient(trackerServer,storeStorage);NameValuePair[]list=null;String[]fileId=storageClient.upload_file("C:\\user\\admin\\1.png","png",list);System.out.println(fileId);}catch(Exceptione){e.printStackTrace();}}/***文件查询*/@TestpublicvoidtestQueryFile()throwsIOException,MyException{//加载全局配置ClientGlobal.initByProperties("config/fastdfs_client.properties");TrackerClienttrackerClient=newTrackerClient();TrackerServertrackerServer=trackerClient.getConnection();StorageServerstoreStorage=trackerClient.getStoreStorage(trackerServer);StorageClientstorageClient=newStorageClient(trackerServer,storeStorage);FileInfofileInfo=storageClient.query_file_info("group1","M00/00/01/w.png");System.out.println(fileInfo);}/***文件下载*/@TestpublicvoidtestDownloadFile()throwsIOException,MyException{//加载全局配置ClientGlobal.initByProperties("config/fastdfs_client.properties");TrackerClienttrackerClient=newTrackerClient();TrackerServertrackerServer=trackerClient.getConnection();StorageServerstorageServer=trackerClient.getStoreStorage(trackerServer);StorageClientstorageClient=newStorageClient(trackerServer,storageServer);byte[]bytes=storageClient.download_file("group1","M00/00/01/w.png");FileOutputStreamfileOutputStream=newFileOutputStream(newFile("d:/1.png"));fileOutputStream.write(bytes);fileOutputStream.close();}}

“FastDFS的原理和使用方法”的内容就介绍到这里了,感谢大家的阅读。