千家信息网

FastDFS的原理和使用方法

发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,本篇内容介绍了"FastDFS的原理和使用方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!文件系统
千家信息网最后更新 2024年11月12日FastDFS的原理和使用方法

本篇内容介绍了"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

入门代码:

一、导入依赖

    4.0.0    lianbang.wu    FastDFSDemo    1.0-SNAPSHOT            org.springframework.boot        spring-boot-starter-parent        2.0.4.RELEASE                            net.oschina.zcx7878            fastdfs-client-java            1.27.0.0                            org.springframework.boot            spring-boot-starter-test                            org.apache.commons            commons-io            1.3.2            

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

fastdfs.connect_timeout_in_seconds = 5fastdfs.network_timeout_in_seconds = 30fastdfs.charset = UTF-8fastdfs.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的原理和使用方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0