1. 程式人生 > 實用技巧 >Day08_分散式檔案系統FastDFS研究

Day08_分散式檔案系統FastDFS研究

分散式檔案系統 fastDFS研究

教學目標

1)瞭解分散式檔案系統的概念及應用場景

2)理解fastDFS的工作原理

3)掌握fastDFS存取檔案方法

1 什麼是分散式檔案系統

1.1 技術應用場景

傳智播客擁有大量優質的視訊教程,並且免費提供給使用者去下載,檔案太多如何高效儲存?使用者訪問量大如何保證下載速度?今天講解的分散式檔案系統將解決這些問題。

分散式檔案系統解決了海量檔案儲存傳輸訪問的瓶頸問題,對海量視訊的管理、對海量圖片的管理等。

1.2 什麼是分散式檔案系統

1.2.1什麼是檔案系統

計算機的檔案系統是一種儲存和組織計算機資料的方法,它使得對其訪問和查詢變得容易,檔案系統使用檔案

樹形目錄的抽象邏輯概念代替了硬碟和光碟等物理裝置使用資料塊的概念,使用者使用檔案系統來儲存資料不必關心資料實際儲存在硬碟(或者光碟)的地址為多少的資料塊上,只需要記住這個檔案的所屬目錄和檔名。在寫入新資料之前,使用者不必關心硬碟上的那個塊地址沒有被使用,硬碟上的儲存空間管理(分配和釋放)功能由檔案系統自動完成,使用者只需要記住資料被寫入到了哪個檔案中。

檔案系統通常使用硬碟和光碟這樣的儲存裝置,並維護檔案在裝置中的物理位置。但是,實際上檔案系統也可能僅僅是一種訪問資料的介面而已,實際的資料是通過網路協議(如NFS、SMB、9P等)提供的或者記憶體上,甚至可能根本沒有對應的檔案(如proc檔案系統)。

嚴格地說,檔案系統是一套實現了資料的儲存、分級組織、訪問和獲取等操作的抽象資料型別(Abstract data type)。

總結:檔案系統是負責管理和儲存檔案的系統軟體,它是作業系統和硬體驅動之間的橋樑,作業系統通過檔案系統 提供的介面去存取檔案,使用者通過作業系統訪問磁碟上的檔案。如下圖:

常見的檔案系統:FAT16/FAT32、NTFS、HFS、UFS、APFS、XFS、Ext4等 。

思考:如果沒有檔案系統我們該怎麼管理自己的檔案?

1.2.2 什麼是分散式檔案系統

分散式檔案系統(Distributed File System,DFS)是指檔案系統管理的物理儲存資源不一定直接連線在本地節點上,而是通過計算機網路與節點(可簡單的理解為一臺計算機)相連;或是若干不同的邏輯磁碟分割槽或卷標組合在一起而形成的完整的有層次的檔案系統。DFS為分佈在網路上任意位置的資源提供一個邏輯上的樹形檔案系統結構,從而使使用者訪問分佈在網路上的共享檔案更加簡便。單獨的 DFS共享資料夾的作用是相對於通過網路上的其他共享資料夾的訪問點 。

為什麼會有分佈檔案系統呢?

分散式檔案系統是面對網際網路的需求而產生,網際網路時代對海量資料如何儲存?靠簡單的增加硬碟的個數已經滿足 不了我們的要求,因為硬碟傳輸速度有限但是資料在急劇增長,另外我們還要要做好資料備份、資料安全等。

採用分散式檔案系統可以將多個地點的檔案系統通過網路連線起來,組成一個檔案系統網路,結點之間通過網路進 行通訊,一臺檔案系統的儲存和傳輸能力有限,我們讓檔案在多臺計算機上儲存,通過多臺計算共同傳輸。如下 圖:

好處:

1、一臺計算機的檔案系統處理能力擴充到多臺計算機同時處理。
2、一臺計算機掛了還有另外副本計算機提供資料。
3、每臺計算機可以放在不同的地域,這樣使用者就可以就近訪問,提高訪問速度。

1.3 主流的分散式檔案系統

1、NFS

網路檔案系統(英語:Network File System,縮寫作 NFS)是一種分散式檔案系統,力求客戶端主機可以訪問伺服器端檔案,並且其過程與訪問本地儲存時一樣,它由Sun微系統(已被甲骨文公司收購)開發,於1984年釋出。

它基於開放網路運算遠端過程呼叫(ONC RPC)系統:一個開放、標準的RFC系統,任何人或組織都可以依據標準實現它。

1)在客戶端上對映NFS伺服器的驅動器。
2)客戶端通過網路訪問NFS伺服器的硬碟完全透明。

2、GFS

Google檔案系統(英語:Google File System,縮寫為GFS或GoogleFS),一種專有分散式檔案系統,由Google公司開發,運行於Linux平臺上。儘管Google在2003年公佈了該系統的一些技術細節,但Google並沒有將該系統的軟體部分作為開源軟體釋出。

2013年,Google公佈了Colossus專案,作為下一代的Google檔案系統。

1)GFS採用主從結構,一個GFS叢集由一個master和大量的chunkserver組成。
2)master儲存了資料檔案的元資料,一個檔案被分成了若干塊儲存在多個chunkserver中。
3)使用者從master中獲取資料元資訊,從chunkserver儲存資料。

3、HDSF

Apache Hadoop是一款支援資料密集型分散式應用程式並以Apache 2.0許可協議釋出的開源軟體框架。它支援在商品硬體構建的大型叢集上執行的應用程式。Hadoop是根據谷歌公司發表的MapReduce和Google檔案系統的論文自行實現而成。所有的Hadoop模組都有一個基本假設,即硬體故障是常見情況,應該由框架自動處理。

Hadoop框架透明地為應用提供可靠性和資料移動。它實現了名為MapReduce的程式設計正規化:應用程式被分割成許多小部分,而每個部分都能在叢集中的任意節點上執行或重新執行。此外,Hadoop還提供了分散式檔案系統,用以儲存所有計算節點的資料,這為整個叢集帶來了非常高的頻寬。MapReduce和分散式檔案系統的設計,使得整個框架能夠自動處理節點故障。它使應用程式與成千上萬的獨立計算的電腦和PB級的資料連線起來。現在普遍認為整個Apache Hadoop“平臺”包括Hadoop核心、MapReduce、Hadoop分散式檔案系統(HDFS)以及一些相關專案,有Apache Hive和Apache HBase等等。

1)HDFS採用主從結構,一個HDFS叢集由一個名稱結點和若干資料結點組成。名稱結點儲存資料的元資訊,一個完整的資料檔案分成若干塊儲存在資料結點。

2)客戶端從名稱結點獲取資料的元資訊及資料分塊的資訊,得到資訊客戶端即可從資料塊來存取資料。

1.4 分散式檔案服務提供商

1)阿里的OSS

阿里雲物件儲存服務(Object Storage Service,簡稱OSS),是阿里雲對外提供的海量、安全、低成本、高可靠的雲端儲存服務。您可以通過本文件提供的簡單的REST介面,在任何時間、任何地點、任何網際網路裝置上進行上傳和下載資料。基於OSS,您可以搭建出各種多媒體分享網站、網盤、個人和企業資料備份等基於大規模資料的服務。

2)七牛雲端儲存

3)百度雲端儲存

2 什麼是fastDFS

2.1 fastDSF介紹

FastDFS是用c語言編寫的一款開源的分散式檔案系統,它是由淘寶資深架構師餘慶編寫並開源。FastDFS專為互聯 網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高效能等指標,使用FastDFS很 容易搭建一套高效能的檔案伺服器叢集提供檔案上傳、下載等服務。

為什麼要使用fastDFS呢?

上邊介紹的NFS、GFS都是通用的分散式檔案系統,通用的分散式檔案系統的優點的是開發體驗好,但是系統複雜 性高、效能一般,而專用的分散式檔案系統雖然開發體驗性差,但是系統複雜性低並且效能高。fastDFS非常適合 儲存圖片等那些小檔案,fastDFS不對檔案進行分塊,所以它就沒有分塊合併的開銷,fastDFS網路通訊採用 socket,通訊速度很快。

