溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

FastDFS的原理和使用方法

發(fā)布時間:2021-06-29 09:59:45 來源:億速云 閱讀:254 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“FastDFS的原理和使用方法”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

文件系統(tǒng)是負責管理和存儲文件的系統(tǒng)軟件,它是操作系統(tǒng)和硬件驅(qū)動之間的橋梁,操作系統(tǒng)通過文件系統(tǒng)提供的接口去存取文件,用戶通過操作系統(tǒng)訪問磁盤上的文件。

分布式文件系統(tǒng)是面對互聯(lián)網(wǎng)的需求而產(chǎn)生,互聯(lián)網(wǎng)時代對海量數(shù)據(jù)如何存儲?靠簡單的增加硬盤的個數(shù)已經(jīng)無法滿足我們的要求,因為硬盤傳輸速度有限但是數(shù)據(jù)在急劇增長,另外我們還要做好數(shù)據(jù)備份、數(shù)據(jù)安全等。

采用分布式文件系統(tǒng)可以將多個地點的文件系統(tǒng)通過網(wǎng)絡(luò)連接起來,組成一個文件系統(tǒng)網(wǎng)格,結(jié)點之間通過網(wǎng)絡(luò)進行通信,一臺文件系統(tǒng)的存儲和傳輸能力有限,我們讓文件在多臺計算機上存儲,通過多臺計算共同傳輸。

好處:

1、一臺計算機的文件系統(tǒng)處理能力擴充到多臺計算機同時處理

2、一臺計算機掛了還要另外副本計算機提供給數(shù)據(jù)

3、每臺計算機可以放在不同的地域,這樣用戶就可以就近訪問,提供訪問速度

主流的分布式文件系統(tǒng):NFS,GFS,HDFS,

分布式文件服務(wù)提供商:阿里OSS,七牛云,百度云

FastDFS是用C語言編寫的一款開源的分布式文件系統(tǒng)。FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負載均衡、線性擴容等機制,并注重高可用,高性能等指標,使用FastDFS很容易搭建一套高性能等文件服務(wù)器集群提供文件上傳、下載等服務(wù)。與上述主流的分布式文件系統(tǒng)相比,,F(xiàn)astDFS雖然開發(fā)體驗差,但是系統(tǒng)復(fù)雜性低并且性能高,非常適合存儲圖片等那些小文件,F(xiàn)astDFS不對文件進行分塊,所以它就沒有分塊合并對開銷, 網(wǎng)絡(luò)通信采用socket,通信速度很快。

FastDFS架構(gòu)

FastDFS架構(gòu)包括Tracker server和Storage server??蛻舳苏埱骉racker server進行文件上傳、下載,通過Tracker server調(diào)度最終由Storage server完成文件上傳和下載。

Tracker server作用是負載均衡和調(diào)度,通過Tracker server在文件上傳時可用根據(jù)一些策略找到Storage server提供文件上傳服務(wù)??梢詫racker稱為追蹤服務(wù)器或調(diào)度服務(wù)器。

Storage server作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務(wù)器上,Storage server沒有實現(xiàn)自己的文件系統(tǒng)而是利用操作系統(tǒng)的文件系統(tǒng)來管理文件??梢詫torage稱為存儲服務(wù)器。

Tracker集群

FastDFS集群中的Tracker server可以,Tracker server之間是相互平等關(guān)系同時提供服務(wù),Tracker server不存在單點故障??蛻舳苏埱骉racker server

采用輪詢方式,如果請求的tracker無法提供服務(wù)則換另一個tracker。

Storage集群

Storage集群采用分組存儲方式,storage集群由一個或多個組構(gòu)成,集群存儲總?cè)萘繛榧褐兴薪M的存儲容量只和。一個組由一臺或多臺存儲服務(wù)器組成,組內(nèi)的Storage server之間的平等關(guān)系,不同組的Storage server之間不會相互通信,同組內(nèi)的Storage server之間會相互連接進行文件同步,從而保證同組內(nèi)每個Storage上的文件完全一致。一個組的存儲容量為該組內(nèi)存儲服務(wù)器容量最小的那個,由此可見組內(nèi)存儲服務(wù)器的軟硬件配置最好是一致的。

采用分組存儲方式的好處是靈活、可控性較強。比如上傳文件時,可以由客戶端直接指定上傳到的組也可以由Tracker進行調(diào)度選擇。一個分組的存儲服務(wù)器訪問壓力較大時,可以在該組增加存儲服務(wù)器來擴充服務(wù)能力。當系統(tǒng)容量不足時,可以增加組來擴充存儲容量。

Storage server會連接集群中所有的Tracker server,定時向他們報告自己的狀態(tài),包括磁盤剩余空間、文件同步狀態(tài)、文件上傳下載次數(shù)等統(tǒng)計信息。

文件上傳流程:

1、Client發(fā)送上傳連接請求,給Tracker server

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

3、Client上傳文件到Storage server

4、Storage server生成文件ID,并且存儲文件,將文件ID返回給Client

5、Client存儲文件ID

注意:文件ID包含組名,虛擬磁盤路徑,數(shù)據(jù)兩級目錄,文件名

文件下載流程

1、Client發(fā)送下載鏈接請求,給Tracker server

2、Tracker server查詢可用Storage,并將查詢到的信息(Storage的ip和端口)返回給Client

3、Client發(fā)送文件ID,給Storage server

4、Storage server根據(jù)文件ID查找文件,并且返回文件內(nèi)容給Client

入門代碼:

一、導(dǎo)入依賴

<?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>

二、配置文件,在類路徑下創(chuàng)建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");
            //創(chuàng)建客戶端
            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的原理和使用方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI