温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

FastDFS的原理和使用方法

发布时间:2021-06-29 09:59:45 来源:亿速云 阅读:263 作者:chen 栏目:大数据

本篇内容介绍了“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的原理和使用方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI