本篇内容介绍了“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
入门代码:
一、导入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="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.0 http://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 = 5 fastdfs.network_timeout_in_seconds = 30 fastdfs.charset = UTF-8 fastdfs.tracker_servers = 192.168.0.0:22222
三、测试代码
package lianbang.wu.fastDFS; import org.csource.common.MyException; import org.csource.common.NameValuePair; import org.csource.fastdfs.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @SpringBootTest @RunWith(SpringRunner.class) public class FastdfsTest { /** * 文件上传 */ @Test public void testUpload(){ try{ //加载全局配置 ClientGlobal.initByProperties("config/fastdfs_client.properties"); //创建客户端 TrackerClient trackerClient = new TrackerClient(); //连接tracker server TrackerServer trackerServer = trackerClient.getConnection(); if (trackerServer == null){ return; } //获取一个storage server StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer); StorageClient storageClient = new StorageClient(trackerServer, storeStorage); NameValuePair [] list = null; String[] fileId = storageClient.upload_file("C:\\user\\admin\\1.png", "png",list ); System.out.println(fileId); }catch (Exception e){ e.printStackTrace(); } } /** * 文件查询 */ @Test public void testQueryFile() throws IOException, MyException { //加载全局配置 ClientGlobal.initByProperties("config/fastdfs_client.properties"); TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer); StorageClient storageClient = new StorageClient(trackerServer, storeStorage); FileInfo fileInfo = storageClient.query_file_info("group1", "M00/00/01/w.png"); System.out.println(fileInfo); } /** * 文件下载 */ @Test public void testDownloadFile() throws IOException, MyException { //加载全局配置 ClientGlobal.initByProperties("config/fastdfs_client.properties"); TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); StorageClient storageClient = new StorageClient(trackerServer, storageServer); byte[] bytes = storageClient.download_file("group1", "M00/00/01/w.png"); FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/1.png")); fileOutputStream.write(bytes); fileOutputStream.close(); } }
“FastDFS的原理和使用方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。