2.2 fastDSF工作原理

2.2.1 fastDSF架構

FastDFS架構包括 Tracker server和Storageserver。客戶端請求Tracker server進行檔案上傳、下載,通過Tracker server排程最終由Storage server完成檔案上傳和下載。

如下圖:

1)Tracker

Tracker Server作用是負載均衡和排程,通過Tracker server在檔案上傳時可以根據一些策略找到Storage server提 供檔案上傳服務。可以將tracker稱為追蹤伺服器或排程伺服器。

FastDFS叢集中的Tracker server可以有多臺,Tracker server之間是相互平等關係同時提供服務,Tracker server 不存在單點故障。客戶端請求Tracker server採用輪詢方式,如果請求的tracker無法提供服務則換另一個tracker。

2)Storage

Storage Server作用是檔案儲存,客戶端上傳的檔案最終儲存在Storage伺服器上,Storage server沒有實現自己 的檔案系統而是使用作業系統的檔案系統來管理檔案。可以將storage稱為儲存伺服器。

Storage叢集採用了分組儲存方式。storage叢集由一個或多個組構成,叢集儲存總容量為叢集中所有組的儲存容 量之和。一個組由一臺或多臺儲存伺服器組成,組內的Storage server之間是平等關係,不同組的Storage server 之間不會相互通訊,同組內的Storage server之間會相互連線進行檔案同步,從而保證同組內每個storage上的檔案完全一致的。一個組的儲存容量為該組內的儲存伺服器容量最小的那個,由此可見組記憶體儲伺服器的軟硬體配置最好是一致的。

採用分組儲存方式的好處是靈活、可控性較強。比如上傳檔案時,可以由客戶端直接指定上傳到的組也可以由 tracker進行排程選擇。一個分組的儲存伺服器訪問壓力較大時,可以在該組增加儲存伺服器來擴充服務能力(縱向擴容)。當系統容量不足時,可以增加組來擴充儲存容量(橫向擴容)。

3)Storage狀態收集

Storage server會連線叢集中所有的Tracker server,定時向他們報告自己的狀態,包括磁碟剩餘空間、檔案同步 狀況、檔案上傳下載次數等統計資訊。

2.2.2 檔案上傳流程

客戶端上傳檔案後儲存伺服器將檔案ID返回給客戶端,此檔案ID用於以後訪問該檔案的索引資訊。檔案索引資訊 包括:組名,虛擬磁碟路徑,資料兩級目錄,檔名。

  • 組名:檔案上傳後所在的storage組名稱,在檔案上傳成功後有storage伺服器返回,需要客戶端自行儲存。
  • 虛擬磁碟路徑:storage配置的虛擬路徑,與磁碟選項store_path*對應。如果配置了store_path0則是M00, 如果配置了store_path1則是M01,以此類推。
  • 資料兩級目錄:storage伺服器在每個虛擬磁碟路徑下建立的兩級目錄,用於儲存資料檔案。
  • 檔名:與檔案上傳時不同。是由儲存伺服器根據特定資訊生成,檔名包含:源儲存伺服器IP地址、檔案創 建時間戳、檔案大小、隨機數和檔案拓展名等資訊。

2.2.3 檔案下載流程

tracker根據請求的檔案路徑即檔案ID來快速定義檔案。

比如請求下邊的檔案:

1.通過組名,tracker能夠很快的定位到客戶端需要訪問的儲存伺服器組是group1,並選擇合適的儲存伺服器提供客戶端訪問。

2.儲存伺服器根據“檔案儲存虛擬磁碟路徑”和“資料檔案兩級目錄”可以很快定位到檔案所在目錄,並根據檔名找到客戶端需要訪問的檔案。

3 fastDFS入門

3.1 fastDFS安裝與配置

安裝教程參考連結:https://www.cnblogs.com/artwalker/p/13500207.html

3.2 檔案上傳下載測試

3.2.1搭建環境

這裡我們使用javaApi測試檔案的上傳,java版本的fastdfs-client地址在:https://github.com/happyfish100/fastdfs-client-java,參考此工程編寫測試用例。

1)建立maven工程

<?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">
    <parent>
        <artifactId>xc-framework-parent</artifactId>
        <groupId>com.xuecheng</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../xc-framework-parent/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>test-fastdfs</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
        <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>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>

</project>
  1. 配置檔案

在classpath:config下建立fastdfs-client.properties檔案

fastdfs.connect_timeout_in_seconds = 5 #http連線超時時間
fastdfs.network_timeout_in_seconds = 30 #tracker與storage網路通訊超時時間
fastdfs.charset = UTF-8 #字元編碼
fastdfs.tracker_servers = 10.211.55.13:22122 #tracker伺服器地址,多個地址中間用英文逗號分隔

3.2.2 檔案上傳

//上傳檔案
    @Test
    public void testUpload(){

        try {
            //載入fastdfs-client.properties配置檔案
            ClientGlobal.initByProperties("config/fastdfs-client.properties");
            //定義TrackerClient,用於請求TrackerServer
            TrackerClient trackerClient = new TrackerClient();
            //連線tracker
            TrackerServer trackerServer = trackerClient.getConnection();
            //獲取Stroage
            StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
            //建立stroageClient
            StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
            //向stroage伺服器上傳檔案
            //本地檔案的路徑
            String filePath = "d:/logo.png";
            //上傳成功後拿到檔案Id
            String fileId = storageClient1.upload_file1(filePath, "png", null);
            System.out.println(fileId);
            //group1/M00/00/01/wKhlQVuhU3eADb4pAAAawU0ID2Q159.png

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

3.2.3 檔案下載

//下載檔案
    @Test
    public void testDownload() {
        try {
            //載入fastdfs-client.properties配置檔案
            ClientGlobal.initByProperties("config/fastdfs-client.properties");
            //定義TrackerClient,用於請求TrackerServer
            TrackerClient trackerClient = new TrackerClient();
            //連線tracker
            TrackerServer trackerServer = trackerClient.getConnection();
            //獲取Stroage
            StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
            //建立stroageClient
            StorageClient1 storageClient1 = new StorageClient1(trackerServer, storeStorage);
            //下載檔案
            //檔案id
            String fileId = "group1/M00/00/00/CtM3DV82NfuAGyaGAAbISIubyYk709.png";
            byte[] bytes = storageClient1.download_file1(fileId);
            //使用輸出流儲存檔案
            FileOutputStream fileOutputStream = new FileOutputStream(new File("/Users/XinxingWang/Desktop/md文件/學成線上/Day08 課程圖片管理 分散式檔案系統/logo.png"));
            fileOutputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }

3.3 搭建圖片虛擬主機

3.3.1 在storage上安裝Nginx

在 storage server 上安裝 nginx 的目的是對外通過 http 訪問 storage server 上的文 件。使用 nginx 的模組 FastDFS-nginx-module 的作用是通過 http 方式訪問 storage 中 的檔案,當 storage 本機沒有要找的檔案時向源 storage 主機代理請求檔案。

在storage上安裝nginx(安裝FastDFS-nginx-module模組)

3.3.2 配置Nginx圖片服務虛擬機器主機

圖片服務虛擬主機的作用是負載均衡,將圖片請求轉發到storage server上。

通過圖片服務虛擬主機請求圖片流程圖

4 總結

通過本次課程的學習您要達到以下目標:

1)瞭解分散式檔案系統的概念及應用場景

分散式檔案系統是通過網路將單機上的檔案系統組成一個網路檔案系統。 
分散式檔案系統主要應用在大型網際網路專案中,實現圖片儲存、音視訊儲存等服務。 
分散式檔案系統的優點:可以快速擴容儲存,提高檔案訪問速度。

2)理解fastDFS的工作原理

fastDFS由tracker和storage組成,它們都可以部署叢集。
tracker負責排程,storage負責儲存。

3)掌握fastDFS存取檔案方法

客戶端與fastDFS採用socket協議通訊,可以採用官方提供的java版本的fastDSF-client快速開發。

4)能夠動手搭建一個fastDSF檔案伺服器